######以下知识点基于EEPROM-24LC04
和AT24C64还是有一点差别的,不知道刚开始我怎么又是觉得俩是一个型号
一、信号
-
传输数据之前有起始信号,之后有结束信号,都在SCL线为高时产生,起始信号拉低(意思是有一个从高电平到低电平的过程),结束信号拉高(有一个从低电平到高电平的过程)
-
PS:所以在产生起始信号之前sda线应该置为高电平,在产生结束信号之前sda线应该置为低电平(尤其结束信号之前是有一个高电平的非应答信号的)
-
图为起始信号和停止信号时序图
-
数据只允许在SCL为低时改变,在SCL为高时有效(即此时可被采样)
二、数据帧
-
传输数据有地址帧和数据帧两种,地址帧打头,7bit(有扩展到10bit的情况)地址位,由主机发送到总线上,地址信息相同的从机会被总线选中,接着1bit操作位,1为读0为写,比如为1时就代表主机要读取从机的数据,接下来传输的数据就应该是接收,数据帧在地址帧后面传输
-
图为起始信号+器件地址+操作位+应答信号(后面提,ACK)
-
器件地址=固定部分(如EEPROM为1010,指定器件类型)+可编程部分(也可以理解为片选,一个系统中出现多个EEPROM器件时用可编程部分101,100等做区别,可编程部分为3位,对应3个管脚pin,最多可支持8个相同EEPROM器件挂载在IIC总线上)
三、确认机制+寻址
-
初看请跳过:若是从机想不被打断地和此主机进行通信,则结束信号应该在数据传输完毕之后再产生,可以多次发送起始信号完成多段通信,结束信号一旦产生,从机就可能被别的主机请求
-
I2C和UART,SPI接口最大的区别是它有确认机制,即8位数据之后应该加上1位应答信号(即一帧9bit),应答信号为第九个时钟周期时SCL线为高时采样得到的信号(潜台词是第九个时钟周期SCL线为低电平时就应该将SDA线置低),检测到低电平,表示从机在线,告诉主机可以继续操作(ACK),检测到高电平则表示非应答(NACK)
1.SPI利用片选信号选择与主机进行通信的从机(芯片器件),而I2C除了发送器件地址选择从机器件之外,还需要选择操作的对象
2.这里的操作指的是读操作或者写操作,我们知道I2C的数据帧是8bit,那么这些数据帧至少应该放在一个类似寄存器的地方吧,例如在主机里面就是将8位寄存器内的数据一位一位地发出去,所以从机里会有类似的结构。按照我目前的知识来理解,从机里有个类似栈的地方(这里只是借助栈的空间特点),栈有很多层,每一层都是一个存储单元,一个存储单元可以放8位数据
3.由此可见,与I2C主机相通信的对象可以变为,每一次和从机的一个存储单元进行数据传输,可以把自己的8比特数据送给该存储单元,也可以读取该存储单元的数据
4.具体的体现就是主机发送字节帧(此字节帧叫做command byte或word address)将地址指针指向与之通信的存储单元,此字节帧一般跟在地址帧后面,数据帧的前面
-
下面是写操作和读操作的时序图
- 由图可知,读操作以非应答(1)+停止信号结束,写操作以应答(0)+停止信号结束
- 读操作包括当前地址读,随机地址读,顺序读
- 写操作包括字节写(单次写)和页写(连续写)
- 另,下图为另一个IIC从机LM75的读模式
吐槽
原来项目只用到温度传感器的iic总线,我迷的很,一个多月了才发现用不着EEPROM,快乐的小辣鸡,iic可以做两个项目,就这么愉快地决定了
过了好几个月,iic项目终究还是难产了,我吐了,不管是自己写的控制端还是移植的黑金的,都只能读出全零的温度,有毒
资料夹
原子教你玩FPGA 刘军 阿东 张洋 编著
24LC04datasheet
数字ic学习-IIC总线(一)之datasheet学习 第一天 芯王国