对许多刚开始接触I2C的新手来说,最开始比较疑惑,当MCU做主机与一些I2C接口的从机(比如一些数字传感器,大多数仍为I2C接口)通信时,无论是用IO模拟I2C协议还是使用I2C模块,在发送从机地址时为什么都需要将从机手册的I2C地址左移一位发出去呢?当然这个问题是比较初级的了,高手直接略过,新手权且简单看一看作为学习资料吧。
首先以飞思卡尔Kinetis系列为例(咳咳,好多人估计都快吐了,肿么又是Kinetis,俺也木有办法,谁让俺天天就接触这个了,呵呵),我们先看看I2C模块的地址寄存器如下图,这个比较直接明了,即本身地址寄存器就是高八位有效的,所以我们在写入从机地址时肯定需要左移一位再写进去,但是又有人要问了,为啥做成左对齐的格式呢(俺们都是习惯了右对齐啊),咳咳,那我们只能忍一忍继续往下看。
<img id="aimg_gRnhQ" class="zoom" height="161" file="http://files.chinaaet.com/images/blog/2015/06/24/11466518242657.png" border="0" alt="" />
好了,首先恭喜你**下来继续往下看,呵呵,先上图,该图为I2C的时序图,这个图更为直接的解释了左对齐地址及左移一位的原因,首先I2C的从机地址时MSB先发送的,所以需要左对齐,其次I2C时序中第8位即LSB使其R/W即读写控制位,这下又明了了吧,这也就是为什么我们在读写I2C从机时都会左移一位然后或上一个读写位了,如果不左移,后果你们都懂的,呵呵。 |