×
单片机 > 单片机程序设计 > 详情

S3C2440 I2C总线协议 和 I2C总线下的AT24C02存储芯片分析 二十七

发布时间:2021-11-22 发布时间:
|

本节来学习I2C接口下的AT24C02存储芯片分析,本节学完后,再来学习Linux下如何使用I2C操作AT24C02


1、I2C通信介绍


它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接受数据,是一个多主机的半双工通信方式。


每个挂接在总线上的器件都有个唯一的地址。


位速在标准模式下可达100kbit/s,在快速模式下可达400kbit/s,在高速模式下可达3.4Mbit/s。


2、I2C总线系统结构,如下图所示:


其中SCL时钟线的频率由主机提供,且从机不能主动来引起数据传输,必须等待主机先发信号才行,两个或多个主机同时发起数据传输时,可以通过冲突检测和仲裁来防止数据被破坏。


3、I2C时序介绍


1)空闲状态


当总线上的SDA和SCL两条信号线同时处于高电平时,便是空闲状态,如上面的硬件图所示,当我们不传数据时,SDA和SCL被上拉电阻拉高,即进入空闲状态。


2)起始信号


当SCL为高电平期间,SDA由高电平到低电平的跳变;便是总线的起始信号,只能由主机发起,且在空闲状态下才能启动该信号,如下图所示:


3)停止信号


当SCL为高电平期间,SDA由低电平到高电平的跳变;便是总线的停止信号,表示数据已经传输完成,如下图所示:


4)传输数据格式


当发了起始信号后,就开始传输数据,传输的数据格式如下图所示:


当SCL为高电平时,便会获取SDA数据值,其中SDA数据必须是稳定的(若SDA不稳定就会变成起始/停止信号)


当SCL为低电平时,便是SDA的电平变化状态


若主从机在传输数据期间,需要完成其他功能(例如一个中断),可以主动拉低SCL,使I2C进入等待状态,直到处理结束再释放SCL,数据传输会继续


5)应答信号ACK


I2C总线上的数据都是以8位数据(字节)进行的,当发送了8位数据后,发送方会在第9个时钟脉冲期间释放SDA数据,当接收方接收字节成功,便会输出一个ACK应答信号,当SDA为高电平,表示非应答信号NACK,当SDA为低电平,表示为有效应答信号ACK


PS:


当主机为接收方时,收到最后一个字节后,主机可以不发送ACK信号,直接发送停止信号来结束传输。


当从机为接收方时,没有发送ACK,则表示从机可能在忙其他事、或者不匹配地址信号和不支持多主机发送,主机可以发送停止信号,再次发送起始信号启动新的传输


6)完整的数据传输


如下图所示,发送起始信号后,便发送一个8位的设备地址,其中第8位是对设备的读写标志,后面紧跟着的就是数据了,直到发送停止信号终止


PS:当我们第一次是读操作,然后想换成写操作时,可以再次发送一个起始信号,然后发送读的设备地址,不需要停止信号便能实现不同的地址转换


4、AT24C02介绍


AT24C02是通过I2C实现通讯的,是一个存储芯片,能够存储2kb(256字节)数据


4.1 它的硬件图如下:


其中A2~A0,是这个AT24C03设备的硬件地址,接GND表示硬件地址都为0


4.2 其中AT24C02的数据格式如下所示:


4.3 打开AT24C02数据手册,它的设备地址如下图所示:



其中A2~A0表示硬件地址,P2~P0表示page页地址


bit[0]地址:表示读/写状态,1:读,0:写(所有I2C器件都是这样的,最低位表示方向位)


4.3.1 为什么需要page页地址?


因为I2C的数据位是8位,而AT24CXX的读写地址值最大可以为2048(2^11),超过了I2C的数据位,而page页地址就是用来解决这个问题的


比如AT24C16:


当发送:0XA2(设备地址P[2:0]=0x01),0x00(读地址)时:


表示要读的真正地址=0x01(页地址)*256+0(读地址)=0x100,转化为二进制=1 0000 0000


当发送:0xA0(设备地址),0x00(读地址时):

表示要读的真正地址=0x00*256+0xFF=0XFF,转化为二进制=0 1111 1111


4.3.2 如上图所示,对于AT24C02来讲:


芯片的容量小于等于2^8(256)字节,那么读写地址就用8bit来表示,所以设备地址里没有P2~P0

读操作时,发送的设备地址等于0xA1

写操作时,发送的设备地址等于0xA0

5、AT24C02时序图介绍


5.1 写时序介绍


当随机写一个字节时,只需要先发送一个起始信号,然后跟上0xA0设备地址,以及要写的起始地址值,后面便是要写入地址的data,如果需要连续写数据,只需要连续写入dat,地址会自动加1,直到发送停止信号结束


5.2 读时序介绍


当随机读一个字节时,先发送第一个起始信号,然后写入0XA0设备地址和要读的地址值,


接着发送第二个起始信号,然后写入0xA1设备地址,接着就是要读的data,如果需要连续读数据,只需要连续读出data,地址会自动加1,直到发送停止信号结束


最后总结一下:


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向