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