调试MC9S12G CAN模块,调了一周了还是有问题。配置 使能之后,收发都不行。。单步调试发现在把需要发的数据放进CANTXDSR0寄存器之后,CANTFLG标志位硬件不置位。。整个人都快疯了。。。相关代码如下 有没有大神帮忙看看感激不尽!!!!!!!!!!!
/CAN初始化函数 unsigned char CANInit(void) { if(CANCTL0_INITRQ = 0) CANCTL0_INITRQ =1; // 启动CAN初始化 while(CANCTL1_INITAK ==0); // 等待初始化响应 CANCTL1 =0x81; // 0x81 1000 0001 使能MSCAN模块,选择时钟源为外部时钟源16MHZ CANBTR1 =0x3A; // 0x3a 0011 1010 每位一个采样 TSEG2:4个TqTSEG1:11Tg CANBTR0 =0x81; // 0x81 1000 0001 同步跳转宽度3Tq 波特率预分频系数为2分频 // 这样设置为了去除晶振毛刺 // 设置完成后CAN总线频率为500kb/s CANIDAC =0; // 选择CAN ID滤波器接收模式 // 设置所有位不参与滤波器 CANIDMR0 = 0xFF; CANIDMR1 = 0xFF; CANIDMR2 = 0xFF; CANIDMR3 = 0xFF; CANIDMR4 = 0xFF; CANIDMR5 = 0xFF; CANIDMR6 = 0xFF; CANIDMR7 = 0xFF; CANCTL0_INITRQ =0; // 退出初始化模式 //CANCTL0 &= (unsignedchar)~(unsigned char)1; while(CANCTL1_INITAK); // 等待关闭初始化响应 while(CANCTL0_SYNCH); // 等待MSCAN与CAN总线时钟同步 CANCTL0 =0; // 进入正常模式 // CANRIER =0x6B; CANRFLG_RXF =1; // 清空接受缓冲FLG CANRIER_RXFIE = 1; // 使能接收中断 //CANTIER =0; // 关闭发送中断:发送器空时引起中断 return(TRUE); } //配置fpll=48MHZ,fbus=24MHZ fOSC=16MHZ unsigned char SetBusClock(void) { CPMUPROT =0x26; // 关闭时钟配置寄存器保护 CPMUCLKS_PSTP =0; // 在停止模式下禁用外部晶振 CPMUCLKS_PLLSEL =1; // 选择PLL作为系统时钟源 // 配置fpll=48MHZ,fbus=24MHZ fOSC=16MHZ // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1) CPMUSYNR =0x02; // 0000 0010 SYNDIV =2 CPMUREFDIV =0x81; // 1000 0001 REFDIV =1 CPMUPOSTDIV =0x00; // POSTDIV = 0 //PLLCLOCK = VCO CLOCK / (POSTDIV + 1) CPMUOSC_OSCE =1; // 外部晶振使能 CPMUPLL=0x00; // 设置PLL频率调制模式 while(CPMUFLG_UPOSC ==0); // 等待外部时钟被PLL代替 CPMUPROT = 0x00; // 打开时钟配置寄存器保护 } //CAN发送函数 unsigned char CANSend(Mscan_Msg *msg) { //发送缓冲区检测 while(!CANTFLG); CANTBSEL = CANTFLG; //写入ID CANTXIDR0 = (unsignedchar)((msg->ID >> 3) &0xFF); CANTXIDR1 = (unsignedchar)((msg->ID << 5) & 0xFF); //写入数据长度 CANTXDLR = msg->Len; //写入优先级 CANTXTBPR = 0; //写入数据 CANTXDSR0 = msg->Data[0]; CANTXDSR1 = msg->Data[1]; CANTXDSR2 = msg->Data[2]; CANTXDSR3 = msg->Data[3]; CANTXDSR4 = msg->Data[4]; CANTXDSR5 = msg->Data[5]; CANTXDSR6 = msg->Data[6]; CANTXDSR7 =msg->Data[7]; //写CAN信息到发送缓冲区成功 CANTFLG = CANTBSEL; return(TRUE);
|