210学习日记(12)
--IIC
因为后面的声卡程序,要用到IIC,这里就讲下IIC,用AT24LC04的EEPROM做为测试:
1.IIC总线接线图:
问:既然只有两根总线,但是上面挂接了很多的从设备,那么CPU怎么来区分它们呢?
答:通过IIC协议发出的信号,一定会先发出地址信号,从而达到区分从设备的目的。
传送出的数据的格式为:
-----------------------------------------------------------------------------------------------------------
开始信号 | 地址(7位) | 读/写控制信号 | 应答 | 数据(8位) | 应答 | 停止信号
-----------------------------------------------------------------------------------------------------------
2.IIC协议时序图:
开始信号:
SCL为高电平时,SDA产生一个下降沿信号;
结束信号:
SCL为高电平时,SDA产生一个上升沿信号,停止信号产生在数据发送结束时;
应答信号:
在数据传送的过程当中,谁来接收数据,就由谁来的发出应答信号,即将SDA信号线拉低,应答信号产生在第9个时钟;
数据传输:
在进行数据传送的时候,数据必须是在SCL为低电平的时候,才能够发生变化,在SCL高电平的时候,数据必须保持稳定;
3.读写过程分析:
写的过程:
开始的8个CLK中进行写的操作,SDA由主机驱动,第9个CLK,SDA由从机驱动,发出应答信号;
读的过程:
开始的8个CLK中进行读的操作,SDA由从机驱动,第9个CLK,SDA由主机驱动,发出应答信号;
4.对比S5PV210和S3C2440的IIC寄存器,发现S5PV210只是多了2个IIC总线,而且要用到的寄存器,几乎无差异,所以我就不再多少什么?请大家直接阅读我提供的代码和看老大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视频讨论群里面,我们一起讨论学习,或者加我QQ:317312379