I2C总线发展史
怎么在一条串口线上连接多个设备呢?
由于速度同步线是由主机实时发出的,所以主机可以按需求修改通信速度,这样在一条线上可以挂接不同速度的器件,单片机和性能差的器件通信,就输出较慢的脉冲信号,和高性能芯片通信,就输出高速脉冲信号。
这条速度同步线被称为SCL时钟线
原来的串口线被称为SDA数据线
学习一种协议,用于所有I2C器件上
因为有地址保留所以只能连接111个器件
芯片的地址并不是由厂商随意写的,而是要得到飞利浦公司的授权
I2C硬件连接
还要为SCL和SDA线添加上拉电阻
I2C器件的所有接口必须是开漏模式(I2C器件的SCL和SDA必须是开漏模式),各自器件没有上拉或下拉电阻,如果每个器件内部都添加上拉电阻,当把大量的器件连在一起,上拉电阻的阻值也会累加,就对单片机IO端口的电流输出能力有很高的要求,最终也会影响到通信速度和稳定性。
事先将地址设置引脚连接到Vdd或GND上,这样才能确定器件的地址编码
各器件可以使用同一个电源也可以使用不同的电源
上拉电阻使无信号时线上为高电平
如何传递数据内容
SCL派上用场了
Hz变化频率决定通信总速度
单片机可以利用这个休息时间把下一个要发送的数据准备好
单片机让出控制权
如果是默认的高电平就代表无应答,从设备没有收到数据,或者说收到了,但是数据是错误的
没有问题的话,SDA就会连接到GND使SDA输出低电平
总之就是谁接收谁应答
要确定第一个工作区间在哪?
在第一个工作期间之前加一个 (起始位),再在最后一个工作期间后面,加入一个(结束位),也叫停止位
想出这个起始位和停止位的人是天才
完整时序图
来研究数据内容层面的东西
接下来是读数据
如何标出本次通信是接收(读)还是发送(写)
读操作是从设备将向单片机发送数据
写操作是是单片机向从设备发送数据
下面是出现的一个新问题
像从设备每次读/写多个数据都要从第一个寄存器的盒子开始读写,假如我们想写第四个寄存器中的数据,那也要从第一个寄存器开始写,连续写四个才行,这样的操作是非常麻烦的,于是I2C协议规定了一个指针功能,英文是Pointer
指针功能就是利用一组数据中第二个DATA数据,当作指针来使用
如果要读写第四个寄存器,也可以表示从第四个寄存器开始读写
下次再读时可以不使用指针了,直接读取上一次指针指向的寄存器内容,这个指针在国内被翻译成子地址/寄存器地址
如果一条总线上连接多个从设备,单片机要如何区分它们
不是此号码的从设备将处在待机状态
左边7位二进制数就表示着器件地址