STM32 IIC EEPROM实验

一、项目说明

利用 STM32 的普通 IO 口模拟 IIC 时序,并实现和 24C02 之间的双向通信,并将结果通过串口printf 输出。

二、知识点

  • 1、关于IIC的知识点前面两篇文章已经有多介绍,本文重点从代码的角度讲解IIC的实际应用。
  • 2、24C02是一款EEPROM芯片,兼容IIC总线。具有掉电不丢失,反复改写存储内容等特点。具有2K位存储容量,即256个字节,对应于256个地址。
  • 3、对24C02的写操作,可以一次写一个字节,也可以一次写一页(一页有8个字节)。在一次寻址后,在同一页的情况下,写完一个字节地址会自动加一。
  • 4、对24C02的读操作,不管是不是在同一页,每读完一个字节后,读取地址自动加一。
  • 5、24C02的从设备地址为1010ABC,其中ABC代表可通过引脚的高低电平改变。因此可实现8种不同从设备地址,这意味着在同一个IIC总线上,最多可以挂在的24C02设备为8个。
  • 6、[时钟频率]

三、部分代码

  • 1、IIC start

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void I2C_Start(void)
    {
    I2C_SDA_OUT();
    I2C_SDA_H;
    I2C_SCL_H;
    delay_us(5);
    I2C_SDA_L;
    delay_us(6);
    I2C_SCL_L;
    }
  • 2、24C02 Write

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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);//双字节是数据地址低位
    //单字节是数字地址低位
    I2C_Wait_Ack();
    I2C_Send_Byte(dt);
    I2C_Wait_Ack();
    I2C_Stop();
    delay_ms(10);
    }
  • 3、test code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int main()
    {
    //u32 i=0;
    u32 j=0;
    u8 value=0;
    printf_init(); //printf初始化
    I2C_INIT(); //IIC初始化
    delay_ms(1);
    /*
    for(i=0;i<=255;i++){
    AT24Cxx_WriteOneByte(i,data); //24c02写数据
    printf("写进去的数据是: %d\r\n",data);
    data--;
    }*/
    for(j=0;j<=255;j++){
    value=AT24Cxx_ReadOneByte(j);
    printf("读出来的数据是:%d\r\n",value);
    }