Files
CHJ/user/Protocol/HWI2CProtocol.c

192 lines
7.3 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
//*************************************************************************************
#ifndef ENABLE_USER_I2C
#pragma message("[undefined] ENABLE_USER_I2C")
#elif(ENABLE_USER_I2C)
//*************************************************************************************
/********************************************************************************************************
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CResetProcess(void)
{
I2CData.txCounter = 0; // <20><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͺͽ<CDBA><CDBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
I2CData.rxCounter = 0;
I2CData.state.Command = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
I2CData.state.WriteData = 0;
I2CData.state.ReceivedAdr = 0;
I2CData.state.CommError = 1;
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>START+ADDRESS+<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CStartReadProcess(void)
{
I2CData.state.ReceivedAdr = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
I2CData.state.WriteData = 0;
I2CData.txCounter = 0; // <20><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͺͽ<CDBA><CDBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
I2CData.rxCounter = 0;
}
void SetI2CDataToRead(void)
{
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>START+ADDRESS+д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CStartWriteProcess(void)
{
I2CData.txCounter = 0; // <20><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͺͽ<CDBA><CDBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
I2CData.rxCounter = 0;
I2CData.state.ReceivedAdr = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
I2CData.state.WriteData = 1;
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CReceiveProcess(void)
{
TypeWord wtData;
if(I2CData.rxCounter == SMB_CMD_READ){
// Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ2<D6B7><32><EFBFBD>ֽڽ<D6BD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 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();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> <20><><EFBFBD>ŵ<EFBFBD>I2CData.RxData
I2CDataCopyToSendBuf(); //<2F>õ<EFBFBD> I2CData.txData
}
else if(I2CData.rxCounter > 200){
I2CData.rxCounter = 0;
I2CData.state.CommError = 1;
}
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CTransmitProcess(void)
{
if(I2CData.txCounter < 3) return;
I2CData.txCounter = 0;
I2CData.regCounter++;
if(I2CData.regCounter >= I2CData.regLen) I2CReadDataFromMemory();
I2CDataCopyToSendBuf();
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѷ<EFBFBD>ȡ<EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
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;
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>I2C<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CReadDataFromMemory(void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// <20><>2<EFBFBD><32><EFBFBD>ֽڶ<D6BD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>>2<><32><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ֽڸ<D6BD><DAB8><EFBFBD>
MBBuf.StartAddr = I2CData.readAddr;
MBBuf.ByteNumber = 2;
MBBuf.RxPointer = &I2CData.rxData[2]; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>2<EFBFBD><32>ʼ<EFBFBD>ţ<EFBFBD>0<EFBFBD><30>1<EFBFBD><31><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>յ<EFBFBD><D5B5>ĵ<EFBFBD>ַ
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; // <20><>һ<EFBFBD>ζ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݵĵ<DDB5>ַ
I2CData.regCounter = 0;
I2CData.Index = 2;
}
/********************************************************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void I2CDataProcessing(void)
{
TypeWord wtData;
u16 I, wtIndex=0;
//----------------------------------------------------------------------------
I2CData.state.ReceivedData = 0;
systemProcess.Bit.I2CHandle = 0;
//----------------------------------------------------------------------------
if(I2CData.rxCounter < 5) return;
disable_interrupts();
//----------------------------------------------------------------------------
//д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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
//------------------------------------------------------------------------------