一、简单说明
本例子参考了ST官方历程,官方历程的链接如下
http://www.st.com/content/st_com ... /stsw-stm32094.html
关于i2c的协议这里就不做描述了
关于STM32 i2c的模式可以在中文数据手册中查看
手册中已经描述,该模块默认工作在从模式,要想变为主模式,主要生产一个起始条件。(主模式的代码可以参考野火开发板的硬件i2c历程,本例子中也是使用野火开发板硬件i2c作为主机的)
二、i2c从机的配置
- [cpp] view plain copy
- I2C_DeInit(I2C1);
- /* I2C1 configuration ------------------------------------------------------*/
- I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//模式
- I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
- I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;//这个就是作为从机的地址,一定要配置正确
- I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
- I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//7位的地址
- I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
- I2C_Init(I2C1, &I2C_InitStructure);
复制代码 上面配置注意的就是从机地址,这就是主机要查询的从机地址
三、i2c从机中断的配置
- [cpp] view plain copy
- /* Configure and enable I2Cx event interrupt -------------------------------*/
- NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- /* Configure and enable I2C1 error interrupt -------------------------------*/
- NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
- NVIC_Init(&NVIC_InitStructure);
复制代码 标准库中的i2c一共有两个中断
一个是事件中断(EV_IRQ)和一个错误中断(ER_IRQ)
EV_IRQ的中断只要响应EV1 EV2 EV4 之类的,后面会说明
ER_IRQ的中断只要响应没有应答和起始和停止条件出错等
四、使能中断
- [cpp] view plain copy
- /* Enable I2C1 event and buffer interrupts */
-
- I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
-
- /* Enable I2C1 Error interrupts */
-
- I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);
复制代码 使能了I2C1的这三个中断,每个中断的作用下面说明
五、中断处理函数
注意:i2c中断中不要printf打印信息,否则会出错
主要是参考了官方的历程,然后自己再调整一下逻辑即可使用。
最后的效果感觉还是挺稳定的,这篇文章主要是给大家抛砖引玉的作用,也记录一下自己调试几天的成果。
ST官网的历程还是挺多的,没遇到的知识可以去官网找找。
转载自酱油师兄
|