首先要明确的是两张读写的协议图,后续要严格按照协议来写程序就可以了。
读时序
下面就以AT24Cxx为例详细说明一下:
首先发出一个start信号,从设备地址,R/W(0,写),回应ACK表示有这个从设备存在。这时候是处理器从指定的从设备读数据的从设备里8bit存储地址的指定。所以这里R/W是0为写。ACK回应有这个设备的话,处理器把要访问的从设备里的8bit存储地址写好。ACK对方回应。继续一个start信号+从设备地址,最低位是高电平表示读数据,回应ACK表示有这个从设备存在。在读数据的时候,每发出一个时钟,处理器会SDA上的数据存起来。那么发出8个时钟后处理器就能得到8位的数据。这时候若想连续读就不断回应ACK信号否则就发出停止信号。
读的过程:start信号,从设备地址,写,待读取存储地址,再一个start信号,从设备地址,读,8个时钟,从设备就把对应的数据反馈给处理器。
写时序
start信号,哪一个设备地址,写,紧跟连续两个字节的数据:要写的地址,对方收到8bit地址后回应ACK,再8bit数据发给从设备,对方收到8bit数据后回应ACK,处理器写完后发送停止信号。
要点:
- 读写时序要有相应的ack信号。(此处可查询ack信号时怎么产生的)
- 读写设备地址和数据时是不一样的。
设备地址(一般小的)是7位的地址,最后一位如果为0表示写如果为1表示读。
而数据寄存器的话,读写可能是先写一个读写的指令如0xA0等,然后直接写入8位的数据地址。
这两个区别要格外注意