{
*((&CANTDSR0)+i) = temp_data[i]; }
CANTDLR = dataLen; // 写入数据长度 }
////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////远程帧格式//////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// else {
CANTDLR = 0; // 远程帧
CANTIDR0 = temp_id[0]; CANTIDR1 = temp_id[1]; CANTIDR2 = temp_id[2]; CANTIDR3 = temp_id[3];
CANTIDR3_RTR = RTR;
CANTIDR1_SRR = 1; // 扩展格式时RTR置位 CANTIDR1_IDE = 1; // 扩展帧 }
CANTTBPR = priority; // 写入优先级
// 清TXx标志,缓冲器准备发送 CANTFLG = txEmptyBuf; // 相关位写1清零 return 1; }
//---------------------------------------------------------------------*
//函数名:VCAN_RX() * //功 能:中断程序处理 * //参 数: 无 * //返 回: 无 * //说 明: *
// (1)CAN时钟源使用芯片总线时钟,设置CAN通信频率为250KHz * // (2)关闭滤波器,接收CAN总线上所有的报文 * //---------------------------------------------------------------------*
#pragma CODE_SEG NON_BANKED interrupt 28 VCAN_RX (void) {
uint8 i;
CANRIER_RXFIE = 0; // 禁止接收中断
CANCTL0_RXFRM = 1;
////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////标准ID格式//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
if(0 == (CANRIDR1&0x08)) // 检测 CAN协议报文模式 (一般/扩展)识符 {
recID[0] = CANRIDR0; // 收到标准ID格式 recID[1] = CANRIDR1; // 收到标准ID格式
RTR = CANRIDR1_SRR; IDE = 0; }
//////////////////////////////////////////////////////////////////////////////////////////
标识符 读出标
////////////////////////////////////扩展ID格式//////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// else // 收到扩展格式ID {
recID[0] = CANRIDR0; // 收到扩展ID格式 recID[1] = CANRIDR1; // 收到扩展ID格式 recID[2] = CANRIDR2; // 收到扩展ID格式 recID[3] = CANRIDR3; // 收到扩展ID格式
RTR = CANRIDR3_RTR; IDE = 1; }
////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////数据帧格式//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
if(0 == RTR) // 判断是否为数据帧 {
dataLen = CANRDLR_DLC; // 读取数据帧长度
for(i = 0; i < dataLen &&i<8; i++) {
Rxdata[i] = *((&CANRDSR0)+i); // 读取数据 } }
////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////远程帧格式//////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
else // 远程帧 {
dataLen = CANRDLR_DLC;
sendID[0] = CANRIDR0; sendID[1] = CANRIDR1; sendID[2] = CANRIDR2; sendID[3] = CANRIDR3;
CANRIDR3_RTR = RTR;
CANTIDR1_SRR = RTR; CANTIDR1_IDE = 1; }
CANRFLG = 1;
CANRIER_RXFIE = 1; }
// 扩展格式时RTR置位 // 扩展帧 // 接收缓冲器已满 报文成功接收