jicheng0622

【学习笔记】为什么I2C从机地址要左移一位

0
阅读(8713)

    对许多刚开始接触I2C的新手来说,最开始比较疑惑,当MCU做主机与一些I2C接口的从机(比如一些数字传感器,大多数仍为I2C接口)通信时,无论是用IO模拟I2C协议还是使用I2C模块,在发送从机地址时为什么都需要将从机手册的I2C地址左移一位发出去呢?当然这个问题是比较初级的了,高手直接略过,新手权且简单看一看作为学习资料吧。

    首先以飞思卡尔Kinetis系列为例(咳咳,好多人估计都快吐了,肿么又是Kinetis,俺也木有办法,谁让俺天天就接触这个了,呵呵),我们先看看I2C模块的地址寄存器如下图,这个比较直接明了,即本身地址寄存器就是高八位有效的,所以我们在写入从机地址时肯定需要左移一位再写进去,但是又有人要问了,为啥做成左对齐的格式呢(俺们都是习惯了右对齐啊),咳咳,那我们只能忍一忍继续往下看。

image

    好了,首先恭喜你坚持下来继续往下看,呵呵,先上图,该图为I2C的时序图,这个图更为直接的解释了左对齐地址及左移一位的原因,首先I2C的从机地址时MSB先发送的,所以需要左对齐,其次I2C时序中第8位即LSB使其R/W即读写控制位,这下又明了了吧,这也就是为什么我们在读写I2C从机时都会左移一位然后或上一个读写位了,如果不左移,后果你们都懂的,呵呵。

image

    其实说到这,本篇文章应该就该收尾结束了,但是我想提醒的是,现在包括飞思卡尔官方或者第三方都提供了比较完善的I2C驱动库(或者MQX下的I2C驱动),其驱动里面已经做好了移位及读写控制操作,所以我们在调用函数接口时传递I2C从机地址时只需要把从机手册中的I2C地址直接填进去即可,我们不需要自己先左移好地址在传递过去,这样的话传的地址就不对了。之所以最后提醒一句就是之前的确有用户遇到这样的问题了,最后花了很长时间才发现是自己预移一位造成从机地址错误了。好,就聊到这了,电脑搞的都快没电了,俺电脑电池还是比较扛的啊,连续写了三篇,电池刚刚好,看来自己还是比较有分寸的,哈哈,未完待续~