本帖最后由 夜色星空 于 2017-2-17 18:45 编辑
因PWM的38KHZ载波没有调出来
所以这将是最后一贴
对于IIC的学习
它是一种只需要两根线(不算电地线)就可进行数据交互的通讯协议
好比DS18B20的复位(存在)脉冲一样
IIC用起始位来通知外围器件将要发送数据
然后进行数据传输
再进行截止以表示数据传输完毕
首先是起始位
IIC一共只需要两根线
SCL与SDA
当主机(一般为单片机)发送起始信号时就相当于通知从器件(如AT24C02)做好准备
而起始信号一般为
当SCL为高时将SDA拉低
如图
然后就是数据传输
先保证SCL为低,然后将SCL调为高或低(1/0),调整好后再将SCL拉高,通知从器件接收一位数据 也就是传输二进制 高位在前,低位在后 每传输八位数据(一字节)后要进行应答
(从器件接收到数据后,在下一个SCL拉高时将SDA拉低表示接收到数据)
如果发送的为读取命令
此时主机只需要让SDA为高电平
然后控制SCL的变化就可以
如,想读出从器件的数据(假设为0011 0011)
当发送完读指令后,接受一位应答位(SCL被主机拉高,SDA被从器件拉低)
然后主机将SCL拉低,维持SDA为高
先传输高位0
主机将SCL拉高时从机将SDA拉低(高位0传输完毕)
主机读取当前IO口状态(为低,0)
然后再将SCL拉低,延时,再拉高
再读取IO口状态(为低,0)
再执行拉高,拉低,延时,读状态(为1)
以此类推
读出八位数据后
主机发送应答位表示继续读取
发送非应答位,表示停止读取
(在数据发送完毕后,将SDA置高表示非应答)
然后,无论读写,当停止操作时,发送停止位,表示结束通讯
停止位与起始位相反
它是在SCL为高时,将SDA拉高,表示结束
如图,一次完整的通讯
(注意,图中数字只是说明传输位数,并不是低位在前)
知道了如何传输,然后就是传输命令与数据了
先上图(以黑金V2.5为例)
介绍一下引脚作用
SCL,SDA——数据传输
A2,A1,A0地址引脚
因为IIC总线可以串接多个器件
所以每个器件就要有它单独的地址
如图,那么
A0=1;
A1=0;
A2=0;
再加上AT24C02的地址格式
1010 A2 A1 A0 R/W
所以,我们要写数据到板子上的EEPROM(AT24C02)
则对应命令代码为
1010 0010(0XA2)
然而,光有这一条命令还不够
AT24C02是一个具有2K存储空间的 EEPROM(电可擦可编程只读存储器)
(手头没有中文的,先放一个英文的)
(大意应该是,有32页,每页8字节,也就是可以存储32*8字节数据)
如此多的存储空间,我们只用一字节进行传输(多字节会有一些问题)
那么就有了第二条指令,选择一块空间进行存储
AT24C02的存储空间的地址为从0X00——0XFF
在这任选一块地址发送给EEPROM
然后按照第一条指令进行读写操作
然后结束通讯
这样,单字节的读写就完成了
(需要注意,EEPROM进行写操作时,会占用一些时间,此时进行读操作将得不到正确结果,好比LCD的忙状态)
然而,当单个写入或读取时用单字节通讯效率不高
此时就有了页写入,页读取
EEPROM中有32页每页有8字节
我们完全可以用
一字节传输+ACK(应答)+一字节传输
这种方式进行通讯
并且EEPROM支持这种页写入方式
这体现在你每次应答时它会自动将地址‘+1’
比如你发送的地址为0X00时
应答一次,再进行读写,那么此时你读写的对象就变成了0X01这块空间
注意,EEPROM最多只支持页写入
也就是最多写入一页
它将每8个字节合为一页(AT24C02为8字节/页)
也就是说0X00——0X07为一页
当你在0X07处应答时,它会跳转至0X00
(貌似叫“上溢”)
将0X00的数据覆盖
也就是说如果想与EEPROM进行通讯
则需要
起始信号
发送指令
应答
发送地址
应答
发送数据
。。。
(发送非应答)(若为单字节写则不用)
结束信号
然而,还需要注意,因为一般主机速度都比从机快
所以适当延时是必要的
附上一些比较实用的时序图
|