ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:217.36KB ,
资源ID:9373648      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9373648.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DMA方式实现的I2C通信库.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DMA方式实现的I2C通信库.docx

1、DMA方式实现的I2C通信库1. 函数库接口a) I2C_Comm_MasterSendi. 返回参数 ::voidii. 函数参数:1. 端口:I2Cx 2. 从设备地址:slave_addr3. 从设备偏移量:offset4. 发送数据的内容:pBuffer5. 发送数据的长度:lengthiii. 函数意义:从某个端口向slave_addr这个从设备发送数据pBuffer,并写入它的偏移量offset开始的地方。如果从设备没有偏移量,则offset取值0xffffffff。b) I2C_Comm_MasterReceivei. 返回参数:voidii. 函数参数:1. 端口:I2Cx2.

2、 从设备地址:slave_addr3. 从设备偏移量:offset4. 接收数据存放的地方:pBuffer5. 接收数据的长度:lengthiii. 函数意义:从某个端口向slave_addr这个从设备的偏移量offset的地方读取数据,放到pBuffer指定的地方。c) I2C_Comm_SlaveReceivei. 返回参数:voidii. 函数参数:1. 端口:I2Cx2. 接收到的偏移量:pOffset3. 接收数据存放的地方:pBuffer4. 数据长度:lengthiii. 函数意义:从某个端口接收到length个数据放到从pBuffer开始,偏移量为*pOffset的地方。d)

3、I2C_Comm_SlaveSendi. 返回参数:voidii. 函数参数:1. 端口:I2Cx2. 接收到的偏移量:pOffset3. 发送数据存放的地方:pBuffer4. 数据长度:lengthiii. 函数意义:从某个端口接发出放在pBuffer的偏移量pOffset开始的地方length个数据。注意1:对于Slave函数来说,pBuffer始终指向的是它存放所有数据的总地址,真正要发送时,是从pBuffer开始的*pOffset开始的地方取出的数据;接受数据时,也是放到从pBuffer开始的*pOffset开始的地方。另外一个参数pOffset也是从master传过来的,不管Sla

4、ve是要接收还是发送数据,这个偏移量都是master来指定的。注意2:当使用STM32作为主设备时,如果对方从设备是类似E2PROM的器件,对其读写操作时,在“从设备偏移量Offset”这个参数指明;如果对方是比如另外一个MCU的I2C端口,双方只是通过I2C传递数据,那么“从设备偏移量Offset”这个参数可以指明0xff。但是这样的通信协议,需要对方MCU知道,以处理收到的无效偏移量。注意3:当使用STM32作为从设备时,对方主设备应该是MCU。需要对方MCU知道,需要发送“偏移量”这个参数来满足通信协议。通信协议如下:2. 通信过程 3. 关于I2C总线的控制:a) 正常情况下,初始化I

5、2C对应GPIO后,总线SDA&SCK都处于高电平。从主设备发出START位开始,总线进入通信状态(BUSYSR2被硬件置位),知道主设备发出STOP位,总线又恢复空闲状态(BUSYSR2被硬件清零)。b) 异常情况:i. 主设备在通信过程中(不管是MasterSender还是MasterReceiver),因为异常重启,也就是没有发送STOP。则SCK保持低,会导致I2C时钟一旦使能,BUSYSR2马上被硬件置位。这样的话,再想进行I2C通信,则不能成功。Solution:(1)重新发送STOP,可以使得SCK恢复高电平。或者软件置位SWRSTCR1,等SCK恢复高电平了,再清零(2)SWR

6、STCR1ii. 主设备接收通信过程中,如果没有正确发出NAK,则SDA将保持低电平。什么叫做没有正确发出NAK:在while和中断方式下,没有在合时的地方清零ACKCR1;在DMA方式下,没有在合时的地方置位LASTCR2Solution:(1) 板子断电(2) 关掉I2C APB时钟,恢复GPIO功能,将SDA推高,再重新使能I2C。iii. 注释1:如果I2C总线上还有其他主设备,可能会造成争抢对总线的控制,从而带来总线仲裁的问题。因此,这里可以不发送Stop,而是直接发送ReStart,以免是否总线。注释2:为什么会有0x20010(BUSY+STOPF)的情况。当I2C2接收DMA完

7、成后,处理TC中断。在这个过程中,I2C1这个主设备发出的STOP出现在总线上。即在I2C2还没有退出TC中断时,STOPF已经置位,对应中断挂起位也被置位。于是,在I2C2退出TC中断后,又因为STOPF进入中断,在这个过程中,因为I2C1发出STOP后,马上进入check阶段,又开始总线通信,所以在I2C2看来,BUSY也被置位了。于是,I2C2会有个SR2 slave : stop位在ACK后,slave的该标志位可以置位;Solution可以用Stop中断来结束DMA传输。这样的话,代码流程会有变化:由于DMA transfer size初始化成了最大值,所以代码到不了DMA TC中断

8、了。由于没有“接收完最后一个数据后的ISR,就不会有在那个ISR过程中stopf置位,退出中断,在进入时check阶段开始,busy又置位的情况”。于是0x20010(busy+stopf) + 0x20002(busy+ADDR)+0x10(stopf)的序列变成:0x10(stopf) + 0x20002(busy+ADDR)+0x10(stopf)。所以0x10 case要做相应修改。流程图中,灰色框表示改变的部分。Master - slave: stop位在NAK后,slave的该标志位不被置位。Solution在NAK中断结束DMA传输,反正没有check阶段。同样,所以代码到不了DMA TC中断了。在i2c2_err_isr()的NAK case中,添加结束代码。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1