轻松学ARM系列之I2C总线

作者:熊老师,华清远见教育科技集团讲师。

今天我们来一起学习,arm裸机中对I2C设备学习。包括GPIO,IIC控制器学习。

一、总体架构图

二、I2C操作的一般步骤

2.1  查看s5pv210开发板的I2C相关的硬件原理图

开发板上IIC实际连接电路,AT24C02为EEPROM,大小为2k位,256字节

核心板对应的原理图

2.2  设置GPIO寄存器为I2C功能

配置GPD1CON[0] 和 GPD1CON[1] 为I2C 功能:

GPDCON.GPD1CON = (GPDCON.GPD1CON & (~0xff))| 0x22

2.3 查看I2C控制器相应的章节,对相关的寄存器进行配置

选择设备的发送方式,主发射,从接收模式(这个是由从设备自动决定的)

向寄存器中写入。每个IIC独有的设备地址

数据移位寄存器

2.3.1 查看AT24C02相关的芯片手册,查看操作的顺序

操作的设备的地址为0xa0 , 对应的是写操作, 0xa1 对应的是读操作

2.3.2 对AT24C02按照字节的写操作

对EEPROM 按字节写的操作顺序,先由主设备发送一个start起始信号,发一个字节的设备地址(7 + 1 位 ,写),第9位为ACK应答位,发一字节的地址(表示要往哪个地址空间写数据,一共256个字节地址),接着传送一字节的数据。发一个ACK信号,发送停止信号stop。多存放256字节的数据

对s5pv210上相关的IIC控制器,进行相应的配置。

2.3.3  对于主设备发送,从设备接收。写操作,往EEPROM中写数据

① 写设备地址
        I2C0.I2CCON0 = 0xe0 ,512分频,使能ACK信号,使能中断
        I2C0.I2CDS0 = 0xa0;//写从机设备地址
        I2C0.I2CSTAT0 = 0xf0;主设备发送,产生start信号
        while (!((I2C0.I2CCON0)& (1 <<4)));如果发送完毕第5位,中断标志位 值为1,表示写设备地址成功。否侧,相当于具有延时的功能。

②写数据的地址,表示要对那一个字节的地址,要对他进行存放数据
        I2C0.I2CCON0 = I2C0.I2CCON0 &( ~(0x1 << 4));表示清除pend状态位,复位操 作写;
        I2C0.I2CDS0 = addr; 从机的地址,0 ~ 255 之间,一个256个字节,因为该芯 片的大小就是2k位,256个字节
        while (!((I2C0.I2CCON0)& (1 <<4)));如果发送完毕第5位,中断标志位 值为1,表示写数据地址成功。否侧,相当于具有延时的功能。

③ 在相应的地址上写上相应的数据
        I2C0.I2CCON0 = I2C0.I2CCON0 &( ~(0x1 << 4));表示清除pend状态位,复位 操作写;
        I2C0.I2CDS = data;
        while (!((I2C0.I2CCON0)& (1 << 4)));如果发送完毕第5位,中断标志位 值为1,表示写数据地址成功。否侧,相当于具有延时的功能。

④发送一个stop信号
        I2C0.I2CSTAT0 &= ~(1<<5); /*STOP signal generation,free bus */
        I2C0.I2CCON0 &= ~(1<<4); /*clean interrup pending bit */

⑤ 至此一次写操作顺利完成,按字节写数据的

2.3.4 对于读数据,主机发送模式,后接收模式,选取的是随机读的相应地址中的数据的方式

① 写设备地址,开启start启动信号
        I2C0.I2CCON0 = 0xe0 ,512分频,使能ACK信号,使能中断
        I2C0.I2CDS0 = 0xa0;//写从机设备地址
        I2C0.I2CSTAT0 = 0xf0;主设备发送,产生start信号
        while (!((I2C0.I2CCON0)& (1 <<4)));如果发送完毕第5位,中断标志位 值为1,表示写设备地址成功。否侧,相当于具有延时的功能。

② 写存放的数据的地址
        I2C0.I2CCON0 = I2C0.I2CCON0 &( ~(0x1 <<4));表示清除pend状态位,复位操 作写;
        I2C0.I2CDS0 = addr & 0xff; 从机的地址,0 ~ 255 之间,一个256个字节,因 为该芯片的大小就是2k位,256个字节
        while (!((I2C0.I2CCON0)& (1 <<4)));如果发送完毕第5位,中断标志位 值为1,表示写数据地址成功。否侧,相当于具有延时的功能。

③ 读设备地址,清pend寄存器,发送一个start信号, 此时主机接收
        I2C0.I2CCON0 = I2C0.I2CCON0 &( ~(0x1 <<4));表示清除pend状态位,复位操作写;
        I2C0.I2CDS0 = 0xa0 | 0x01; //写设备地址,读操作
        I2C0.I2CSTAT = 0xb0; //1011 0000
        while(!(I2C0.I2CCON0&(1<<4))); /*The end of the waiting to be sent */

④读取数据,读数据时不产生ACK信号
        I2C0.I2CCON0 &= ~((1 << 7)| (1 << 4)); 清中断标志位,关闭ACK应答信号
        while (!(I2C0.I2CCON0 & (1 <<4))); 每次操作成功都会产生一个中断标志位
        data = I2C.I2CDS0;

⑤ 发送stop信号
        I2C0.I2CSTAT0 &= ~(1<<5); /*STOP signal generation,free bus */
        I2C0.I2CCON0 &= ~(1<<4); /*clean interrup pending bit */

⑥ 至此完成了一次 随机的读操作