今天我们来一起学习,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 */
⑥ 至此完成了一次 随机的读操作