u8 I2C_EE_ReadByte(u8 xChip, u16 xAddr, u8 *xpErr)
{
u8 dat;
u8 errcnt;
u32 tmr;
//发送I2C_Stop条件也能让从设备释放总线
//if(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
{
I2C_Cmd(I2C1, DISABLE);
I2C_SDA_SCL_GPIO_MODE(GPIO_Speed_2MHz,GPIO_Mode_Out_OD,GPIO_Mode_Out_OD);
GPIO_ResetBits(SDA_port,SDA_pin); //sda=0;
GPIO_SetBits(SCL_port,SCL_pin); //scl=1;
GPIO_SetBits(SDA_port,SDA_pin); //sda=1;
I2C_SDA_SCL_GPIO_MODE(GPIO_Speed_10MHz,GPIO_Mode_AF_OD,GPIO_Mode_AF_OD);
I2C_Cmd(I2C1, ENABLE);
}
errcnt = 0;
tmr = ulTimeOut_Time;
while((tmr--)&&(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)));
if(tmr ==0) errcnt++;
I2C_GenerateSTART(I2C1, ENABLE);
// 发送I2C的START信号,接口自动从从设备编程主设备
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)));
// 检查I2C的EV5状态并清除
if(tmr ==0) errcnt++;
I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Transmitter);
// 发送从地址(EEPROM设备地址)和写命令
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));
// 检查I2C的EV6状态并清除
if(tmr ==0) errcnt++;
I2C_SendData(I2C1, (u8)((xAddr >>8)&0x00ff));
// 发送 EEPROM 的存储空间地址(高字节)
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
// 检查I2C的EV8状态并清除
if(tmr ==0) errcnt++;
I2C_SendData(I2C1, (u8)(xAddr&0x00ff));
// 发送 EEPROM 的存储空间地址(低字节)
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
// 检查I2C的EV8状态并清除
if(tmr ==0) errcnt++;
I2C_GenerateSTART(I2C1, ENABLE);
// 发送I2C的START信号,接口自动从从设备编程主设备
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)));
// 检查I2C的EV5状态并清除
if(tmr ==0) errcnt++;
I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Receiver);
// 发送从地址(EEPROM设备地址)和读命令
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)));
// 检查I2C的EV6状态并清除
if(tmr ==0) errcnt++;
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));
// 检查I2C的EV7状态并清除
if(tmr ==0) errcnt++;
*xpErr = errcnt;
dat = I2C_ReceiveData(I2C1);
// 接收数据
I2C_GenerateSTOP(I2C1, ENABLE);
// 发送I2C的STOP信号,接口自动从主设备编程从设备
I2C_Cmd(I2C1, DISABLE);
// 失能总线
return(dat);
}
//写数据
u8 I2C_EE_WriteByte(u8 xChip, u16 xAddr, u8 xDat)
{
u32 tmr;
u8 errcnt;
//发送I2C_Stop条件也能让从设备释放总线
//if(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY))
{
I2C_Cmd(I2C1, DISABLE);
I2C_SDA_SCL_GPIO_MODE(GPIO_Speed_2MHz,GPIO_Mode_Out_OD,GPIO_Mode_Out_OD);
GPIO_ResetBits(SDA_port,SDA_pin); //sda=0;
GPIO_SetBits(SCL_port,SCL_pin); //scl=1;
GPIO_SetBits(SDA_port,SDA_pin); //sda=1;
I2C_SDA_SCL_GPIO_MODE(GPIO_Speed_10MHz,GPIO_Mode_AF_OD,GPIO_Mode_AF_OD);
I2C_Cmd(I2C1, ENABLE);
}
errcnt = 0;
tmr = ulTimeOut_Time;
while((tmr--)&&(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)));
if(tmr ==0) errcnt++;
I2C_GenerateSTART(I2C1, ENABLE);
// 发送I2C的START信号,接口自动从从设备编程主设备
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)));
// 检查I2C的EV5状态并清除
if(tmr ==0) errcnt++;
I2C_Send7bitAddress(I2C1, xChip, I2C_Direction_Transmitter);
// 发送从地址(EEPROM设备地址)
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)));
// 检查I2C的EV6状态并清除
if(tmr ==0) errcnt++;
I2C_SendData(I2C1, (u8)((xAddr >>8)&0x00ff));
// 发送 EEPROM 的存储空间地址(高字节)
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
// 检查I2C的EV8状态并清除
if(tmr ==0) errcnt++;
I2C_SendData(I2C1, (u8)(xAddr&0x00ff));
// 发送 EEPROM 的存储空间地址(低字节)
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
// 检查I2C的EV8状态并清除
if(tmr ==0) errcnt++;
I2C_SendData(I2C1, xDat);
// 发送数据
tmr = ulTimeOut_Time;
while((tmr--)&&(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));
// 检查I2C的EV8状态并清除
if(tmr ==0) errcnt++;
I2C_GenerateSTOP(I2C1, ENABLE);
// 发送I2C的STOP信号,接口自动从主设备编程从设备
I2C_Cmd(I2C1, DISABLE);
tmr = ulTimeOut_Time;
while(tmr--);
return(errcnt);
}
交流QQ群:74204669
文章评论(0条评论)
登录后参与讨论