2019-07-21 03:05发布
肖涛xiao 发表于 2019-4-11 10:47 是不是stop要写在最后一个接收的字节之前,ACK/NOACK要写在每一个接受的字节之前?像我这样写对吗? I ...
edmund1234 发表于 2019-4-10 17:42 接收一个字节, 与两个字节, 或多于两个字节的流程是不一样的 如果只是接收一个字节, 要在完成Device ad ...
肖涛xiao 发表于 2019-4-10 18:24 那接收两个或两个以上的字节呢?
edmund1234 发表于 2019-4-10 19:24 接收5个Byte, 发完地址, 等ADDR, 等BTF, 接收1~3个Byte, set stop, 读DR(4), 等RXNE, 读DR(5)
最多设置5个标签!
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;
如果只是接收一个字节, 要在完成Device address(即收到ADDR)后, 清ACK标志位, 设Stop, 之后等Rxne后读数据
那接收两个或两个以上的字节呢?
接收两个是, 发完地址, 等ADDR, reset Ack,等BTF, Set Stop, 读DR, Dealy1~2us 再读DR
不明白你们所说的等ADDR,等BTF,等RXNE是指的什么。set stop是发送结束信号吗?如果是那么之后从设备就不会再往外发送数据了,sda线会维持高电平状态。接收5个字节的数据为什么需要先接收1~3个字节,再接收第4、第5个字节?
一周热门 更多>