192 lines
7.3 KiB
C
192 lines
7.3 KiB
C
|
|
#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
|
|||
|
|
//------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|