《STM32模拟iic驱动eeprom24c128》由会员分享,可在线阅读,更多相关《STM32模拟iic驱动eeprom24c128(9页珍藏版)》请在金锄头文库上搜索。
1、STM32 模拟 iic 驱动 eeprom24c128void IIC_Init(void) /IIC 初始化函数 GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE, ENABLE); /使能 GPIOB 时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /推挽输出GPIO_InitStructure.GPIO_Speed =
2、GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_SetBits(GPIOE,GPIO_Pin_2|GPIO_Pin_3); /PE2,PE3 输出高void IIC_Start(void) /IIC 开始函数SDA_OUT(); /sda 线输出IIC_SDA=1; IIC_SCL=1;delay_us(5);IIC_SDA=0;/START:when CLK is high,DATA change form high to low delay_us(5);IIC_SCL=0; /钳住 I2C 总线,准备发送或接收数据 v
3、oid IIC_Stop(void) /IIC 停止函数SDA_OUT();/sda 线输出IIC_SCL=0;IIC_SDA=0;/STOP:when CLK is high DATA change form low to highdelay_us(5);IIC_SCL=1; IIC_SDA=1;/发送 I2C 总线结束信号delay_us(5); u8 IIC_Wait_Ack(void) /等待应答u8 ucErrTime=0;SDA_IN(); /SDA 设置为输入 IIC_SDA=1;delay_us(5); IIC_SCL=1;delay_us(1); while(READ_SDA
4、)ucErrTime+;if(ucErrTime250)IIC_Stop();return 1;IIC_SCL=0;/时钟输 出 0 return 0; 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;
5、void IIC_Send_Byte(u8 txd) /IIC 发送一个字节 u8 t; SDA_OUT(); /数据 线输出模式 IIC_SCL=0; /拉低 时钟开始数据传输for(t=0;t7;txd8);/发送高地址IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); /发送低地址IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0XA1); /进入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop(); /产生一个停止条件 return temp;void A
6、T24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) IIC_Start(); IIC_Send_Byte(0XA0); /发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr8);/发送高地址IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); /发送低地址IIC_Wait_Ack();IIC_Send_Byte(DataToWrite); /发送字节IIC_Wait_Ack();IIC_Stop();/产生一个停止条件 delay_ms(20); u8 AT24CXX_Ch
7、eck(void)u8 temp;temp=AT24CXX_ReadOneByte(12333);/避免每次开机都写AT24CXX if(temp=0X55)return 0;else/排除第一次初始化的情况AT24CXX_WriteOneByte(12333,0X55);temp=AT24CXX_ReadOneByte(12333); if(temp=0X55)return 0;return 1; void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)while(NumToRead)*pBuffer+=AT24CXX_ReadOneByte(ReadAddr+);NumToRead-; void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)while(NumToWrite-)AT24CXX_WriteOneByte(WriteAddr,*pBuffer);WriteAddr+;pBuffer+;BY MaiLaoDie