stm32 iic协议在读字节时最后会多读一个字节

2019-07-21 03:05发布

为什么读数据时会多读一个字节?怎么解决这个问题?(具体情况看图片)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
edmund1234
1楼-- · 2019-07-21 23:25
 精彩回答 2  元偷偷看……
肖涛xiao
2楼-- · 2019-07-22 03:55
edmund1234 发表于 2019-4-10 19:41
ADDR,BTF,RXNE 都是 I2C->SR1的标志位

最后一个数据要NACK, 告诉从机, 我写完了, 但这个清除ACK标 ...

是不是stop要写在最后一个接收的字节之前,ACK/NOACK要写在每一个接受的字节之前?像我这样写对吗?

I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));       

I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Receiver );
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

I2C_AcknowledgeConfig(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
tmp[0] = I2C_ReceiveData(I2C1);       
       
I2C_GenerateSTOP(I2C1,ENABLE );
       
I2C_AcknowledgeConfig(I2C1,DISABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
tmp[1] = I2C_ReceiveData(I2C1);               
肖涛xiao
3楼-- · 2019-07-22 08:12
edmund1234 发表于 2019-4-11 11:19
I2C1->DR = Address;
while ((I2C1->SR1&0x0002) != 0x0002);                // 等待ADDR

__disable_irq();
__enable_irq();
这两句话是干什么用的?
edmund1234
4楼-- · 2019-07-22 08:13
 精彩回答 2  元偷偷看……

一周热门 更多>