大前提,我这里是操作mpu6050,如果是操作eeprom是没有问题的,基本随便怎么干都没问题,操作mpu6050有问题的朋友可以过来看看, 这里在硬件iic上前前后后花费了很多的时间和功夫,中间也遇到各种问题也解决了各种问题,我硬件iic都已经用到了dma去操作了,dma操作,或者是硬件iic操作有点好处就是外设自己的发数过程中,不占cpu的,这时候别的中断进来了,可以去跑cpu运算,总的来看cpu效率很高,模拟的就不是了,
我从一般的硬件iic到中断,到dma里面的全都做过了,其实单独跑,没有别的中断,没有别的任务去干扰它,那跑几天都没有一点的问题,当有了别的任务,别的高优先级的中断之后,问题就比较多了,各种奇葩奇怪的问题,有时候竟然就是替换一个配置函数的顺序就能解决了,有时候又是打断它的中断函数时间过长了(30us中断来打断硬件iic算中断时间过长了会导致和mpu工作的iic出问题,这里注意是mpu6050)然后我把打断iic的中断我分段了,每个都是20us多,可以跑一下午了,但是如果后面只是因为多加了一些判别句在里面,居然也会导致硬件iic一会之后死掉,如果不加,它也能跑好几天不死,至少我是跑过一下午等等的,
总结一句就是硬件iic操作的时候,很多你看似逻辑没有问题的操作,可能哪里就影响到它的硬件iic了,
于是于是今天上午换了模拟iic,模拟iic的速度要自己去调,但是调好了也是挺快的,操作mpu6050可以被中断打断,我这里实验的是被32.5us的10khz的中断打断,工作到现在没出问题,下午继续观察观察,
这里告诉一些朋友,仅供参考,硬件iic慎用,因为很多时候我遇到问题了,总是能通过一些手段去解决,譬如是打断iic的中断时间过长,我缩减时间,(实际上我iic用的dma,多数据收发时候,其他的中断打不断的,这里我也解释不清楚的,看iic时序和模拟的很不一样,是压根没有打断的部分存在的)但是总是出些问题,总是去擦屁股不好弄,
我一开始很坚信st的硬件iic没有bug,毕竟也是,很多说有bug的人都是人云亦云,自己没有尝试就去随大流这么说,我这里前前后后在硬件iic琐碎估计也有半年时间了,半年时间了我也写了很多硬件iic的函数,但是切记一点,我目前的经验就是,如果单独的硬件iic,或者中断里面优先级最高,或者没有多任务,多操作的话,st的硬件iic工作的很完美,但是多任务多操作之后,使用dma的iic有时候也是很完美,但是这只是个表象和开始,会有很多意想不到的问题出现,大家慎用
|