×
单片机 > 单片机程序设计 > 详情

STM32—基于模拟IIC方式读取EEPROM

发布时间:2020-08-21 发布时间:
|

前言:

最近在调试STM32L152芯片利用IIC接口读取EEPROM的程序,总结下STM32的 IIC接口 读取EEPROM的使用方法。


PS:由于STM32的硬件IIC存在一些问题,本文暂时使用模拟IIC进行EEPROM的读取。STM32的硬件IIC使用方法见另外两篇文章:传送门1和传送门2。


硬件平台:STM32L152


软件平台:keil v5+cubeMX


函数库:HAL函数库


 


1:配置iic引脚,本例对应PC2和PC3管脚,移植修改对应管脚。


#define I2C_SCL GPIO_PIN_2   //PC2

#define I2C_SDA GPIO_PIN_3   //PC3

 

 

#define I2C_SCL_H HAL_GPIO_WritePin(GPIOC,I2C_SCL,GPIO_PIN_SET)

#define I2C_SCL_L HAL_GPIO_WritePin(GPIOC,I2C_SCL,GPIO_PIN_RESET)

 

#define I2C_SDA_H HAL_GPIO_WritePin(GPIOC,I2C_SDA,GPIO_PIN_SET)

#define I2C_SDA_L HAL_GPIO_WritePin(GPIOC,I2C_SDA,GPIO_PIN_RESET)

void I2C_INIT()

{

    GPIO_InitTypeDef GPIO_InitStructure;

 

    GPIO_InitStructure.Pin= I2C_SCL|I2C_SDA;

    GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;

    GPIO_InitStructure.Pull  =GPIO_NOPULL;

    GPIO_InitStructure.Speed  = GPIO_SPEED_FREQ_VERY_HIGH;

    HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);

 

    I2C_SCL_H;

    I2C_SDA_H;

}

2: 编写开始、停止、应答、非应答、发送、接收等信号程序;

//SDA数据输入函数


void I2C_SDA_OUT()

{

    GPIO_InitTypeDef GPIO_InitStructure; 

 

    GPIO_InitStructure.Pin =I2C_SDA;

    GPIO_InitStructure.Mode =GPIO_MODE_OUTPUT_PP;

    GPIO_InitStructure.Pull  =GPIO_PULLUP;

    GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_VERY_HIGH;

    HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);

}


//SDA数据输出函数


void I2C_SDA_IN(void)

{

    GPIO_InitTypeDef GPIO_InitStructure; 

 

    GPIO_InitStructure.Pin   =I2C_SDA;

    GPIO_InitStructure.Mode =GPIO_MODE_INPUT;

    GPIO_InitStructure.Pull  =GPIO_NOPULL;

    GPIO_InitStructure.Speed =GPIO_SPEED_FREQ_VERY_HIGH;

    HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);

}

//产生IIC开始信号函数


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;

}

 //产生IIC停止信号函数


void I2C_Stop(void)

{

   I2C_SDA_OUT();

 

 

   I2C_SCL_L;

   I2C_SDA_L;

   I2C_SCL_H;

   delay_us(6);

   I2C_SDA_H;

   delay_us(6);

}

//IIC应答函数


void I2C_Ack(void)

{

   I2C_SCL_L;

   I2C_SDA_OUT();

   I2C_SDA_L;

   delay_us(2);

   I2C_SCL_H;

   delay_us(5);

   I2C_SCL_L;

}


//IIC非应答函数


void I2C_NAck(void)

{

   I2C_SCL_L;

   I2C_SDA_OUT();

   I2C_SDA_H;

   delay_us(2);

   I2C_SCL_H;

   delay_us(5);

   I2C_SCL_L;

}

//IIC等待应答函数


u8 I2C_Wait_Ack(void)

{

    u8 tempTime=0;

 

    I2C_SDA_IN();

    I2C_SDA_H;

    delay_us(1);

    I2C_SCL_H;

    delay_us(1);

 

 

    while(HAL_GPIO_ReadPin(GPIO_I2C,I2C_SDA))

    {

        tempTime++;

        if(tempTime>250)

        {

            I2C_Stop();

            return 1;

        }  

    }

    I2C_SCL_L;

    return 0;

}


//IIC发送一个字节函数


void I2C_Send_Byte(u8 txd)

{

    u8 i=0;

 

    I2C_SDA_OUT();

    I2C_SCL_L;

 

    for(i=0;i<8;i++)

    {

        if((txd&0x80)>0) //0x80  1000 0000

            I2C_SDA_H;

        else

            I2C_SDA_L;

 

        txd<<=1;

        I2C_SCL_H;

        delay_us(2); 

        I2C_SCL_L;

        delay_us(2);

    }

}


//I2C 读取一个字节函数

 


u8 I2C_Read_Byte(u8 ack)

{

   u8 i=0,receive=0;

 

   I2C_SDA_IN();

   for(i=0;i<8;i++)

   {

        I2C_SCL_L;

        delay_us(2);

        I2C_SCL_H;

        receive<<=1;

        if(HAL_GPIO_ReadPin(GPIO_I2C,I2C_SDA))

          receive++;

        delay_us(1); 

   }

    if(ack==0)

      I2C_NAck();

    else

      I2C_Ack();

    return receive;

}

 


3:编写写入EEPROM AT24C02程序。


从EEPROM中读取一字节数据函数。


u8 AA24x_ReadOneByte(u8 addr)

{

    u8 temp=0;

    I2C_Start(); 

    I2C_Send_Byte(0xA0);//1010000

    I2C_Wait_Ack();

    I2C_Send_Byte(addr);

    I2C_Wait_Ack();

    I2C_Start();

    I2C_Send_Byte(0xA1);//10100001

    I2C_Wait_Ack();

    temp=I2C_Read_Byte(0); 

    I2C_NAck();

    I2C_Stop(); 

    return temp; 

}

从EEPROM中写入一字节数据函数。 


void AA24x_WriteOneByte(u8 addr,u8 dt)

{

    I2C_Start();

    I2C_Send_Byte(0xA0);

    I2C_Wait_Ack();

    I2C_Send_Byte(addr); 

    I2C_Wait_Ack();

    I2C_Send_Byte(dt);

    I2C_Wait_Ack();

    I2C_Stop();

    delay_ms(10);

}

 

关键字:STM3  模拟IIC  读取EEPROM 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录