#include "../main/SystemInclude.h" //************************************************************************************* #ifndef ENABLE_USER_I2C #pragma message("[undefined] ENABLE_USER_I2C") #elif(ENABLE_USER_I2C) //************************************************************************************* /******************************************************************************************************** **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CResetProcess(void) { I2CData.txCounter = 0; // 重新初始化数据发送和接收计数器 I2CData.rxCounter = 0; I2CData.state.Command = 0; // 清除命令码接收完成标志 I2CData.state.WriteData = 0; I2CData.state.ReceivedAdr = 0; I2CData.state.CommError = 1; } /******************************************************************************************************** 函数功能:处理从机I2C接收到START+ADDRESS+读命令 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CStartReadProcess(void) { I2CData.state.ReceivedAdr = 0; // 清除命令码接收完成标志 I2CData.state.WriteData = 0; I2CData.txCounter = 0; // 重新初始化数据发送和接收计数器 I2CData.rxCounter = 0; } void SetI2CDataToRead(void) { } /******************************************************************************************************** 函数功能:处理从机I2C接收到START+ADDRESS+写命令 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CStartWriteProcess(void) { I2CData.txCounter = 0; // 重新初始化数据发送和接收计数器 I2CData.rxCounter = 0; I2CData.state.ReceivedAdr = 0; // 清除命令码接收完成标志 I2CData.state.WriteData = 1; } /******************************************************************************************************** 函数功能:处理从机I2C接收数据 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CReceiveProcess(void) { TypeWord wtData; if(I2CData.rxCounter == SMB_CMD_READ){ // 要操作的地址2个字节接收完成 // if(I2CData.state.WriteData) return; I2CData.state.ReceivedAdr = 1; wtData.Byte[1] = I2CData.rxData[0]; wtData.Byte[0] = I2CData.rxData[1]; I2CData.readAddr = wtData.Word; I2CReadDataFromMemory();//读取数据 存放到I2CData.RxData I2CDataCopyToSendBuf(); //得到 I2CData.txData } else if(I2CData.rxCounter > 200){ I2CData.rxCounter = 0; I2CData.state.CommError = 1; } } /******************************************************************************************************** 函数功能:处理从机I2C发送数据 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CTransmitProcess(void) { if(I2CData.txCounter < 3) return; I2CData.txCounter = 0; I2CData.regCounter++; if(I2CData.regCounter >= I2CData.regLen) I2CReadDataFromMemory(); I2CDataCopyToSendBuf(); } /******************************************************************************************************** 函数功能:将已读取的寄存器数据放到发送缓冲区 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CDataCopyToSendBuf(void) { I2CData.txData[0] = I2CData.rxData[I2CData.Index++]; I2CData.txData[1] = I2CData.rxData[I2CData.Index++]; I2CData.txData[2] = I2CWordCrc(I2CData.txData[0], I2CData.txData[1]); I2CData.txCounter = 0; } /******************************************************************************************************** 函数功能:准备从机I2C需要发送的数据,从内存中读出 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CReadDataFromMemory(void) { // 读取数据 // 按2个字节读取,如果寄存器>2个字节,将返回实际字节个数 MBBuf.StartAddr = I2CData.readAddr; MBBuf.ByteNumber = 2; MBBuf.RxPointer = &I2CData.rxData[2]; // 读取的数据从2开始放,0,1用于存储接收到的地址 MBBuf.Index = 0; ModBusReadMultiByte(); // if(MBBuf.StartAddr == 0x0081){ // I2CData.rxData[2] = 0x00; // I2CData.rxData[3] = 0x02; // } // else{ // I2CData.rxData[2] = 0x27; // I2CData.rxData[3] = 0x10; // } // MBBuf.DataByte = 2; MBBuf.DataByte >>= 1; I2CData.regLen = MBBuf.DataByte; I2CData.readAddr += MBBuf.DataByte; // 下一次读取数据的地址 I2CData.regCounter = 0; I2CData.Index = 2; } /******************************************************************************************************** 函数功能:准备从机I2C发送缓存数据 **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ void I2CDataProcessing(void) { TypeWord wtData; u16 I, wtIndex=0; //---------------------------------------------------------------------------- I2CData.state.ReceivedData = 0; systemProcess.Bit.I2CHandle = 0; //---------------------------------------------------------------------------- if(I2CData.rxCounter < 5) return; disable_interrupts(); //---------------------------------------------------------------------------- //写寄存器个数 MBBuf.ByteNumber = (I2CData.rxCounter - 2) / 3; MBBuf.ByteNumber <<= 1; wtData.Byte[1] = I2CData.rxData[0]; wtData.Byte[0] = I2CData.rxData[1]; MBBuf.StartAddr = wtData.Word; MBBuf.EndAddr = MBBuf.StartAddr + MBBuf.ByteNumber; for(I = 0; I < MBBuf.ByteNumber; I++) { wtData.Byte[1] = I2CData.rxData[3*I+2]; wtData.Byte[0] = I2CData.rxData[3*I+3]; //wtData.Byte[2] = I2CData.rxData[3*I+4]; //if(wtData.Byte[2] != CRC8_Talbe_I2CWord(wtData.Word[0])) { if(I2CData.rxData[3*I+4] != I2CWordCrc(wtData.Byte[1],wtData.Byte[0])) { enable_interrupts(); return; } I2CData.rxData[wtIndex++] = wtData.Byte[1]; I2CData.rxData[wtIndex++] = wtData.Byte[0]; } MBBuf.Index = 0; MBBuf.RxPointer = I2CData.rxData; //ModBusWriteMultiByte(); enable_interrupts(); } //------------------------------------------------------------------------------ #endif //------------------------------------------------------------------------------