- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
函数库接口
I2C_Comm_MasterSend
返回参数 ::void
函数参数:
端口:I2Cx
从设备地址:slave_addr
从设备偏移量:offset
发送数据的内容:pBuffer
发送数据的长度:length
函数意义:从某个端口向slave_addr这个从设备发送数据pBuffer,并写入它的偏移量offset开始的地方。如果从设备没有偏移量,则offset取值0xffffffff。
I2C_Comm_MasterReceive
返回参数:void
函数参数:
端口:I2Cx
从设备地址:slave_addr
从设备偏移量:offset
接收数据存放的地方:pBuffer
接收数据的长度:length
函数意义:从某个端口向slave_addr这个从设备的偏移量offset的地方读取数据,放到pBuffer指定的地方。
I2C_Comm_SlaveReceive
返回参数:void
函数参数:
端口:I2Cx
接收到的偏移量:pOffset
接收数据存放的地方:pBuffer
数据长度:length
函数意义:从某个端口接收到length个数据放到从pBuffer开始,偏移量为*pOffset的地方。
I2C_Comm_SlaveSend
返回参数:void
函数参数:
端口:I2Cx
接收到的偏移量:pOffset
发送数据存放的地方:pBuffer
数据长度:length
函数意义:从某个端口接发出放在pBuffer的偏移量pOffset开始的地方length个数据。
注意1:对于Slave函数来说,pBuffer始终指向的是它存放所有数据的总地址,真正要发送时,是从pBuffer开始的*pOffset开始的地方取出的数据;接受数据时,也是放到从pBuffer开始的*pOffset开始的地方。另外一个参数pOffset也是从master传过来的,不管Slave是要接收还是发送数据,这个偏移量都是master来指定的。
注意2:当使用STM32作为主设备时,如果对方从设备是类似E2PROM的器件,对其读写操作时,在“从设备偏移量Offset”这个参数指明;如果对方是比如另外一个MCU的I2C端口,双方只是通过I2C传递数据,那么“从设备偏移量Offset”这个参数可以指明0xff。但是这样的通信协议,需要对方MCU知道,以处理收到的无效偏移量。
注意3:当使用STM32作为从设备时,对方主设备应该是MCU。需要对方MCU知道,需要发送“偏移量”这个参数来满足通信协议。
通信协议如下:
通信过程 事件/寄存器描述
关于I2C总线的控制:
正常情况下,初始化I2C对应GPIO后,总线SDASCK都处于高电平。从主设备发出START位开始,总线进入通信状态(BUSY@SR2被硬件置位),知道主设备发出STOP位,总线又恢复空闲状态(BUSY@SR2被硬件清零)。
异常情况:
主设备在通信过程中(不管是MasterSender还是MasterReceiver),因为异常重启,也就是没有发送STOP。则SCK保持低,会导致I2C时钟一旦使能,BUSY@SR2马上被硬件置位。这样的话,再想进行I2C通信,则不能成功。
[Solution:]
(1)重新发送STOP,可以使得SCK恢复高电平。
或者软件置位SWRST@CR1,等SCK恢复高电平了,再清零(2)SWRST@CR1
主设备接收通信过程中,如果没有正确发出NAK,则SDA将保持低电平。
[什么叫做没有正确发出NAK:在while和中断方式下,没有在合时的地方清零ACK@CR1;在DMA方式下,没有在合时的地方置位LAST@CR2]
[Solution:]
板子断电
关掉I2C APB时钟,恢复GPIO功能,将SDA推高,再重新使能I2C。
…
注释1:如果I2C总线上还有其他主设备,可能会造成争抢对总线的控制,从而带来总线仲裁的问题。因此,这里可以不发送Stop,而是直接发送ReStart,以免是否总线。
注释2:为什么会有0x20010(BUSY+STOPF)的情况。
当I2C2接收DMA完成后,处理TC中断。在这个过程中,I2C1这个主设备发出的STOP出现在总线上。即在I2C2还没有退出TC中断时,STOPF已经置位,对应中断挂起位也被置位。于是,在I2C2退出TC中断后,又因为STOPF进入中断,在这个过程中,因为I2C1发出STOP后,马上进入check阶段,又开始总线通信,所以在I2C2看来,BUSY也被置位了。于是,I2C2会有个SR28|SR1=0x20010(BUSY+STOPF)的情况。
注释3:中线虚线-红色:数据传输阶段;
中线虚线-绿色:check阶段。
这是为了统一作为接收的对方是一般性的MCU的I2C接口,还是E2PR
文档评论(0)