新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2021-8-13
- 在线时间
- 4 小时
|

楼主 |
发表于 2022-6-5 20:55:43
|
显示全部楼层
以NumByteToRead=2为例进行理解。复合IIC通信格式如下:
STM32产生起始信号->STM32发送设备地址(写信号)->EEPROM发送应答信号->STM32发送要读取的寄存器地址->EEPROM发送应答信号->STM32产生起始信号->STM32发送设备地址(读信号)->EEPROM发送应答信号->EEPROM向STM32发送DATA1->STM32发送应答信号->EEPROM向STM32发送DATA2->STM32发送非应答信号->STM32产生停止信号
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx)
{
return (uint8_t)I2Cx->DR;
}
在RxNE=1-数据寄存器非空-条件下(因此需要调用I2C_CheckEvent函数),接收到的数据被拷贝到DR中,在接收到下一个字节之前读出DR,即可实现连续的数据传输,摘自《STM32F10X英文参考手册26.6.5》。
针对此疑问,如果NumByteToRead=2的话,当从机向主机传输最后一个数据时,按照这段程序分析,一开始主机就产生停止信号了,既然主机产生停止信号了,那接下来从机为啥还能把最后一个数据传输给主机呢?个人理解如下
执行完*pBuffer = I2C_ReceiveData(EEPROM_I2Cx);之后,STM32发送应答信号(前面配置的,此处不用再配置),之后,EEPROM会向STM32发送最后一个数据,此时进入if(NumByteToRead == 1),进入之前,数据就已经由EEPROM发送到STM32了,根据标准协议,下一步进行STM32发送非应答信号及产生停止信号过程。 while(NumByteToRead) 循环之后的 I2C_AcknowledgeConfig(EEPROM_I2Cx, ENABLE);函数,重新配置为主机接收到一个字节后返回应答信号。 |
|