为什么I2C从机地址要左移一位
2017-02-23 20:37
302 查看
对许多刚开始接触I2C的新手来说,最开始比较疑惑,当MCU做主机与一些I2C接口的从机(比如一些数字传感器,大多数仍为I2C接口)通信时,无论是用IO模拟I2C协议还是使用I2C模块,在发送从机地址时为什么都需要将从机手册的I2C地址左移一位发出去呢?当然这个问题是比较初级的了,高手直接略过,新手权且简单看一看作为学习资料吧。
首先以飞思卡尔Kinetis系列为例(咳咳,好多人估计都快吐了,肿么又是Kinetis,俺也木有办法,谁让俺天天就接触这个了,呵呵),我们先看看I2C模块的地址寄存器如下图,这个比较直接明了,即本身地址寄存器就是高八位有效的,所以我们在写入从机地址时肯定需要左移一位再写进去,但是又有人要问了,为啥做成左对齐的格式呢(俺们都是习惯了右对齐啊),咳咳,那我们只能忍一忍继续往下看。
好了,首先恭喜你坚持下来继续往下看,呵呵,先上图,该图为I2C的时序图,这个图更为直接的解释了左对齐地址及左移一位的原因,首先I2C的从机地址时MSB先发送的,所以需要左对齐,其次I2C时序中第8位即LSB使其R/W即读写控制位,这下又明了了吧,这也就是为什么我们在读写I2C从机时都会左移一位然后或上一个读写位了,如果不左移,后果你们都懂的,呵呵。
其实说到这,本篇文章应该就该收尾结束了,但是我想提醒的是,现在包括飞思卡尔官方或者第三方都提供了比较完善的I2C驱动库(或者MQX下的I2C驱动),其驱动里面已经做好了移位及读写控制操作,所以我们在调用函数接口时传递I2C从机地址时只需要把从机手册中的I2C地址直接填进去即可,我们不需要自己先左移好地址在传递过去,这样的话传的地址就不对了。之所以最后提醒一句就是之前的确有用户遇到这样的问题了,最后花了很长时间才发现是自己预移一位造成从机地址错误了
首先以飞思卡尔Kinetis系列为例(咳咳,好多人估计都快吐了,肿么又是Kinetis,俺也木有办法,谁让俺天天就接触这个了,呵呵),我们先看看I2C模块的地址寄存器如下图,这个比较直接明了,即本身地址寄存器就是高八位有效的,所以我们在写入从机地址时肯定需要左移一位再写进去,但是又有人要问了,为啥做成左对齐的格式呢(俺们都是习惯了右对齐啊),咳咳,那我们只能忍一忍继续往下看。
好了,首先恭喜你坚持下来继续往下看,呵呵,先上图,该图为I2C的时序图,这个图更为直接的解释了左对齐地址及左移一位的原因,首先I2C的从机地址时MSB先发送的,所以需要左对齐,其次I2C时序中第8位即LSB使其R/W即读写控制位,这下又明了了吧,这也就是为什么我们在读写I2C从机时都会左移一位然后或上一个读写位了,如果不左移,后果你们都懂的,呵呵。
其实说到这,本篇文章应该就该收尾结束了,但是我想提醒的是,现在包括飞思卡尔官方或者第三方都提供了比较完善的I2C驱动库(或者MQX下的I2C驱动),其驱动里面已经做好了移位及读写控制操作,所以我们在调用函数接口时传递I2C从机地址时只需要把从机手册中的I2C地址直接填进去即可,我们不需要自己先左移好地址在传递过去,这样的话传的地址就不对了。之所以最后提醒一句就是之前的确有用户遇到这样的问题了,最后花了很长时间才发现是自己预移一位造成从机地址错误了
相关文章推荐
- ARM 为什么地址线要偏移一位接
- ARM 为什么地址线要偏移一位接
- 为什么PPC连接flash的时候地址线和数据线都反着接?
- 解决为什么内网不能用公网地址访问内网服务器
- I2C之知(五)--I2C总线的10bit地址以及通用广播地址
- 阿里云 解决为什么不能使用公网IP地址访问部署的nginx项目
- I2C总线上拉电阻--为什么要
- 关于802.11帧格式中为什么会有三个(或四个)地址?
- [RK3288][Android6.0] 调试笔记 --- I2C地址的确定
- 为什么要有地址对齐和结构体大小
- 为什么下面的程序要a b c的地址赋给指针p p1 p2?
- 5.常见i2c地址_修改i2c速率
- 试说明IP地址与物理地址的区别。为什么要使用这两种不同的地址。
- I2C器件的从设备地址设置
- 数组名地址为什么和数组第一个元素的地址不同?
- At24lc512存储器访问内部地址方法---i2c通信获取
- 有了MAC层地址,为什么还要有IP地址?
- 为什么事件或者消息通常被组织为“队列”?而游戏中可视化对象通常被组织为“list,map,tree"等非物理地址连续的结构?
- 关于 主机号全为0和1 为什么是保留地址
- 为什么数组可以不加“&”取它的地址,而普通变量必须要加“& ”才可以呢?