//******************************************************************** // Ver 1.0 // 2019.09.26 1、新建文件 //******************************************************************** #include "config.h" I2C_Str I2C_Info; //I2C命令发送 void I2C_Cmd(en_i2c_channel_t enCh, INT8U tSTA, INT8U tSto, INT8U tAA) { I2C_SetFunc(enCh, I2cStart_En, tSTA); //STA=1 I2C_SetFunc(enCh, I2cAck_En, tAA); //AA=1 I2C_SetFunc(enCh, I2cStop_En, tSto); //STO=0 I2C_ClrIntFlag(enCh); I2C_Info.Info[enCh].ErrCnt = I2C_ErrCntMax; while(I2C_ReadIntFlag(enCh) == 0) { I2C_Info.Info[enCh].ErrCnt--; if(I2C_Info.Info[enCh].ErrCnt == 0) break; } I2C_SetFunc(enCh, I2cStart_En, tSTA); //STA=0 } //I2C离线状态检测 void I2C_OffLineCheck(en_i2c_channel_t enCh) { if(I2C_StateRead(enCh) == 0xf8) //I2C离线处理 { I2C_SetFunc(enCh, I2cMode_En, DISABLE); //关闭I2C模块 DELAY_Us(50); I2C_SetFunc(enCh, I2cMode_En, ENABLE); //使能I2C模块 DELAY_Us(50); } } //写一个字节到I2C缓冲区 void I2C_Write(en_i2c_channel_t enCh, INT8U Value) { I2C_WriteByte(enCh, Value); I2C_ClrIntFlag(enCh); I2C_Info.Info[enCh].ErrCnt = I2C_ErrCntMax; while(I2C_ReadIntFlag(enCh) == 0) { I2C_Info.Info[enCh].ErrCnt--; if(I2C_Info.Info[enCh].ErrCnt == 0) break; } } INT8U I2C_Read(en_i2c_channel_t enCh) { return(I2C_ReadByte(enCh)); } //I2C读取N个字节 void I2C_ReadMultiByte(en_i2c_channel_t enCh, INT8U Addr, INT8U Reg, INT8U *ptr, INT8U Len) { INT8U i; I2C_OffLineCheck(enCh); I2C_Start(enCh); I2C_Write(enCh, Addr); I2C_Write(enCh, Reg); I2C_Stop(enCh); I2C_Start(enCh); I2C_WriteByte(enCh, Addr | 0x01); for(i = 0; i < Len; i++) { if(i == (Len - 1)) { I2C_Ack(enCh, DISABLE); } else { I2C_Ack(enCh, ENABLE); } *ptr++ = I2C_Read(enCh); } I2C_Stop(enCh); } void I2C_WriteMultiByte(en_i2c_channel_t enCh, INT8U Addr, INT8U Reg, INT8U *ptr, INT8U Len) { I2C_OffLineCheck(enCh); I2C_Start(enCh); I2C_Write(enCh, Addr); I2C_Write(enCh, Reg); while(Len--) { I2C_Write(enCh, *ptr++); } I2C_Stop(enCh); } //I2C中断程序 void I2C0_IRQHandler(void) { INT8U tI2C0_State = I2C_StateRead(I2C0); switch (tI2C0_State) { case 0x00: //总线错误,发送停止信号 I2C_SetFunc(I2C0, I2cStop_En, ENABLE); //STO=1 I2C_Info.Info[I2C0].Cnt = 0; I2C_Info.Info[I2C0].ErrCnt = 0; I2C_Info.Info[I2C0].Flag = 0; break; case 0x08: I2C_SetFunc(I2C0, I2cStart_En, DISABLE); //STA=0 I2C_Write(I2C0, I2C_Info.Info[I2C0].Addr1); break; case 0x10: I2C_SetFunc(I2C0, I2cStart_En, DISABLE); //STA=0 if(I2C_Info.Info[I2C0].Flag == 0) { I2C_Write(I2C0, I2C_Info.Info[I2C0].Addr1); } else { I2C_Write(I2C0, I2C_Info.Info[I2C0].Addr2); } break; case 0x18: I2C_SetFunc(I2C0, I2cStart_En, DISABLE); //STA=0 I2C_Write(I2C0, I2C_Info.Info[I2C0].Addr1); break; case 0x20: case 0x30: case 0x38: case 0x48: I2C_SetFunc(I2C0, I2cStop_En, ENABLE); //STO=1 I2C_SetFunc(I2C0, I2cStart_En, ENABLE); //STA=1 break; case 0x28: if(I2C_Info.Info[I2C0].Flag != 0) { I2C_SetFunc(I2C0, I2cStart_En, ENABLE); //STA=1 I2C_SetFunc(I2C0, I2cStop_En, DISABLE); //STO=0 } else { I2C_Write(I2C0, I2C_Info.Info[I2C0].ptr[I2C_Info.Info[I2C0].Cnt++]); } if(I2C_Info.Info[I2C0].Cnt >= I2C_Info.Info[I2C0].Size) { I2C_Info.Info[I2C0].Cnt = 0; I2C_SetFunc(I2C0, I2cStop_En, ENABLE); } break; case 0x58: I2C_SetFunc(I2C0, I2cStop_En, ENABLE); //STO=1 I2C_SetFunc(I2C0, I2cAck_En, DISABLE); //AA=0 break; case 0x40: I2C_Info.Info[I2C0].Cnt = 0; I2C_SetFunc(I2C0, I2cAck_En, ENABLE); //AA=1 break; case 0x50: if(I2C_Info.Info[I2C0].Cnt >= I2C_Info.Info[I2C0].Size) { I2C_SetFunc(I2C0, I2cAck_En, DISABLE); //AA=0 I2C_SetFunc(I2C0, I2cStop_En, DISABLE); //STO=0 } else { I2C_SetFunc(I2C0, I2cAck_En, ENABLE); //AA=1 } I2C_Info.Info[I2C0].ptr[I2C_Info.Info[I2C0].Cnt++] = I2C_ReadByte(I2C0); break; default: break; } I2C_ClearIrq(I2C0); } void I2C1_IRQHandler(void) { INT8U tI2C1_State = I2C_StateRead(I2C1); switch (tI2C1_State) { case 0x00: //总线错误,发送停止信号 I2C_SetFunc(I2C1, I2cStop_En, ENABLE); //STO=1 I2C_Info.Info[I2C1].Cnt = 0; I2C_Info.Info[I2C1].ErrCnt = 0; I2C_Info.Info[I2C1].Flag = 0; break; case 0x08: I2C_SetFunc(I2C1, I2cStart_En, DISABLE); //STA=0 I2C_Write(I2C1, I2C_Info.Info[I2C1].Addr1); break; case 0x10: I2C_SetFunc(I2C1, I2cStart_En, DISABLE); //STA=0 if(I2C_Info.Info[I2C1].Flag == 0) { I2C_Write(I2C1, I2C_Info.Info[I2C1].Addr1); } else { I2C_Write(I2C1, I2C_Info.Info[I2C1].Addr2); } break; case 0x18: I2C_SetFunc(I2C1, I2cStart_En, DISABLE); //STA=0 I2C_Write(I2C1, I2C_Info.Info[I2C1].Addr1); break; case 0x20: case 0x30: case 0x38: case 0x48: I2C_SetFunc(I2C1, I2cStop_En, ENABLE); //STO=1 I2C_SetFunc(I2C1, I2cStart_En, ENABLE); //STA=1 break; case 0x28: if(I2C_Info.Info[I2C1].Flag != 0) { I2C_SetFunc(I2C1, I2cStart_En, ENABLE); //STA=1 I2C_SetFunc(I2C1, I2cStop_En, DISABLE); //STO=0 } else { I2C_Write(I2C1, I2C_Info.Info[I2C1].ptr[I2C_Info.Info[I2C1].Cnt++]); } if(I2C_Info.Info[I2C1].Cnt >= I2C_Info.Info[I2C1].Size) { I2C_Info.Info[I2C1].Cnt = 0; I2C_SetFunc(I2C1, I2cStop_En, ENABLE); } break; case 0x58: I2C_SetFunc(I2C1, I2cStop_En, ENABLE); //STO=1 I2C_SetFunc(I2C1, I2cAck_En, DISABLE); //AA=0 break; case 0x40: I2C_Info.Info[I2C1].Cnt = 0; I2C_SetFunc(I2C1, I2cAck_En, ENABLE); //AA=1 break; case 0x50: if(I2C_Info.Info[I2C1].Cnt >= I2C_Info.Info[I2C1].Size) { I2C_SetFunc(I2C1, I2cAck_En, DISABLE); //AA=0 I2C_SetFunc(I2C1, I2cStop_En, DISABLE); //STO=0 } else { I2C_SetFunc(I2C1, I2cAck_En, ENABLE); //AA=1 } I2C_Info.Info[I2C1].ptr[I2C_Info.Info[I2C1].Cnt++] = I2C_ReadByte(I2C1); break; default: break; } I2C_ClearIrq(I2C1); }