使用STM8L的硬件I2C(四)硬件I2C的使用注意
其他系列文章请参见:
(一)硬件I2C的简介
(二)硬件I2C的事件和检测
(三)硬件I2C中断读写(流程及代码)
使用STM8L的硬件I2C时,有几个点要注意:
-
I2C的初始化
时钟的使能操作必须在其他I2C设置之前,否则设置不生效CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE);
-
Slave地址的设置
这一点让人困扰,花了不少时间才搞清楚。
是因为标准库函数I2C_Send7bitAddress()并不会帮助你左移。
这个左移动作必须由用户完成,如下:I2C_Send7bitAddress(I2C1, _i2c_dev.addr << 1, I2C_Direction_Transmitter);实现并不会帮助左移
-
Read流程的关闭
因为使用硬件I2C,处理速度较快。要预先在下一数据接收前完成Nack和Stop设置。
中断和Polling模式都要处理,特别是中断必须处理。中断模式下可以如下操作:EV5:送Slave地址(Read) EV6:如果仅需读取字节数n=1,则直接关Ack并发送Stop,n>=2,则不做动作 EV7:先读数据,然后判断剩余字节n,如果n=1,则关Ack并发送Stop,如n=0,则关中断
其实本质就是必须要提前1个字节做好准备动作(清Ack、开Stop)。
-
超时处理
要是地址错误或者其他总线错误会导致总线挂起停止响应,所以应用层上最好做超时处理。 -
I2C_IT_ERR和SR2处理
开启了I2C_IT_ERR中断时,SR2中会存储错误码供处理。
最简单的处理就是将SR2清楚,重置为0。