#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);
}
一周热门 更多>