OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4416|回复: 1

通过IIC标准协议,主机由从机读取多个字节相关问题

[复制链接]

5

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2021-8-13
在线时间
4 小时
发表于 2022-4-30 20:39:24 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 changing 于 2022-6-5 18:34 编辑

IIC协议,主机从从机读取NumByteToRead个字节数据,这段参考程序,我咋分析着和标准IIC有些出入呢。
如果NumByteToRead=2的话,当从机向主机传输最后一个数据时,按照这段程序分析,一开始主机就产生停止信号了,既然主机产生停止信号了,那接下来从机为啥还能把最后一个数据传输给主机呢?


微信图片_20220430203546.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

10

帖子

0

精华

新手上路

积分
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);函数,重新配置为主机接收到一个字节后返回应答信号。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 01:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表