请选择 进入手机版 | 继续访问电脑版
查看: 1162|回复: 0

[其他] MC9S12G芯片 CAN模块求助大神们,调了一周还是有问题

[复制链接]

该用户从未签到

1

主题

1

帖子

0

新手上路

Rank: 1

积分
13
最后登录
2020-9-17
发表于 2020-9-15 14:50:43 | 显示全部楼层 |阅读模式
调试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:4TqTSEG1: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);          // 等待MSCANCAN总线时钟同步
  
CANCTL0 =0;                   // 进入正常模式                        
  
// CANRIER =0x6B;                                                  
  CANRFLG_RXF   =1;   // 清空接受缓冲FLG
  CANRIER_RXFIE = 1;   // 使能接收中断                       
  //CANTIER =0;        // 关闭发送中断:发送器空时引起中断
  return(TRUE);
}
//配置fpll=48MHZfbus=24MHZ  fOSC=16MHZ
unsigned char SetBusClock(void)
{  
   
CPMUPROT =0x26;            // 关闭时钟配置寄存器保护
CPMUCLKS_PSTP   =0;        // 在停止模式下禁用外部晶振
CPMUCLKS_PLLSEL =1;        // 选择PLL作为系统时钟源
   
// 配置fpll=48MHZfbus=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);  


我知道答案 目前已有0人回答
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-18 16:49 , Processed in 0.107397 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表