12_IIC裸板
1、IIC读写操作原理
黑色->主到从、红色->从到主
写:1_START、2_设备地址(7位) | 方向(1位)、3_回应、4_数据(8位) | 回应、5_P(结束)
读:1_START、2_设备地址(7位) | 方向(1位)、3_回应、4_数据(8位) | 回应、5_数据 | 回应、6_P(结束)
方向:0->写 1->读
START:SCL保持高电平、SDA从高变低。
P(停止):SCL保持高电平、SDA从低变高。
主设备发出START信号之后,用9个CLK来传输8位数据
第9个CLK是回应信号ACK(SDA为低电平)。
SCL低电平时,SDA可以变化;SCL高电平时,SDA保持不变。
读操作:
写操作:
2、数据的双向传输
2.1 主设备发送时,从设备不发送:可以通过SCL区分
2.2 主设备发送时,从设备的“发送引脚”不影响数据发送,反之相同
发送引脚连接三极管如图:
ACK:SDA为低电平
A B SDA
0 0 1(由上拉电阻决定)
0 1 0
1 0 0
1 1 0
不影响SDA,不驱动三极管;②想输出高电平,不驱动;③想输出低电平,驱动
例:主——(8bit)—>从
前8个CLK
从设备不要影响,不驱动三极管
主设备决定数据
第9个CLK,由从设备决定数据
主设备不驱动三极管,SDA高
从设备决定数据:
SDA高:NO ACK
SDA低:ACK
3、2440的IIC控制器
1 设置IICCON来设置时钟
2 设置分频系数把时钟降低为想要的频率
3 设置IICSTAT发出START信号
4 将数据写入IICDS中,之后就自动的设置时钟、将数据通过SDA发送出去
5 第9个CLK来检查IICSTAT查询是否有ACK信号:
有ACK表示数据成功发出,继续发下一个数据:再次将数据写入IICDS中…
无表示数据发送失败
6 发完数据不想再发了,就设置IICSTAT来发送P信号停止发送
在第9个CLK发生中断,中断处理过程,SCL为低,谁都不能使用IIC:
对于写:
若无ACK:出错结束(发出P信号)
若有ACK:
若仍有数据,写入IICDS,清中断
若无,结束
对于读:
回应一个ACK信号:
还想再读:清中断,启动传输
不想读了:结束
重点:发生IIC中断时,SCL被拉低。阻止继续使用IIC,清中断后才能继续使用。
S3C2440读写数据流程:
写(发送):
IICDS = val
发完,产生中断,拉低SCL
中断程序里,判断状态,IICDS = val,IIC继续工作②
读(接收):
发起传输,接收数据
产生中断,SCL被拉低
中断程序中,判断,设置好之后,value= IICDS,IIC继续工作,继续接收新数据—>②
IIC控制器传输信号:
IIC传输原理:
主机发送地址时:
由于i2c设备不同,地址数量也不同。在1k2k都只有一页地址,4k有2页。。。
发送地址时:
P2 P1 P0表示不同的页数;A2 A1 A0为硬件引脚。
例如:AT24C02只有一个page,8位的地址可以访问到;
AT24C08有4个page,在Start信号之后,再发出设备地址时可以指定访问那一页。
4、编写代码
可参考1期的IIC裸机程序
5、测试
使用oflash下载bin文件进行裸机测试: