F0的I2C与F103不同,Slave I2C接口协议采用寄存器访问的格式。
(1)I2C初始化
void IIC_Slavemode_Init(u8 debug, u8 addr)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
if(debug == 1) return;
//---------------------------- GPIO pins configuration ------------------
/* I2C Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* Configure the I2C clock source. The clock is derived from the HSI */
//RCC_I2CCLKConfig(RCC_I2C1CLK_HSI); //RCC_I2C1CLK_SYSCLK
// Enable I2C1 SCL and SDA Pin Clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
//PA10:SDA PA9:SCL
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
// Set GPIO frequency to 50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// Select Alternate function mode
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//Select output Open Drain type
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
// Disable internal Pull-up
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
GPIO_Init((GPIO_TypeDef*)GPIOA, &GPIO_InitStructure);
// Connect PXx to I2C_SCL I2C_SDA PA10:SDA PA9:SCL meilh 201024 GPIO_AF_1->GPIO_AF_4
GPIO_PinAFConfig((GPIO_TypeDef*)GPIOA,GPIO_PinSource9,GPIO_AF_4);
GPIO_PinAFConfig((GPIO_TypeDef*)GPIOA,GPIO_PinSource10,GPIO_AF_4);
//---------------------------- Deinitialize I2C1 clock ------------------
// Reset I2C1 device clock in order to avoid non-cleared error flags
//RCC_APB1PeriphResetCmd((RCC_APB1Periph_I2C1),ENABLE);
//RCC_APB1PeriphResetCmd((RCC_APB1Periph_I2C1),DISABLE);
//I2C1 Configuration
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
I2C_InitStructure.I2C_DigitalFilter = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_OwnAddress1 = addr<<1;
//I2C_InitStructure.I2C_Timing = 0x10805D88;//0x50E30000;//0x20D22E37;//slave: 0x20D20000;
I2C_Cmd(I2C1,ENABLE);
I2C_Init(I2C1, &I2C_InitStructure);
I2C_ITConfig(I2C1, I2C_CR1_ADDRIE | I2C_CR1_STOPIE | I2C_CR1_TXIE | I2C_CR1_RXIE, ENABLE); //meilh 20171025 remove I2C_CR1_ERRIE|I2C_CR1_NACKIE|
//---------------------------- Peripheral and DMA interrupts Initialization ------------------
// Initialize I2C1 interrupts
/* Configure NVIC for I2C1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = I2C1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
要注意的地方是:GPIO_PinAFConfig((GPIO_TypeDef*)GPIOA,GPIO_PinSource9,GPIO_AF_4);
之前看例子是用的 GPIO_AF_1,I2C死活没反应,后来找厂家提供了一个可以跑的例子比较寄存器,发现此地方要用GPIO_AF_4,就正常工作了。
(2)中断处理接口
void I2C1_IRQHandler(void)
{
__IO uint32_t I2CFlagStatus = 0x00000000;
uint8_t data;
I2CFlagStatus = (uint32_t)(I2C1->ISR & (uint16_t)0x0000100FE);
if ((I2CFlagStatus & I2C_ISR_ADDR) != 0)
{
if(I2C1->ISR&I2C_ISR_DIR) //tx mode
{
Tx_count = 0;
I2C1->ISR |= I2C_ISR_TXE;
I2C1->ICR |= I2C_ICR_ADDRCF;
}
if((I2C1->ISR&I2C_ISR_DIR)==0) //rx mode
{
Rx_buffer[0] = 0;
Rx_count= 1;
I2C1->ICR |= I2C_ICR_ADDRCF;
}
}
else if ((I2CFlagStatus & I2C_ISR_RXNE) != 0)
{
data = I2C_ReceiveData(I2C1);
if(Rx_count < Rx_MAX){
Rx_buffer[Rx_count++] = data ;
if(Rx_count == 2){
reg_offset = Rx_buffer[1];
}
}
}
else if ((I2CFlagStatus & I2C_ISR_TXIS) != 0)
{
I2C_SendData(I2C1,Tx_buffer[reg_offset+Tx_count]);
Tx_count++;
if(Tx_count >= Tx_MAX)
{
Tx_count = 0; //tx ok
}
}
else if ((I2CFlagStatus & I2C_ISR_STOPF) != 0)
{
I2C1->ICR |= I2C_ICR_STOPCF;
Rx_buffer[0] = Rx_count;
Rx_count = 0;
Tx_count = 0;
}
}
F0的I2C状态判断比较容易,不过可能也因为使用的频率低暂未发现问题,后来F103也仿照这个形式进行了修改。
其它就没什么好说的,自己根据自己的协议接口进行修改。
上一篇:STM32F4 开发笔记2: IO输出的设置
下一篇:stm32——串口1和串口2初始化
推荐阅读
史海拾趣
随着电子行业的不断发展,市场竞争也日益激烈。面对行业的变革和挑战,AverLogic公司及时调整战略,加大在研发和创新方面的投入,以适应市场的变化。同时,公司还积极开拓新的应用领域,如智能家居、自动驾驶等,以寻求新的增长点。这些战略调整不仅帮助公司应对了市场的挑战,也为其未来的发展奠定了坚实的基础。
AverLogic公司在电子行业中以其技术创新和产品突破而崭露头角。在早期的发展阶段,公司专注于研发高质量的视频处理芯片,以满足市场对于更高清晰度和更流畅视频播放的需求。经过多次实验和迭代,公司成功推出了一款具有革命性的转换器产品——AL110,这款产品能够将PC和Macintosh的VGA信号转换为高品质的NTSC或PAL信号,从而极大地提升了视频信号的处理效率和输出品质。这一创新不仅为公司赢得了市场的认可,也为公司在电子行业中奠定了坚实的基础。
在1956年的一个晴朗午后,E-Z-HOOK的创始人阿尔伯特·史密斯(化名)在实验室里遇到了一个棘手的问题。他正在测试一个复杂的电子系统,但发现现有的测试工具无法满足他的需求。于是,他动手设计并制造出了第一个E-Z-HOOK测试钩,这个简单但实用的工具极大地方便了他的工作。史密斯看到了这个产品的巨大潜力,于是决定成立一家公司来专门生产这种测试钩。这就是E-Z-HOOK公司的起源。
随着全球对环保意识的提高,Eska公司积极响应并融入环保理念。公司采用再生纸作为原材料,制造灰板纸,有效减少了资源浪费和环境污染。同时,Eska的造纸过程也注重节能减排,每生产一顿纸板所需的水量非常少。此外,公司还拥有自己的加热和发电站,所产出的电力和蒸汽供应自给自足,进一步减少了对环境的破坏。
EMMICRO公司自创立之初,就致力于在电子微芯片领域进行技术创新。公司研发团队不断突破技术瓶颈,成功研发出具有高性能、低功耗的芯片产品,填补了市场的空白。通过不断的创新和技术迭代,EMMICRO的芯片产品在市场上赢得了广泛的认可,并逐渐树立起品牌的知名度和影响力。
EXCELSEMI公司自创立之初,就致力于半导体技术的研发与创新。在早期,公司研发团队成功攻克了高性能半导体材料的生产技术难题,这一技术突破为公司后续的产品开发奠定了坚实基础。随着技术的不断进步,EXCELSEMI在半导体芯片设计、制造和封装等领域都取得了显著成果,逐渐在市场中崭露头角。
开关电源设计1 电子产品,特别是军用稳压电源的设计是一个系统工程,不但要考虑电源本身参数设计,还要考虑电气设计、电磁兼容设计、热设计、安全性设计、三防设计等方面。因为任何方面那怕是最微小的疏忽,都可能导致整个电源的崩溃,所以我们应充分认 ...… 查看全部问答∨ |
摘 要: 随着低功耗!可移动个人无线通信的发展和CMOS工艺性能的提高,用CMOS工艺实现无线通信系统的射频前端不仅必要而且可能.本文讨论了用CMOS工艺实现射频集成电路的特殊问题.首先介绍各种收发器的体系结构,对它们的优缺点进行比较,指出在设 ...… 查看全部问答∨ |
[qq]188383251[/qq]采用6*7方型LED点阵模块,比较漂亮。所有资料来源于网络,传些PP给大家看看 希望熟悉软件的朋友,开源自己的软件设计~~ 附:0730LED点阵电子钟设计方案 现在DS18B20价格贵,大家其实可以申请样片,如果特别需要的话,这个器件是 ...… 查看全部问答∨ |
|
//检查连接线RXD跟TXD是否短路 uint32 Device_HasShortBetweenTxdRxd(uint8* acCheckSelfQueryPacket, uint32 nPacketLen) { //自身连接线检查 uint8 acBuffer[4]; &n ...… 查看全部问答∨ |
单片机控制步进电机选型的问题~用什么片子好点~大侠们推荐一下 谢谢了! 我想做一个单片机控制步进电机的板子 大侠们给我推荐一些比较实惠的芯片啊~网上找的是各人说各人的好处~小弟初来咋到~先谢谢各位拉!!!… 查看全部问答∨ |
有资料说“2407的片外扩展程序空间 和 数据空间最大都只能是32K字,再多了也是浪费。” 但是,F2407用仿真器仿真的时候,一般是用的是F2407片外的RAM存储器,这个时候MP/MC引脚应该是高电平。reset后dsp从外部程序空间的0000H开始执行。这样不是 ...… 查看全部问答∨ |
|
设计资源 培训 开发板 精华推荐
- Microchip有奖问答 | 新品 MCU 独立于内核的外设(CIP)技术解密
- 有奖直播 | “PCIM Asia 2024” ROHM 展位线上直播
- 免费测评|涂鸦三明治Wi-Fi&BLE 开发板
- 【边分享,边成长,11月有奖】EEWORLD优秀主题/回复第16期活动开始拉
- 报名赢京东卡 | 国产FPGA安路科技2024线上新品发布会
- ST直播主题:高度灵活的、易用的、可定制化的协议栈--BlueNRG-LP 协议栈介绍
- EEWORLD社区版主公开招募ing
- 抢先体验!免费试用LM3S8962 评估套件!(10.13~11.30)
- 3月26日上午10:00直播:开拓IoT社会 尼吉康的新蓄电装置
- 【双11特别推荐】新产品,新方案,#TI“芯”世界#之电机驱动器