?? test_can.c
字號:
#include "f2407_c.h" // 引用頭部文件
int CAN_FLAG; // 定義標志寄存器
void sytem_init(); // 聲明在程序中需要用到的函數
void CANMBX_ISR();
void CAN_INIT();
void inline disable() // 中斷屏蔽子程序
{
asm(" setc INTM");
}
void inline enable() // 中斷使能子程序
{
asm(" clrc INTM");
}
main()
{
sytem_init(); // 系統初始化程序
CAN_FLAG=0X00; // 清CAN用戶標志,CAN_FLAG=01表示接收到數據
CAN_INIT(); // CAN初始化程序
enable(); // 中斷使能
for(;;)
{
*TCR=0X20; // MBX3請求發送
while(*TCR&0X2000==0) // 等待發送應答
continue;
*TCR=0X2000; // 清 TA3 和MIF3標志位
while(CAN_FLAG==0)
continue; // 等待接收數據
CAN_FLAG=0; // 清接收到標志
*MDER=0X0000; // 郵箱不使能
*MCR=0X0140; // CDR=1,數據改變請求
*MBX3A=*MBX2A+1; // 郵箱2中數據加1用來更新郵箱3中的數據
*MBX3B=*MBX2B+1;
*MBX3C=*MBX2C+1;
*MBX3D=*MBX2D+1;
*MCR=0X04C0; // DBO=1,CDR=0,ABO=1,STM=1
//*MCR=0X0480; // DBO=1,CDR=0,ABO=1,STM=0
*MDER=0X04C; // ME2=ME3=1,MBX2接收, MBX3發送
}
}
void sytem_init()
{
asm(" setc INTM");
asm(" setc SXM");
asm(" clrc OVM");
asm(" clrc CNF");
*IMR=0x0010; // 開中斷優先級5
*IFR=0xFFFF; // 清中斷標志位
*SCSR1=0x81FE;
//*SCSR1=0x83FE;
*WDCR=0xE8;
}
void CAN_INIT()
{
*MCRB=*MCRB|0X0C0; // 設置IOPC6、IOPC7 為 CANRX,CANTX
*CAN_IFR=0XFFFF; // 清所有CAN中斷標志
*LAM1_H=0X7FFF; // 設置郵箱2、3的屏蔽ID寄存器
*LAM1_L=0XFFFF; // 0則ID必須匹配
*MCR=0X1040; // CCR=1 改變配置請求
while(*GSR&0X0010==0)continue; // 當CCE=1 時即可配置 BCR2,BCR1 寄存器
*BCR2=0X01; // 波特率預分頻寄存器
*BCR1=0X033; // 波特率設置為1M
*MCR=*MCR&0XEFFF; // CCR=0 改變配置結束請求
while(*GSR&0X0010!=0)continue; // 只有當CEE=0時,BCR2,BCR1 寄存器配置成功
*MDER=0X040; // 不使能郵箱,郵箱2設為接收方式
*MCR=0X0143; // CDR=1,數據區改變請求
*MSGID2H=0X2447; // 設置郵箱2的控制字及ID
// IDE=0, AME=0, AAM=0
// 標準方式為MSGID2H[12-2]
*MSGID2L=0XFFFF;
*MSGCTRL2=0X08; // 設置控制域
// 數據長度DCL = 8,RTR=0 數據幀
*MBX2A=0X0000; // 郵箱2信息初始化
*MBX2B=0X0000;
*MBX2C=0X0000;
*MBX2D=0X0000;
*MSGID3H=0X2447; // 設置郵箱3的標識符
*MSGID3L=0XFFFF;
*MSGCTRL3=0X08; // RTR=0,DCL=8
*MBX3A=0X2211; // 郵箱3信息初始化
*MBX3B=0X4433;
*MBX3C=0X6655;
*MBX3D=0X8877;
*MCR=0X04C0; // DBO=1,ABO=1,STM=1設置為自測試模式
// *MCR=0X0480; // DBO=1,ABO=1,STM=0設置為正常模式
*MDER=0X4C; // ME3=1,MBX3 發送, ME2=1 接收
*CAN_IMR=0XF7FF; // 中斷MBX3 不使能 ,MBX2使能, 低中斷優先級
*CAN_IFR=0XFFFF; // 清全部中斷標志
}
void interrupt GISR5() // 中斷入口程序
{
switch(*PIVR)
{
case 64:
CANMBX_ISR(); // 郵箱2接受到相應信息則進入中斷服務子程序
break;
}
}
void CANMBX_ISR() // 郵箱2接收中斷服務子程序
{
*RCR=0X040; // 復位 RMP2 和 MIF2
CAN_FLAG=1; // 置用戶接收標志
}
void interrupt nothing() // 假中斷程序
{
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -