210学习日记(12)_IIC

来源:互联网 发布:mysql安全配置 编辑:程序博客网 时间:2024/06/05 02:34

210学习日记(12)

--IIC

因为后面的声卡程序,要用到IIC,这里就讲下IIC,用AT24LC04EEPROM做为测试:

1.IIC总线接线图:

问:既然只有两根总线,但是上面挂接了很多的从设备,那么CPU怎么来区分它们呢?

答:通过IIC协议发出的信号,一定会先发出地址信号,从而达到区分从设备的目的。

传送出的数据的格式为:

-----------------------------------------------------------------------------------------------------------

 开始信号 地址(7) | /写控制信号 应答 数据(8) | 应答 停止信号

-----------------------------------------------------------------------------------------------------------

2.IIC协议时序图:

开始信号:

SCL为高电平时,SDA产生一个下降沿信号;

结束信号:

SCL为高电平时,SDA产生一个上升沿信号,停止信号产生在数据发送结束时;

应答信号:

在数据传送的过程当中,谁来接收数据,就由谁来的发出应答信号,即将SDA信号线拉低,应答信号产生在第9个时钟;

数据传输:

在进行数据传送的时候,数据必须是在SCL为低电平的时候,才能够发生变化,在SCL高电平的时候,数据必须保持稳定;

3.读写过程分析:

写的过程:

开始的8CLK中进行写的操作,SDA由主机驱动,第9CLKSDA由从机驱动,发出应答信号;

读的过程:

开始的8CLK中进行读的操作,SDA由从机驱动,第9CLKSDA由主机驱动,发出应答信号;

4.对比S5PV210S3C2440IIC寄存器,发现S5PV210只是多了2IIC总线,而且要用到的寄存器,几乎无差异,所以我就不再多少什么?请大家直接阅读我提供的代码和看老大AT24CXX的裸板程序的视频吧。

1.以下是初始化函数:

void i2c_init(void)

{

/* 选择引脚功能:GPE15:IICSDA, GPE14:IICSCL */

GPD1CON |= 0x22;

GPD1PUD |= 0x5;

/* bit[7] = 1, 使能ACK

* bit[6] = 0, IICCLK = PCLK/16

* bit[5] = 1, 使能中断

* bit[3:0] = 0xf, Tx clock = IICCLK/16

* PCLK = 66.7MHz, IICCLK = 4.1MHz

*/

IICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);  // 0xaf

IICSTAT = 0x10;     // I2C串行输出使能(Rx/Tx)

}

2.在中断服务函数中,记得一定要清中断(即清中断向量地址),否则会出现只能够进入一次中断服务函数的情况,清中断的过程如下:

// 清中断向量

VIC0ADDRESS = 0x0;

VIC1ADDRESS = 0x0;

VIC2ADDRESS = 0x0;

VIC3ADDRESS = 0x0;

3.每次读或写完一次,即每次进入中断的时候,记得复位IIC总线,即清IIC控制器中的中断标志,类容如下:

IICCON = 0x2f;或者IICCON = 0xaf

注意:

1.参考代码放在了"Tiny210学习日记_代码"目录下了,名为"13_at24cxx"

2.测试方法:(在终端输入)

i2c read 0x0                (实现读0x0地址的操作)

i2c write 0x0 0xff            (实现往0x0地址写0xff的操作)

注:

如有问题,请到韦东山LINUX视频讨论群里面,我们一起讨论学习,或者加我QQ317312379

原创粉丝点击