STM32,IIC总线。

来源:互联网 发布:淘宝卖家服务态度评分 编辑:程序博客网 时间:2024/05/29 15:13

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);
}

原创粉丝点击