找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2079|回复: 0
打印 上一主题 下一主题
收起左侧

Stm32 I2c分析

[复制链接]
跳转到指定楼层
楼主
ID:114945 发表于 2016-4-18 15:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
许多将STM32微控器应用到实际项目中的开发人员发现,I2c接口存在工作不稳定的现象,比如经常出现传输失败或陷入死循环,原因在于:stm32的硬件i2c时序不能被中断!
根据ST所给出的建议对i2c接口中断优先级进行修改使用,确实可以避免这个问题.
但若将i2c总线接口的中断优先级改至最高,那便意味着使用了i2c中断的潜入系统中,其余的中断服务将有可能被i2c中断所嵌套,这种霸道的处理方式很显然无法适用于所有的i2c总线应用场合.
而若使用i2c的DMA模式,则会显著提升应用程序的开发难度,同时i2c接口的灵活性大大降低!
I2c外设:
某些软件事件必须在发送当前字节之前处理
问题描述:
如果没有在传输当前字节之前处理EV7,EV7_1,EV6_1,EV2,EV8和EV3事件,有可能产生问题,如收到一个额外字节,两次读到相同的数据或丢失数据.
暂时解决办法:
当不能再传输当前字节之前和改变ACK控制位送出相应脉冲之前,处理EV7,EV7_1,EV6_1,EV2,EV8和EV3事件时,建议如下操作:
①使用i2c的DMA模式,除非作为主设备时只接受一个字节.
②使用i2c的中断并把它的优先级设置最高,使得他不能被中断.
但是,
使用I/O来模拟i2c总线时序是一种很常见的做法.
但是相对于硬件i2c,在实时性和传输速度上会带来无法避免的下降,但i2c总线本身就不是一种速度很快的总线(最高400khz),同时也不需要具备很高的实时性能.相比之下,使用stm32的I/O口模拟i2c时序完全可以满足大部分场合的需求,并且移植性更佳,因此许多开发人员更倾向于使用模拟i2c总线接口.

24c04,100KHZ(2.5v) 和400KHZ(5v)兼容
页面写周期典型值为2ms

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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