📄 232tocan.c
字号:
BASIC_TX_ID1 = Can_txbuf[0];
BASIC_TX_ID2 = Can_txbuf[1];
//发送请求
BASIC_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
else
{
//数据总长度
length = Can_txcount - 2;
length1 = length / 8;
length2 = length % 8;
//数据区起始位置
length = 2;
//8的整倍数
if (length1 > 0)
{
for (t_a = 0; t_a < length1; t_a++)
{
t_b = 0;
//无发送
while ((BASIC_STATUS_REG & 0x20) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
BASIC_TX_ID1 = Can_txbuf[0];
BASIC_TX_ID2 = (Can_txbuf[1] & 0xf0) | 0x08;
for (t_b = 0; t_b < 8; t_b++)
{
PBYTE[12 + t_b] = Can_txbuf[length++];
}
//发送请求
BASIC_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
}
//小于8
if (length2 > 0)
{
t_b = 0;
//无发送
while ((BASIC_STATUS_REG & 0x20) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
BASIC_TX_ID1 = Can_txbuf[0];
BASIC_TX_ID2 = (Can_txbuf[1] & 0xf0) | length2;
for (t_b = 0; t_b < length2; t_b++)
{
PBYTE[12 + t_b] = Can_txbuf[length++];
}
//发送请求
BASIC_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
}
}
*/
}
//PeliCAN
else
{
//标准帧
if ((Can_txbuf[1] & 0x80) == 0)
{
//是否为远程帧
if ((Can_txbuf[1] & 0x40) > 0)
{
t_b = 0;
//无接收、发送
while ((PELI_STATUS_REG & 0x30) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
TX_FRAME_INFO = Can_txbuf[1];
var.t[0] = Can_txbuf[2];
var.t[1] = Can_txbuf[3];
var.cc <<= 5;
PELI_TX_ID1 = var.t[0];
PELI_TX_ID2 = var.t[1];
//发送请求
PELI_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((PELI_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
else
{
t_b = 0;
//无发送
while ((PELI_STATUS_REG & 0x30) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
//数据总长度
length = Can_txcount - 7;
TX_FRAME_INFO = length;
var.t[0] = Can_txbuf[2];
var.t[1] = Can_txbuf[3];
var.cc <<= 5;
PELI_TX_ID1 = var.t[0];
PELI_TX_ID2 = var.t[1];
t_a = 4;
for (t_b = 0; t_b < length; t_b++)
{
PBYTE[19 + t_b] = Can_txbuf[t_a++];
}
//发送请求
PELI_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((PELI_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
}
/*
//扩展帧
else
{
//至少五个字节
if (Can_txcount > 4)
{
//是否为远程帧
if ((Can_txbuf[0] & 0x40) > 0)
{
t_b = 0;
//无接收、发送
while ((PELI_STATUS_REG & 0x30) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
TX_FRAME_INFO = Can_txbuf[0];
PELI_TX_ID1 = Can_txbuf[1];
PELI_TX_ID2 = Can_txbuf[2];
PELI_TX_ID3 = Can_txbuf[3];
PELI_TX_ID4 = Can_txbuf[4];
//发送请求
PELI_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((PELI_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
else
{
//数据总长度
length = Can_txcount - 5;
length1 = length / 8;
length2 = length % 8;
//数据区起始位置
length = 5;
//8的整倍数
if (length1 > 0)
{
for (t_a = 0; t_a < length1; t_a++)
{
t_b = 0;
//无发送
while ((PELI_STATUS_REG & 0x30) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
TX_FRAME_INFO = 0x88;
PELI_TX_ID1 = Can_txbuf[1];
PELI_TX_ID2 = Can_txbuf[2];
PELI_TX_ID3 = Can_txbuf[3];
PELI_TX_ID4 = Can_txbuf[4];
for (t_b = 0; t_b < 8; t_b++)
{
PBYTE[21 + t_b] = Can_txbuf[length++];
}
//发送请求
PELI_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((PELI_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
}
//小于8
if (length2 > 0)
{
t_b = 0;
//无发送
while ((PELI_STATUS_REG & 0x30) > 0)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
TX_FRAME_INFO = (Can_txbuf[0] & 0x80) | length2;
PELI_TX_ID1 = Can_txbuf[1];
PELI_TX_ID2 = Can_txbuf[2];
PELI_TX_ID1 = Can_txbuf[3];
PELI_TX_ID2 = Can_txbuf[4];
for (t_b = 0; t_b < length2; t_b++)
{
PBYTE[21 + t_b] = Can_txbuf[length++];
}
//发送请求
PELI_COMMAND_REG = TR_CMD;
//PELI_COMMAND_REG = SRR_CMD;
t_b = 0;
//发送是否完毕
while ((PELI_STATUS_REG & 0x0c) != 0x0c)
{
Somenop();
//超时处理
if (++t_b == 255)
{
Can_err = 1;
return;
}
}
SEND_LED = 0;
}
}
}
}
*/
}
}
void Com_send_data(void)
{
uchar t_a;
//串口正在发送数据,不启动
if (!Com_send_now && Com_send_ready)
{
Com_txbuf[0] = COM_HEAD;
Com_txbuf[1] = Can_rxbuf[0];
Com_txbuf[2] = Can_rxbuf[1];
Com_txbuf[3] = Can_rxbuf[2];
Sum_data(&Can_rxbuf[0], Can_rxcount);
Com_txcount = 4;
//数据帧
if (Can_rxcount != 3)
{
for (t_a = 3; t_a < Can_rxcount; t_a++)
{
Com_txbuf[Com_txcount++] = Can_rxbuf[t_a];
}
}
//累加和
Com_txbuf[Com_txcount++] = Add.t[0];
Com_txbuf[Com_txcount++] = Add.t[1];
Com_txbuf[Com_txcount++] = COM_END;
//释放CAN接收缓冲区
Can_rxcount = 0;
Com_send_ready = 0;
//启动发送
Com_send_now = 1;
Telcom = Com_txbuf;
SBUF = *Telcom;
}
}
//主程序
void main(void)
{
WP = 0; //一上电,默认使用内部扩展RAM
X5045_init(); //初始化SPI总线
Mcu_init(); //MCU初始化
Dog(); //喂狗
Write_reg(BO); //禁止保护
Clear_blank(); //是否对X5045各单元初始化参数
Read_cs(); //从EEPROM中读出各参数
Debug_config(); //调试程序处理
Write_reg(BL); //开启保护
Baudrate(ComBaud); //串口波特率设置
AUXR = EXRAM_ENABLE; //关闭内部扩展RAM,访问外部扩展RAM
Can_config(); //CAN初始化配置
for (;;)
{
Dog();
Com_send_data();
Can_send_data(); //CAN发送数据
//CAN通讯出错
if (_testbit_(Can_err))
{
Can_config(); //CAN初始化配置
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -