STM32F103 I2C硬件缺陷详述及解决方案

STM32F103 I2C硬件缺陷详述及解决方案

记得刚开始接触STM32单片机的时候,就从很多地方听说STM32F103的硬件I2C是有缺陷的,但是当时在网上查了很久也没有查到具体的缺陷是什么,后面在工作中正好有相关问题,在经过一段时间深入了解后,写下这篇文章来盘一盘硬件I2C的缺陷。

I2C的协议中规定,在传输数据时,接收方在接收到数据后都会向发送方发出一个响应信号ACK,如果传输双方有一个是主接收器,它必须在不产生时钟的最后一个字节发出一个NACK,来告知发送器此次数据传输过程结束,如下图所示:

I2C中的ACK信号为一个低电平,NACK信号为高电平,软件流程中,只要不是最后一个数据,在主接收器接收到数据后默认都会发出去一个ACK信号,那么问题来了,当主接收器在接受到最后一个字节后,I2C的主发送器发送出去一个ACK信号会导致什么样的结果发生呢?

此时,总线上的从发送器收到ACK,以为还要继续发送数据,所以将SDA拉住等待主机的时钟继续发送数据,而主接收器呢,因为自身已经接收到最后一个字节数据,所以不会继续向从机发送时钟,导致SDA一直被从机拉住无法释放,整个通信陷入死锁。从逻辑分析仪上抓取的波形表现可以很清楚的看到现象:

代码如下:

uint32_t I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)

{

while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_BUSY));

/* Send START condition */

I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);

/* Test on EV5 and clear it */

while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT));

/* Send EEPROM address for write */

I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter

相关手记

菠菜365定位 桐柏英雄(同名小說)

桐柏英雄(同名小說)

10-15 👁️ 1307
菠菜365定位 简单有深意的微信个性签名 看完就想保存的微信签名
365APP 古人不吃牛肉

古人不吃牛肉

10-09 👁️ 8081
beat365手机版客户端ios 不会选日子?老黄历和万年历该信哪个?
beat365手机版客户端ios 身家过百亿,却和妻儿住宿舍,老母在家种田
365APP 阴阳师椒图连线后恢复多少生命值 逢魔密信椒图技能涓流恢复生命值答案