#ifndef_I2C_H_#define_I2C_H_#includestm32f0xx.h#defineWRITE_MASK0xFE#defineREAD_MASK0x01/*************************SDA--PA10(输出)**SCL--PA9(输出)*************************///I2C输入端口定义#defineSDAGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)//I2C输出端口定义#defineSDA_0GPIO_ResetBits(GPIOA,GPIO_Pin_10)#defineSDA_1GPIO_SetBits(GPIOA,GPIO_Pin_10)#defineSCL_0GPIO_ResetBits(GPIOA,GPIO_Pin_9)#defineSCL_1GPIO_SetBits(GPIOA,GPIO_Pin_9)/*********************************************函数功能:初始化硬件I2C2接口**参数:无**返回值:无*********************************************/voidI2C_Configuration(void);voidI2C_Start(void);voidI2C_Stop(void);voidI2C_Write_Byte(u8data);u8I2C_Read_Byte(u8flag);/*************************************************************函数功能:通过I2C2接口向从机写数据函数**参数:addr:从机的设备地址,buff:数据缓冲区,length:数据长度**返回值:无*************************************************************/voidI2C_Write_Data(u8addr,u8*buff,u16length);/*************************************************************函数功能:通过I2C从从机读数据函数**参数:addr:从机的设备地址,buff:数据缓冲区,length:数据长度**返回值:无*************************************************************/voidI2C_Read_Data(u8addr,u8*buff,u16length);#endif//以下是源文件#includei2c.h/*********************************************函数功能:初始化模拟I2C接口**参数:无**返回值:无*********************************************/voidI2C_Configuration(void){/*************************SDA--PA10(输出)**SCL--PA9(输出)*************************/GPIO_InitTypeDefGPIO_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//输出GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;//开漏GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_9|GPIO_Pin_10);}voidI2C_Start(void){SCL_1;SDA_0;}voidI2C_Stop(void){SCL_1;SDA_1;}voidI2C_Write_Byte(u8data){u8i;for(i=0;i8;i++){SCL_0;(data&0x80)?SDA_1:SDA_0;SCL_1;data=data1;}SCL_0;SDA_1;//输出高电平,可以读取外设的输出SCL_1;while(SDA);//等待应答SCL_0;SDA_0;}u8I2C_Read_Byte(u8flag){u8i;u8data=0x00;SCL_0;SDA_1;//输出高电平,可以读取外设的输出for(i=0;i8;i++){data=data1;SCL_1;if(SDA){data|=0x01;}else{data&=~0x01;}SCL_0;}(flag)?SDA_0:SDA_1;//应答/不应答SCL_1;SCL_0;SDA_0;returndata;}/*************************************************************函数功能:通过I2C接口向从机写数据函数**参数:addr:从机的设备地址,buff:数据缓冲区,length:数据长度**返回值:无*************************************************************/voidI2C_Write_Data(u8addr,u8*buff,u16length){u16i;addr=addr1;addr&=WRITE_MASK;I2C_Start();I2C_Write_Byte(addr);//写地址并判断是否写成功for(i=0;ilength;i++)//写数据{I2C_Write_Byte(buff[i]);}I2C_Stop();}/*************************************************************函数功能:通过I2C从从机读数据函数**参数:addr:从机的设备地址,buff:数据缓冲区,length:数据长度**返回值:无*************************************************************/voidI2C_Read_Data(u8addr,u8*buff,u16length){u16i;addr=addr1;addr|=READ_MASK;I2C_Start();I2C_Write_Byte(addr);for(i=0;ilength;i++){if(i==(length-1))//是否为最后一个字节{buff[i]=I2C_Read_Byte(0);//读且不应答}else{buff[i]=I2C_Read_Byte(1);//读且应答}}I2C_Stop();}