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

2019-07-21 03:05发布

为什么读数据时会多读一个字节?怎么解决这个问题?(具体情况看图片)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
edmund1234
1楼-- · 2019-07-21 05:07
肖涛xiao 发表于 2019-4-11 10:47
是不是stop要写在最后一个接收的字节之前,ACK/NOACK要写在每一个接受的字节之前?像我这样写对吗?

I ...

I2C1->DR = Address;
while ((I2C1->SR1&0x0002) != 0x0002);                // 等待ADDR

__disable_irq();
temp = I2C1->SR2;                                                        // Clr ADDR Flag
I2C1->CR1 &= CR1_ACK_Reset;                                        // 清ACK
__enable_irq();
while ((I2Cx->SR1 & 0x00004) != 0x000004);        // 等待BTF

__disable_irq();         
I2C_GenerateSTOP(I2C1, ENABLE);                                // Stop
temp[0] = I2C1->DR;                                                //        读       
__enable_irq();

temp[1] = I2C1->DR;                                                //        读       
while ((I2Cx->CR1&0x200) == 0x200);                 // STOPF

I2C1->CR1  |= CR1_ACK_Set;
I2C1->CR1  &= CR1_POS_Reset;
edmund1234
2楼-- · 2019-07-21 10:17
接收一个字节, 与两个字节, 或多于两个字节的流程是不一样的
如果只是接收一个字节, 要在完成Device address(即收到ADDR)后, 清ACK标志位, 设Stop, 之后等Rxne后读数据
肖涛xiao
3楼-- · 2019-07-21 11:11
edmund1234 发表于 2019-4-10 17:42
接收一个字节, 与两个字节, 或多于两个字节的流程是不一样的
如果只是接收一个字节, 要在完成Device ad ...

那接收两个或两个以上的字节呢?
edmund1234
4楼-- · 2019-07-21 15:33
肖涛xiao 发表于 2019-4-10 18:24
那接收两个或两个以上的字节呢?

接收两个是, 发完地址, 等ADDR, reset Ack,等BTF, Set Stop, 读DR, Dealy1~2us 再读DR
edmund1234
5楼-- · 2019-07-21 16:20
接收5个Byte, 发完地址, 等ADDR, 等BTF, 接收1~3个Byte, set stop,  读DR(4), 等RXNE, 读DR(5)
肖涛xiao
6楼-- · 2019-07-21 20:16
edmund1234 发表于 2019-4-10 19:24
接收5个Byte, 发完地址, 等ADDR, 等BTF, 接收1~3个Byte, set stop,  读DR(4), 等RXNE, 读DR(5)

不明白你们所说的等ADDR,等BTF,等RXNE是指的什么。set stop是发送结束信号吗?如果是那么之后从设备就不会再往外发送数据了,sda线会维持高电平状态。接收5个字节的数据为什么需要先接收1~3个字节,再接收第4、第5个字节?

一周热门 更多>