📄 mscan.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dt256.h> /* derivative information */
#include "SCI.h"
#include "MC9S12.h"
#include "MSCAN.h"
extern unsigned char SCI_Recieve_Data[];
#if MSCAN_EN
//--------------------------------------------------------
#if CAN0_EN //自己定义要把系统自己预定义的给去掉,否则要出现冲突,但在908中没有,不知道为什么
// volatile CanBufFrame Can0RxBuf @(REG_BASE + 0x00000160);
// volatile CanBufFrame Can0TxBuf @(REG_BASE + 0x00000170);
CanBufFrame Can0RxBuf;
unsigned char Can_Rec_Int_Flg = 0;
unsigned int i0 = 0;//8字节一帧,此次传的帧次序
#endif//CAN0_EN
void MSCAN_Init(void){//还没有考虑到睡眠,停止等应用,在网关时要用。
//SCI_Transmit(0x55);
#if CAN0_EN
CAN0CTL1_CANE = 1;//CAN0使能
CAN0CTL0_INITRQ = 1;//进入初始化,即软复位模式。
while(!CAN0CTL1_INITAK);//软复位信号的握手信号。
CAN0CTL1_LOOPB = 0;//退出自检测模式
CAN0CTL1_LISTEN = 0;//退出监听模式
CAN0CTL1_CLKSRC = 0;//时钟源来自晶振,而不是内部时钟
CAN0IDAC_IDAM0 = 1;//4个16位过滤器模式
CAN0IDAC_IDAM1 = 0;//
/****************************************************/
//四个16位过滤器可以提供4个13位标准帧比较情况,收到一个标准帧只要满足其中的1个就命中它。
//
//扩展帧属于CAN2.0B,一帧要29位,需要两个过滤器结合。暂不考虑。
/******************************************************/
//以下要虚拟4个ID:01 02 04 08 方便调试
CAN0IDAR0 = 0x00; //0 0 0 (0 0 0 0) (0 | 0 0 1) 0 0 0 0 0
CAN0IDAR1 = 0x20; //
CAN0IDAR2 = 0x00; //0 0 0 (0 0 0 0) (0 | 0 1 0) 0 0 0 0 0
CAN0IDAR3 = 0x40; //
CAN0IDAR4 = 0x00; //0 0 0 (0 0 0 0) (0 | 1 0 0) 0 0 0 0 0
CAN0IDAR5 = 0x80; //
CAN0IDAR6 = 0x01; //0 0 0 (0 0 0 0) (1 | 0 0 0) 0 0 0 0 0
CAN0IDAR7 = 0x00; //
CAN0IDMR0 = 0x00;//13位ID全部匹配接收
CAN0IDMR1 = 0x07;
CAN0IDMR2 = 0x00;//13位ID全部匹配接收
CAN0IDMR3 = 0x07;
CAN0IDMR4 = 0x00;//13位ID全部匹配接收
CAN0IDMR5 = 0x07;
CAN0IDMR6 = 0x00;//13位ID全部匹配接收
CAN0IDMR7 = 0x07;
/**********************************************************/
//关于时钟源和波特率的寄存器设置说明
//若用BDM调试时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -