对于很多刚开始接触I2C的新手来说,MCU很好奇,当主机与部分I2C接口的从属端(例如部分数字传感器,大部分仍然是I2C接口)通信时,在使用IO模拟I2C协议或使用I2C模块时,在传输机器地址时,为什么要从机器手册的I2C地址向左移动一个位置。(威廉莎士比亚、Northern Exposure(美国电视剧)、Northern Exposure(美国电视剧))当然,这个问题比较初级。请直接省略高手,新手权力简单地看一下,作为学习资料。(大卫亚设)。
首先以飞思卡尔Kinetis系列为例我们先看看I2C模块的地址寄存器如下图,这个比较直接明了,即本身地址寄存器就是高八位有效的,所以我们在写入从机地址时肯定需要左移一位再写进去,但是又有人要问了,为啥做成左对齐的格式呢(都是习惯了右对齐啊),咳咳,那我们只能忍一忍继续往下看。
好了,首先恭喜你坚持下来继续往下看,呵呵,先上图,该图为I2C的时序图,这个图更为直接的解释了左对齐地址及左移一位的原因,首先I2C的从机地址时MSB先发送的,所以需要左对齐,其次I2C时序中第8位即LSB使其R/W即读写控制位,这下又明了了吧,这也就是为什么我们在读写I2C从机时都会左移一位然后或上一个读写位了,如果不左移,后果你们都懂的,呵呵。
其实说到这,本篇文章应该就该收尾结束了,但是我想提醒的是,现在包括飞思卡尔官方或者第三方都提供了比较完善的I2C驱动库(或者MQX下的I2C驱动),其驱动里面已经做好了移位及读写控制操作,所以我们在调用函数接口时传递I2C从机地址时只需要把从机手册中的I2C地址直接填进去即可,我们不需要自己先左移好地址在传递过去,这样的话传的地址就不对了。之所以最后提醒一句就是之前的确有用户遇到这样的问题了,最后花了很长时间才发现是自己预移一位造成从机地址错误了。
阅读本文用了: 分秒,转发只需1秒
❀转载是一种智慧❀分享是一种美德❀