查看: 2479|回复: 3

[S12] 9s12xdp512单片机MSCAN与CAN总线无法同步

[复制链接]

该用户从未签到

8

主题

35

帖子

0

新手上路

Rank: 1

积分
92
最后登录
1970-1-1
发表于 2013-6-13 16:11:37 | 显示全部楼层 |阅读模式
9s12xdp512单片机MSCAN与CAN总线一直无法同步,关于这方面哪位高手能指点一下从哪方面查找并解决这方面的问题,我刚接触这款单片机。
我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

8

主题

35

帖子

0

新手上路

Rank: 1

积分
92
最后登录
1970-1-1
 楼主| 发表于 2013-6-13 16:59:29 | 显示全部楼层

回复:9s12xdp512单片机MSCAN与CAN总线无法同步

void CAN0Init(void)
{
    //MSCAN12模块使能
    CAN0CTL1_CANE = 1;         
    //请求进入初始化模式
    CAN0CTL0_INITRQ = 1;
    //等待应答进入初始化模式
    while (CAN0CTL1_INITAK == 0);
   // CAN0IDAC  = 0b00010000; //CAN验收控制寄存器
    //关闭过滤器
    CAN0IDMR0 = 0xFF;
    CAN0IDMR1 = 0xFF;
    CAN0IDMR2 = 0xFF;
    CAN0IDMR3 = 0xFF;
    CAN0IDMR4 = 0xFF;
    CAN0IDMR5 = 0xFF;
    CAN0IDMR6 = 0xFF;
    CAN0IDMR7 = 0xFF;
    CAN0CTL1_CLKSRC = 0;  //时钟源选择外部晶振fmscan=16M 
   //配置时钟
    CAN0BTR0 = 0x41;
    CAN0BTR1 = 0x3a;    
    //配置工作模式
    CAN0CTL1_LISTEN = 0;  //侦听模式禁止                            
    //退出初始化模式
    CAN0CTL0_INITRQ = 0;                       
    //等待应答初始化模式
    while (CAN0CTL1_INITAK == 1);
    //等待总线通信时钟同步
    while (CAN0CTL0_SYNCH == 0);     (此处的通信同步是可以同步的,程序可以正常运行)
    CAN0TIER = 0x00; //禁止发送中断                             
    CAN0RIER = 0x01; //使能接收中断
}
//CANSendFrame:CAN发送1帧数据------------------------------------------*
//功  能:CAN发送1帧(数据长度m_dataLen > 8)
     {
        return 1;
     }
     
     //检查总线是否同步
     if (CAN0CTL0_SYNCH == 0)        (程序一直停在这里,MSCAN与CAN通信一直无法同步)
     {
        return 2;
     }
      
     txEmptyBuf = 0;
     do
     {
        CAN0TBSEL = CAN0TFLG;
        txEmptyBuf = CAN0TBSEL;
        delay++;
        if(delay >= 0x100)
        {
         delay = 0;
         return 3;
        }
     }
     while (!txEmptyBuf);
    
      PTT_PTT4=~PTT_PTT4;
     
     //写入标识符ID
     if (sendFrame->m_IDE == 0) //按标准帧填充ID
     {
         CAN0TXIDR0 = (byte)(sendFrame->m_ID>>3);
         CAN0TXIDR1 = (byte)(sendFrame->m_IDm_IDE;
     }
     else
     {
        return 4; //发送帧为扩展帧
     }
      
     //写入数据段
     if (sendFrame->m_RTR == 0) //按数据帧填充
     {
        for (i = 0; i < sendFrame->m_dataLen; i++)
        {
            *((&CAN0TXDSR0)+i) = sendFrame->m_data;   
        }
        CAN0TXDLR = sendFrame->m_dataLen;
     }
     else //按远程帧填充
     {
         CAN0TXDLR = 0;
     }
    
     //配置发送优先级
     CAN0TXTBPR = sendFrame->m_priority;
     //清TXEx标志,通知CAN模块发送
     CAN0TFLG  = txEmptyBuf;
     return 0; //配置发送完成
}
这个程序是根据例程上改的,红色的部分是可以通过并可以同步的,但是到蓝色部分就始终无法同步,这个问题应该从哪方面进行思考解决呢?
回复 支持 反对

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    373
    最后登录
    2023-8-16
    发表于 2013-6-14 16:09:55 | 显示全部楼层

    RE:9s12xdp512单片机MSCAN与CAN总线无法同步

    这个标志位可以不用检查的啊。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2023-3-10
    发表于 2022-7-7 10:07:56 | 显示全部楼层
    请问一下楼主的问题解决了吗
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 16:09 , Processed in 0.120013 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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