📄 canuser.c
字号:
#include "includes.h"
#define CAN_R_CONFIG 0 //读配置
#define CAN_W_CONFIG 1 //写配置
#define CAN_R_FIXED_VALUE 2 //读定值
#define CAN_W_FIXED_VALUE 3 //写定值
#define CAN_R_ANALOG 4 //读模拟量
#define CAN_R_DIGITAL 5 //读数字量
#define CAN_W_CONTROL 6 //写控制量
unsigned char ComRxBuffer[COM_RX_SIZE];
WORD ComTxBuffer[COM_TX_SIZE];
unsigned int Cell[15],
Temp[8];
unsigned int MAX_VOL,
MIN_VOL,
C_K_VOL,
T_K_VO1,
T_K_VO2,
HI_TEMP,
LO_TEMP;
unsigned int Temperature0,
Temperature1,
Tempervoltage0,
Tempervoltage1,
EVTemperature;
/*********************************************************************
* Function: void CanSendAnalog(void)
*
* PreCondition:
*
* Input: none
*
* Output: none
*
* Side Effects:
*
* Overview: Send the collect data to the top computer.
*
* Note: Data include voltage and temperature.
********************************************************************/
void CanSendAnalog(void)
{
unsigned char i;
for(i=0;i<5;i++)
{
while(CANIsTxRdy() == 0);
//CANPutTxPRI(3); //Send Priority highest
//EXIDE is clr in TXB0SIDL.EXIDE //帧格式 =0标准帧; =1扩展帧;
//TXRTR is clr in CANPutTxCnt(8); //帧类型 =0数据帧; =1远程帧;
//CANPutTxCnt(8); //数据长度 Data DLC
CANPutTxCID(BoardAddress,CAN_R_ANALOG); //CID 4
ComTxBuffer[0].bits.lbyte.L = i+1; //数据包号
ComTxBuffer[0].bits.hbyte.H = 7; //总包数
ComTxBuffer[1].W = Cell[i*3];
ComTxBuffer[2].W = Cell[i*3+1];
ComTxBuffer[3].W = Cell[i*3+2];
CANPutTxDataTyp0(ComTxBuffer);
CANSend(1);
}
while(CANIsTxRdy() == 0);
//CANPutTxPRI(3); //Send Priority highest
//EXIDE is clr in TXB0SIDL.EXIDE //帧格式 =0标准帧; =1扩展帧;
//TXRTR is clr in CANPutTxCnt(8); //帧类型 =0数据帧; =1远程帧;
//CANPutTxCnt(8); //数据长度 Data DLC
CANPutTxCID(BoardAddress,CAN_R_ANALOG); //CID 4
ComTxBuffer[0].bits.lbyte.L = 6; //数据包号
ComTxBuffer[0].bits.hbyte.H = 7; //总包数
ComTxBuffer[1].W = EVTemperature; //平均温度
ComTxBuffer[2].W = Temperature0; //温度0
ComTxBuffer[3].W = Temperature1; //温度1
CANPutTxDataTyp0(ComTxBuffer);
CANSend(1);
while(CANIsTxRdy() == 0);
//CANPutTxPRI(3); //Send Priority highest
//EXIDE is clr in TXB0SIDL.EXIDE //帧格式 =0标准帧; =1扩展帧;
//TXRTR is clr in CANPutTxCnt(8); //帧类型 =0数据帧; =1远程帧;
//CANPutTxCnt(8); //数据长度 Data DLC
CANPutTxCID(BoardAddress,CAN_R_ANALOG); //CID
ComTxBuffer[0].bits.lbyte.L = 7; //数据包号
ComTxBuffer[0].bits.hbyte.H = 7; //总包数
ComTxBuffer[1].W = Tempervoltage0; //1点温度对应电压值
ComTxBuffer[2].W = Tempervoltage1; //2点温度对应电压值
ComTxBuffer[3].W = 0; //无数据
CANPutTxDataTyp0(ComTxBuffer);
CANSend(1);
}
/*********************************************************************
* Function: void CanReciveConfig(void)
*
* PreCondition: Data should have been received prior to calling
* this function; otherwise, it is likely the returned
* count is either not valid or associated to the
* previous message. Use CANIsRxRdy() to determine if
* data is available.
*
* Input: none
*
* Output: none
*
* Side Effects:
*
* Overview: Top computer configure the collect board address.
*
* Note:
********************************************************************/
void CanReciveConfig(void)
{
if(ComRxBuffer[0] != 0) //收到有校数据
{
if((confaddress == 0))
{ //55为默认地址
BoardAddress = ComRxBuffer[2]; //address
if(BoardAddress > 55 && BoardAddress < 61)
{
eeprom_write_byte(0x06,BoardAddress);
BoardAddress = eeprom_read_byte(0x06);
}
else //如果地址超出范围且不是默认地址配置则地址不变
{
BoardAddress = eeprom_read_byte(0x06);
}
}
}
}
/*********************************************************************
* Function: void CanSendConfig(void)
*
* PreCondition: The configure message has received.
*
* Input: none
*
* Output: none
*
* Side Effects:
*
* Overview: Send the configure message to Top computer.
*
* Note:
********************************************************************/
void CanSendConfig(void)
{
while(CANIsTxRdy() == 0);
//CANPutTxPRI(3); //Send Priority highest
//EXIDE is clr in TXB0SIDL.EXIDE //帧格式 =0标准帧; =1扩展帧;
//TXRTR is clr in CANPutTxCnt(8); //帧类型 =0数据帧; =1远程帧;
//CANPutTxCnt(8); //数据长度 Data DLC
CANPutTxCID(0x00,CAN_R_CONFIG); //CID
ComTxBuffer[0].bits.lbyte.L = 1; //数据包号
ComTxBuffer[0].bits.hbyte.H = 1; //总包数
ComTxBuffer[1].bits.lbyte.L = BoardAddress; //巡检单元地址 55~60
ComTxBuffer[1].bits.hbyte.H = 0;
ComTxBuffer[2].W = 0;
ComTxBuffer[3].W = 0;
CANPutTxDataTyp0(ComTxBuffer);
CANSend(1);
}
///*********************************************************************
// * Function: void CanReceiveFixedValue()
// *
// * PreCondition: The configure message has received.
// *
// * Input: none
// *
// * Output: none
// *
// * Side Effects:
// *
// * Overview: Configure the Cell protect message.
// *
// * Note:
// ********************************************************************/
//void CanReceiveFixedValue(void)
//{
// if(ComRxBuffer[0] != 0) //收到有校数据
// {
// if(ComRxBuffer[0] == 1)
// {
// MAX_VOL = (ComRxBuffer[2]+((unsigned int)(ComRxBuffer[3])<<8));
// MIN_VOL = (ComRxBuffer[4]+((unsigned int)(ComRxBuffer[5])<<8));
// C_K_VOL = (ComRxBuffer[6]+((unsigned int)(ComRxBuffer[7])<<8));
// }
// if(ComRxBuffer[0] == 2)
// {
// HI_TEMP = (ComRxBuffer[2]+((unsigned int)(ComRxBuffer[3])<<8));
// LO_TEMP = (ComRxBuffer[4]+((unsigned int)(ComRxBuffer[5])<<8));
// }
// }
//}
/*********************************************************************
* Function: void CanReceiveFixedValue()
*
* PreCondition: The configure message has received.
*
* Input: none
*
* Output: none
*
* Side Effects:
*
* Overview: 单体电池电压与两路温度系数
*
* Note:
********************************************************************/
void CanReceiveFixedValue(void)
{
if(ComRxBuffer[0] != 0) //收到有校数据
{
T_K_VO1 = (ComRxBuffer[2]+((unsigned int)(ComRxBuffer[3])<<8));//1点温度系数
if(T_K_VO1 > 6000 && T_K_VO1 <15000)
{
eeprom_write_word(8,T_K_VO1);
T_K_VO1 = eeprom_read_word(8);
}
else
{
T_K_VO1 = eeprom_read_word(8);
}
T_K_VO2 = (ComRxBuffer[4]+((unsigned int)(ComRxBuffer[5])<<8));//2点温度系数
if(T_K_VO2 > 6000 && T_K_VO2 <15000)
{
eeprom_write_word(10,T_K_VO2);
T_K_VO2 = eeprom_read_word(10);
}
else
{
T_K_VO2 = eeprom_read_word(10);
}
C_K_VOL = (ComRxBuffer[6]+((unsigned int)(ComRxBuffer[7])<<8));//单只电压系数
if(C_K_VOL > 6000 && C_K_VOL <15000)
{
eeprom_write_word(12,C_K_VOL);
C_K_VOL = eeprom_read_word(12);
}
else
{
C_K_VOL = eeprom_read_word(12);
}
}
}
/*********************************************************************
* Function: CanSendFixedValue(void)
*
* PreCondition: The configure message has received.
*
* Input: none
*
* Output: none
*
* Side Effects:
*
* Overview: Send the configure Cell protect message to the top
* computer.
*
* Note:
********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -