历史上的今天
今天是:2025年08月10日(星期日)
2019年08月10日 | 轻松学ARM系列之I2C总线
2019-08-10 来源:eefocus
今天我们来一起学习,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 */
⑥ 至此完成了一次 随机的读操作
下一篇:轻松学ARM系列之玩转蜂鸣器
史海拾趣
|
Implementation of Serial Communication Between MonitoringComputer and Delta PLC Based on Visual Basic… 查看全部问答> |
|
各位: 近期,电子工程世界将开展专门针对MCU这一领域的专题报道,全方位,多角度对MCU最新技术及趋势进行分析阐述,同时将MCU应用相关案例,经验汇总,并通过对厂家的专访对其最新产品、性能、指标进行进一步的总结概括。在此期望得到电子产业 ...… 查看全部问答> |
|
大家好:我的protel 99se中画pcb走线时可以走15度,30度等等好像是任意角度,我不想这样改怎么设置? 正常的是可以走45度,90度,135度 谢谢大家哦!… 查看全部问答> |
|
高分相送:关于TFFS建立时FLASH_BASE_ADRS的定义问题(mpc8379开发板) 情况是板上有两片flash ,一片 32Mnor,一片256Mnand。nor flash驱动已经做好。在做nand flash驱动时,mtd层编写完毕,对socket注册时,定义一个FLASH_NAND_BASE.根据存储分配,在Base Memory Mapped Registers(0xE0000000)和nor flash(0xFC000000 ...… 查看全部问答> |




