IIC总线这块很难,确实研究了一段时间。基础知识、教程等就不写了,反正也是给自己看。其他都在手册里。
总体上看需要几部分:
1、选取端口设置成IIC总线,GPIO输出。并拉高。 预定义I2C_SCL I2C_SDA I2C_SDA_H I2C_SDA_L I2C_SCL_H I2C_SCL_L等。
2、编写函数,SDA输入输出,主要是配置GPIO模式。
3、根据IIC基础知识——时序图,
注意:1、在总线空闲的时候, SDA 和 SCL 都是高电平的。
2、在 SCL 为高电平期间, SDA 必须保持稳定。所以 SDA 改变状态最好在 SCL 为低电
平的时候改变,如果在高电平改变的话回被认为是一种有效信号(如:起始信号或者结束信
号) 。
编写:起始信号,终止信号,主机产生应答,主机不产生应答,等待从机应答(返回值:成功或失败)。
根据上述几个函数,再根据时序图编写,IIC上发送一个字节,读取一个字节。
4、弄清AT24C01/02/04/08/16/32/64/128等器件手册,多看几遍。主要看时序图。
5、编写通用程序。读AT24Cxx字节,写AT24Cxx字节。
主要看程序解释。 这里注意C16以上数据地址为u16,器件地址为a0。C16以下数据地址为u8.器件地址为a0+A2A1A0.
16以上,addr为纯数据地址。16以下,addr为器件地址加数据地址
/*******************************************************************************
* 函 数 名 : AT24Cxx_WriteOneByte
* 函数功能 : 24c02写一个字节地址 数据
* 输 入 : addr dt
* 输 出 : 无
*******************************************************************************/
void AT24Cxx_WriteOneByte(u16 addr,u8 dt)
{
I2C_Start();
if(EE_TYPE>AT24C16)
{
I2C_Send_Byte(0xA0); //器件地址
I2C_Wait_Ack();
I2C_Send_Byte(addr>>8); //发送数据地址高位
}
else
{
I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址
}
I2C_Wait_Ack();
I2C_Send_Byte(addr%256);// 数据地址 16以上是数据地址低位
// 16以下是数据地址
I2C_Wait_Ack();
I2C_Send_Byte(dt);
I2C_Wait_Ack();
I2C_Stop();
delay_ms(10);
}