【0005-1】I2C驱动之E2PROM裸板篇

1.I2C总线协议

1.1 I2C总线的概念

1.2 I2C硬件原理图

 


【术语】

【发送器】:任何将数据传送到SDA总线的器件是发送器;

【接收器】:任何从SDA接收数据的器件是接收器;

     因此,在主从结构中,处理器和EEPROM都会充当发送器和接收器的角色;

但是数据的接收还是发送的模式是由主控制器控制的;

【主控制器】:提供数据的传送总线的串行时钟开始(S)和停止(P)信号

【ACK信号(握手/应答)】每次数据传送成功之后,接收器都要发出ACK信号;

 

  在第9个SCLK时钟信号产生时,接收器将SDA拉低,通知发送器,已经收到8位数据;

  如果EEPROM接收到的信号是操作,每接收到一字节的数据就发送一个ACK信号;

  如果EEPROM接收到的信号是操作,则EEPROM发送一字节的数据,释放总线,等待主控制器的ACK信号;

  如果收到主机控制器的ACK信号,则继续发送一字节数据,并等待主机控制器的ACK信号,直到所有的数据发送结束;

  如果接收到主控制的非ACK信号,则结束数据传输,等待主机控制器的停止(P)信号;

【注】在EEPROM执行写操作时,一旦主机发送停止位指示主机操作结束时,EEPROM内部启动内部写周期,应答查询立即启动。在EEROM执行内部写操作时,不会发送应答ACK信号。

 【起始信号(S)】

  ①SCLK时钟线保持电平,SDA数据线从高到低的跳变作为I2C总线的起始信号(S)。 

    

  ②起始信号必须所有操作命令之发送。

  ③EEPROM会一直监视SDA和SCLK电平信号条件,满足条件才会响应。

  ④起始信号由主控制器发送。

【停止信号(P)】

  ①SCL时钟保持在电平期间,SDA电平从低到高的跳变作为I2C总线的停止信号

      ②停止信号由主控制器发送。

 【读写控制位】

  ①在地址数据的第8时钟发出读/写信号位。

  ②“1”表示对从器件。“0”表示对从器件

【I2C协议说明】

  ①只有在总线非忙时才可以进行数据传送。

  ②在数据传送时,当SCL时钟线为高电平SDA线必须为固定状态不能跳变

    SDA数据线的跳变只能在SCL的低电平期间。

 

  ③在SCL为高电平期间,SDA的任何跳变都会被作为起始信号(S)或者停止信号(P)

 

2. EEPROM的使用

2.1  认识EEPROM

【管脚描述】

【SDA】串行数据/地址输入脚

  双向串行数据/地址脚,用来输入数据。

  该极为漏极开路输出,因为需要接上拉电阻。(在实际的原理图并没有接上拉电阻,在程序中使能了CPU内部的上拉电阻

【SCLK】串行时钟引脚

  在串行数据输入输出时输入参考时钟。在主从结构的I2C通信中,时钟的控制输出是主设备(此处是ARM处理器)。

【WP】 写保护

  接高电平则EEPROM处于写保护状态,只读

  接低电平或者悬空则处于可读写状态;一般的接法是直接接GND;

【A0-A2】地址引脚

  从机地址共8位构成,高4位固定为1010,之后的3位为EEPROM内部存储地址;

  对于AT24C08,3位中的第1位(A2)无意义,第2-3位(P1P0)表示地址高位;

 

AT24C08A, 8K SERIAL EEPROM: The 8K is internally organized with 4 blocks of 256 pages of 4-bytes each.Random word addressing requires a 10 bit data word address.

I2c本身设备地址的计算:

  前四位的定值:1010 + 后三位的不定值定义为000 = 0x50;

AT24C08:

【存储空间】8Kb,即1KB,1K字节;

其中:

1片包含有4 block,

1block 包含有256page,

1page的空间大小是4B;

1KB = 8Kb = 4 block * 256page * 4B;

 

 

2.2 EEPROM之写操作

【写操作之单字节写

 

 

【写操作之页写

 

 

2.3 EEPROM之读操作(比写操作稍微复杂)

 

 【当前(current)地址读】

 

【注】在立即地址读,从机收到地址之后,首先发送的是一个应答信号,再次发送8位一字节数据。主机不需要发送ACK信号,但是要产生一个停止信号。

 

 【选择地址读】

 

【连续读】

【注】

①主机是否会发送ACK信号是判断是连续读还是当前地址读/选择字节读的依据(因为在当前地址读/选择字节读时,主机接收到读的数据之后不会发送ACK信号)。

②从机到底需要连续发送多少数据是根据主机的ACK信号的个数决定的。一个主机的ACK信号对应着从机的一个字节的数据。

 

 

 【问】

【1】需要将内部上拉,但是上拉的代码如下:

 

/* 禁止内部上拉--端口 E 控制寄存器
* bit[12:15]= 1100 0000 0000 0000
* c = 1100;
* bit[13:12]= 00;
* bit[15:14]= 11;
* OzTaking 管脚设置不正确;
* [13:0]--1:禁止附加上拉功能到相应端口引脚
* e.g:
rGPEUP |= 3<<14; //Pull-up disable
*/
GPEUP |= 0xc000;

 为什么?

=======================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.2 EEPROM硬件原理图

 

 

 

  

 

 

 

 

posted @ 2017-04-26 22:03  OzTaking  阅读(333)  评论(0)    收藏  举报