Files
CHJ/user/Protocol/HWI2CProtocol.c
2026-03-20 21:16:58 +08:00

192 lines
7.3 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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开始放01用于存储接收到的地址
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
//------------------------------------------------------------------------------