⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can_fw.c

📁 嵌入式软件构件:TMR计时器管理、CLK实时时钟、KEY键盘扫描、LED数码显示、LCD显示、COMM串口通信
💻 C
字号:
/*
*********************************************************************************************************
* Filename   : CAN_FW.C
* Programmer : Haven
* 描述:      CAN通信程序
* DATE:        2007.11.18
****************************************************************************************
*/
#define CAN_GLOBALS
#include "..\includes\includes.H"

CAN_MSG CAN1TxMsg;
CAN_MSG CAN2TxMsg; // TX and RX Buffers for CAN message

CAN_MSG CAN1RxMsg;
CAN_MSG CAN2RxMsg; // TX and RX Buffers for CAN message

/******************************************************************************
** Function name:		CAN_MSG  CANGetRxMsg (INT8U ch)
** Descriptions:		从CAN接收缓冲区读出数据
** parameters:			ch 通道
** Returned value:		读出数据(CANFRAME结构)
******************************************************************************/

CANFRAME  CANGetRxMsg (INT8U ch)
{
    CANFRAME rxmsg;
    CAN_MSG  msg;
    switch(ch){
        case CAN1:
            OS_ENTER_CRITICAL();
            msg = CAN1RxMsg;
            OS_EXIT_CRITICAL();
            break;
        case CAN2:
            OS_ENTER_CRITICAL();
            msg = CAN2RxMsg;
            OS_EXIT_CRITICAL();
            break;
    }
    rxmsg.len  = (INT8U)((msg.Frame>>16)&0x0000003f);
    rxmsg.id   = msg.MsgID;
    rxmsg.CANBuf.CANDataAB[0] = msg.DataA;
    rxmsg.CANBuf.CANDataAB[1] = msg.DataB;
    return rxmsg;
}
/******************************************************************************
** Function name:		CAN_MSG  CANGetRxMsg (INT8U ch)
** Descriptions:		向CAN发送数据 
** parameters:			1、ch   通道, CAN1,CAN2
                        2、txmsg  要发送的数据指针 包括: 标识符 11位 长度<=8  数据 
** Returned value:		无
******************************************************************************/
void  CANPutTxMsg (INT8U ch,CANFRAME *txmsg)
{
    switch(ch){
        case CAN1:
            CAN1TxMsg.Frame = (INT32U)(txmsg->len << 16);//如果是29位ID,把最高位置1
            CAN1TxMsg.MsgID = txmsg->id;
            CAN1TxMsg.DataA = txmsg->CANBuf.CANDataAB[0];
            CAN1TxMsg.DataB = txmsg->CANBuf.CANDataAB[1];
            break;
        case CAN2:
            CAN2TxMsg.Frame = (INT32U)(txmsg->len << 16);//如果是29位ID,把最高位置1
            CAN2TxMsg.MsgID = txmsg->id;
            CAN2TxMsg.DataA = txmsg->CANBuf.CANDataAB[0];
            CAN2TxMsg.DataB = txmsg->CANBuf.CANDataAB[1];
            break;
    }
    //while ( !(CAN1GSR & (1 << 3)) );//检测是否有一发送请求没有完成
    CANSendMessage(ch);
}            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -