STM32 IIC EEPROM

来源:互联网 发布:防御sql注入的手段 编辑:程序博客网 时间:2024/05/23 17:01

第一步,配置iic引脚,移植修改对应管脚。

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

第二步, 编写开始、停止、应答、非应答、发送、接收等信号程序;



/*******************************************************************************
* º¯ Êý Ãû         : I2C_SDA_OUT
* º¯Êý¹¦ÄÜ   : 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);
}


/*******************************************************************************
* º¯ Êý Ãû         : I2C_SDA_IN
* º¯Êý¹¦ÄÜ   : 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);
}


//²úÉúÆðʼÐźÅ
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;
}


//²úÉúÍ£Ö¹ÐźÅ
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);
}


//Ö÷»ú²úÉúÓ¦´ðÐźÅACK
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;
}


//Ö÷»ú²»²úÉúÓ¦´ðÐźÅNACK
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;
}
//µÈ´ý´Ó»úÓ¦´ðÐźÅ
//·µ»ØÖµ£º1 ½ÓÊÕÓ¦´ðʧ°Ü 0 ½ÓÊÕÓ¦´ð³É¹¦
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;
}
//I2C ·¢ËÍÒ»¸ö×Ö½Ú
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;
}


第三步,编写写入EEPROM AT24C02程序

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); //  0   ´ú±í NACK
I2C_NAck();
I2C_Stop();
return temp;
}

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

原创粉丝点击