使用可靠的I2C代码

现有的STM32的I2C代码,由于没有使用STM32官方推荐的DMA+I2C中断优先级最高的方式,总感觉用着不放心。想要修改,却又不知道如何改是更好地。于是想查找I2C驱动部分处理的好的代码,参照将现有I2C部分程序重构下。在查找了一些代码库文件后,比对了现有的I2C程序,发现EFM32的I2C库代码部分处理的很完备。使用的是硬件I2C+超时处理机制。而且超时处理也有适当的处理。有可能是EFM32的库代码出的时间较晚是2012.11月份的,写的比较完善。但是STM32却没有更新固件库,提高代码的安全性。
虽然现有的STM32固件库有超时处理,但是调用的函数是一个while(1)也即,如果出现了超时处理,就要进入死循环了。而EFM32的处理则要明显好得多。EFM32在进行超时处理,重新初始化了I2C,并且返回错误。从这一点看,STM32的参考代码只适合功能性实现,如果用于产品中,产品则会陷入不知觉的死机中,而且很难查找到。而EFM32的库代码用于产品代码中,则会更安全一些。
最后,对于在产品中出现的硬件操作代码,对于从设备的操作,一定要有超时处理。虽然一般情况下,很难出现什么问题,但是如果存在这样的概率,当批量后就会有一个死机的概率,虽然出现的概率很低,但是如果一个产品出现了,对于这个产品本身而言就是100%的不良品。而且,由于外界的影响,所有的产品都会有可能出现死机,这个问题很严重。虽然,可以通过外部看门狗来解决,使CPU自动重启。但是在多任务应用中,这样的处理并非简单。甚至有可能十分复杂。
最后,在底层中一定不要存在

while(condition)
{
    ;
}

如果要用,也要加上超时处理:

while(condition)
{
    if(timeout) 
    {
         handle;
         break;
    }
}
(当然,也有不得不用的时候,这样的机会很少)。
最近一个项目需要做I2C的slave,在opencores.org上面找到了一个I2C代码,不过是master的。 下载来看看,发现里面有一个I2C slave的行为级代码。 于是自己根据这个代码改写了一个I2C slave RTL的代码,并修改了原来那个设计的testbench,将rtl的Slave替换了原来的behavior的Slave,在modelsim里面作了前仿,完全通过。还有一个myram.v文件,是一个register file,和slave相连,存储数据用的。 用synplify做综合,使用x3s400-4的器件,占用LUT<100,速度接近200MHz。性能比较优化。 代码做了详尽的注释,语言采用verilog,并且写了仿真的脚本。解压了直接运行simbehav.bat就可以了。如果modelsim安装的时候注册了环境变量(path),脚本调用modelsim,输入run -all即可看到仿真结果。 虽然不是很复杂,不过对于广大需要做I2C的RTL slave的工程师来说,还是很有参考价值的。 1、 设计流程 将I2C slave的行为模型改为rtl模型。 进行等效仿真,直到波形一致,通过timing check,数据正确。 再进行rtl优化设计 2、 注意要点 a) 时钟的设计 b) 对于restart condition的时序是否正确 c) 3、 进度 a) 11-12:initial状态的bitcnt不对,需要认真比对/设计 b) 11-13:initial基本解决(sda_in的问题)。Sda三态冲突,原因不明。比对原设计 c) 11-14:sda三态冲突解决,原因为sda在初始化时没有将sda_oen赋值(由sm赋值,但是sm没有做async reset)。同时注意verilog的大小写敏感。 d) 11-15:仿真出现错误:read出来的数据非期望值。写入逻辑完全正确。Read时由于sda_oe在sm中有一个cycle_pulse的延迟,导致了mem_do[7]串行移出时错位。在更改了sm的代码风格后再研究解决方法。 e) 11-16:仿真完全匹配波形。计划:优化结构,提高稳定性sm改为每个时钟打一下。 关于I2C的SDA三态转换: Master在发送完第8个bit后随后将sda释放(posedge后大概1/4 scl周期),此时slave需要在第九个bit对应的scl的posedge拉低sda。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值