STM32模拟iic驱动eeprom24c128
void IIC_Init(void) {
//IIC初始化函数
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE,
//使能GPIOB时钟
ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_SetBits(GPIOE,GPIO_Pin_2|GPIO_Pin_3);
//PE2,PE3 输出高 }
void IIC_Start(void) {
SDA_OUT(); //sda线输出 IIC_SDA=1; IIC_SCL=1; delay_us(5);
IIC_SDA=0;//START:when CLK is high,DATA change form
//IIC开始函数
high to low
delay_us(5);
IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
void IIC_Stop(void)//IIC停止函数 {
SDA_OUT();//sda线输出 IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form
low to high }
u8 IIC_Wait_Ack(void) {
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入 IIC_SDA=1; delay_us(5); IIC_SCL=1;
//等待应答
delay_us(5); IIC_SCL=1;
IIC_SDA=1;//发送I2C总线结束信号 delay_us(5);
}
delay_us(1); while(READ_SDA) { }
IIC_SCL=0;//时钟输出0 return 0; ucErrTime++; if(ucErrTime>250) { }
IIC_Stop(); return 1;
void IIC_Ack(void) //SDA输出低电平,IIC应答 {
IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(2); IIC_SCL=1; delay_us(4); IIC_SCL=0;
}
void IIC_NAck(void) //SDA输出高电平,IIC非应答 {
IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(2); IIC_SCL=1; delay_us(4); IIC_SCL=0;
//IIC发送一个字节
}
void IIC_Send_Byte(u8 txd) { u8 t;
SDA_OUT();
//数据线输出模式
IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) {
IIC_SDA=(txd&0x80)>>7; txd<<=1;
delay_us(5); //对TEA5767这三个延时都是必须的 IIC_SCL=1;
delay_us(5); IIC_SCL=0; delay_us(5);
} }
u8 IIC_Read_Byte(unsigned char ack)//IIC读取一个字节 {
unsigned char i,receive=0; SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ ) {
IIC_SCL=0; delay_us(5);
IIC_SCL=1;
receive<<=1; if(READ_SDA) { }
delay_us(5);
receive++;
}
if (!ack)