AT24C02程序分享

2019-07-21 04:46发布

#include "at24c02.h"

GPIO_InitTypeDef  GPIO_InitStruct;

void  SDA_OUT()
{
           GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
           GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
           GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void SDA_IN()
{
     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
           GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
     GPIO_Init(GPIOB,&GPIO_InitStruct);
}
void IICInit()
{
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
           GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
           GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
           GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
     GPIO_Init(GPIOB,&GPIO_InitStruct);
           SDA_OUT();
}
void IIC_Start()
{
     SDA_OUT();
           SCL=1;
           SDA=1;
           delay_us(4);
           SDA=0;
           delay_us(4);
           SCL=0;
}
void IIC_Stop()
{
     SDA_OUT();
           SCL=0;
           SDA=0;
           delay_us(4);
           SCL=1;
           delay_us(4);
           SDA=1;
           delay_us(4);
}
u8 IIC_Wait_Ack()
{
     u8 t=0;
           SDA_IN();
           delay_us(1);
           SCL=1;
           delay_us(1);
           while(RSDA)
                 {
                     t++;
                           if(t>250)
                                 {
                                    IIC_Stop();
            return 1;                                         
                                 }
                 }
                 SCL=0;
                 return 0;
}
void IIC_Send_Byte(u8 data)
{
     int i=0;
           SDA_OUT();
           SCL=0;
           for(i=0;i<8;i++)
           {
                           if((data&0x80)>>7)
                              SDA=1;
                                 else
                                          SDA=0;
                           data<<=1;
                           delay_us(2);
                           SCL=1;
                           delay_us(2);
                                 SCL=0;
                                 delay_us(2);
                 }
}
u8 IIC_Read_Byte()
{
     int i=0;
     u8 rdata;
     SDA_IN();
     for(i=0;i<8;i++)
     {
                     SCL=0;
                           delay_us(2);
                           SCL=1;
                           rdata<<=1;
                           if(RSDA) rdata++;
                           delay_us(2);
                 }
                 SDA_OUT();
     SCL=0;
     SDA=0;
     delay_us(2);
     SCL=1;
     delay_us(2);
     SCL=0;                 
                 return rdata;
}

u8 AT24C02_ReadOneByte(u16 addr)
{
     u8 data;
           IIC_Start();
           IIC_Send_Byte(0XA0);
           IIC_Wait_Ack();
           IIC_Send_Byte(addr);
           IIC_Wait_Ack();
           IIC_Start();
           IIC_Send_Byte(0XA1);
           IIC_Wait_Ack();
           data=IIC_Read_Byte();
           IIC_Stop();
           return data;
}
void AT24C02_WriteOneByte(u16 addr,u8 data)
{
     IIC_Start();
           IIC_Send_Byte(0XA0);
           IIC_Wait_Ack();
           IIC_Send_Byte(addr);
           IIC_Wait_Ack();
           IIC_Send_Byte(data);
           IIC_Wait_Ack();
           IIC_Stop();
           delay_ms(10);         
}


0条回答

一周热门 更多>