查看: 13354|回复: 11

[S12] 飞思卡尔MC9S12DT128 CAN通讯问题---发送缓冲器一直为满

[复制链接]

该用户从未签到

1

主题

12

帖子

0

注册会员

Rank: 2

积分
52
最后登录
2019-7-25
发表于 2014-11-11 21:34:26 | 显示全部楼层 |阅读模式
写的飞思卡尔MC9S12DT128的CAN驱动程序,发现三个缓冲区不会清零,总是满的(动作三次就停止了),有哪个高人知道什么原因阿?初始化问题吗?开启自循环测试则正常。总线FBUS=12MHZ.   这个原因是不是因为初始化没设置好阿???

void CANInit(void)
{
    byte i;
    CAN0CTL0_INITRQ = 1;            //请求进入初始化模式
    while (CAN0CTL1_INITAK == 0);   //等待应答进入初始化模式

    CAN0CTL1_CANE = 1;              //MSCAN12模块使能
    CAN0CTL1_CLKSRC = 1;            //时钟源选择总线时钟fmscan=12M (默认为晶振的一半)   
    CAN0CTL1_LISTEN = 0;            //侦听模式禁止
    CAN0CTL1_LOOPB = 0;             //关闭自环测试模式
              
    CAN0BTR0_SJW = 0;
    CAN0BTR0_BRP = 5;
    CAN0BTR1_SAMP = 0;
    CAN0BTR1_TSEG_20 = 2;
    CAN0BTR1_TSEG_10 = 3;             //BTR0=0X05;BTR1=0X23
    //CAN0BTR0 = 0x43;                //同步跳转宽度为1Tq,预分频因子为6。
    //CAN0BTR1 = 0x18;                //单次采样,时间段2为3Tq,时间段1为4Tq,故位速率=24M/2/6/(3+4+1)=250kbps
     
    CAN0IDMR0 = 0xFF;
    CAN0IDMR1 = 0xFF;
    CAN0IDMR2 = 0xFF;
    CAN0IDMR3 = 0xFF;
    CAN0IDMR4 = 0xFF;
    CAN0IDMR5 = 0xFF;
    CAN0IDMR6 = 0xFF;
    CAN0IDMR7 = 0xFF;               //关闭过滤器,接收所有地址消息
   
    CAN0TIER = 0x00;                //禁止发送中断                              
    CAN0RIER = 0x00;                //禁止接收中断
   
    CAN0CTL0_INITRQ = 0;            //退出初始化模式
    while (CAN0CTL1_INITAK == 1);   //等待关闭初始化模式
   
    for(i=0;i<255;i++)
    {
      if(CAN0CTL0_SYNCH==1)
      break;
    }
    //while (!CAN0CTL0_SYNCH);  //等待总线通信时钟同步(连到总线是需要判断同步)
   
    CAN0RFLG_RXF = 1;               //清空消息接受缓冲器
    CAN0RIER_RXFIE = 1;             //使能接收消息中断
}发送函数:  /***CAN发送函数*****************************************************/void CAN_send(mscan_T_msg msg)      //发送8个数{         byte Txbuffer,i;          Txbuffer = 0;    /* if(CAN0TFLG == 0x00)     CAN0TFLG = 0x07;*/          while(!CAN0TFLG);             //等待发送缓冲器可用    /* {         CAN0TFLG=0x05;     }  */     CAN0TBSEL = CAN0TFLG;     Txbuffer = CAN0TBSEL;        //选择可用的buffer               CAN0TXIDR0 = (byte) (msg.Tx_ID>>8);     CAN0TXIDR1 = (byte) msg.Tx_ID;     CAN0TXDLR = msg.Tx_Length;     CAN0TXTBPR = msg.Tx_Prio;             for(i=0;i<msg.Tx_Length;i++)        *(&CAN0TXDSR0 + i) = msg.Tx_Data;                             CAN0TFLG = Txbuffer;}
我知道答案 目前已有11人回答
回复

使用道具 举报

该用户从未签到

1

主题

12

帖子

0

注册会员

Rank: 2

积分
52
最后登录
2019-7-25
 楼主| 发表于 2014-11-11 21:36:18 | 显示全部楼层
也就是CAN0TFLG一直不能清零
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

12

帖子

0

注册会员

Rank: 2

积分
52
最后登录
2019-7-25
 楼主| 发表于 2014-11-12 09:29:12 | 显示全部楼层
没人来啊~~自己顶一个啊~~希望有人帮忙解答~Q 296122921
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2016-11-29 19:14
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    20

    主题

    405

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1529
    最后登录
    1970-1-1
    发表于 2014-12-11 13:46:21 | 显示全部楼层
    我现在也遇到了对CAN0TFLG中的某一位清零,开始发送数据
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    23
    最后登录
    1970-1-1
    发表于 2014-12-25 16:17:10 | 显示全部楼层
    若自环测试模式下可以正常发收、正常工作模式下不行,
    则可能不是程序设置问题,有可能是没有另一个CAN节点接收所发送数据所致。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    6
    最后登录
    2015-11-4
    发表于 2015-11-4 09:52:23 | 显示全部楼层
    楼主的问题解决了吗,我也遇到 了同样的问题,也是CANTFLG总是满的(软件仿真时发现动作三次就停止了,即CANTFLG=0), 用USBCAN监测不到08DZ60单片机CAN节点发来的数据,但是如果用USBCAN工具给单片机CAN节点发送一次数据后,就一切正常了,便能收到来自CAN节点的数据。不知道是为什么,希望有经验的人指点。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-20 08:48
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    2

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    29
    最后登录
    2018-10-23
    发表于 2016-10-20 08:47:11 来自手机 | 显示全部楼层
    楼主,你的问题解决了吗,是因为没有另一个节点没有接受数据的原因吗?我目前也面临这个问题,可以交流一下吗?我qq1060111312
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-23 10:11
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    1

    主题

    19

    帖子

    0

    新手上路

    Rank: 1

    积分
    43
    最后登录
    2016-11-23
    发表于 2016-10-25 10:52:47 | 显示全部楼层
    学习了,不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    45
    最后登录
    2020-10-17
    发表于 2018-6-22 16:07:47 | 显示全部楼层
    xiaotanlan 发表于 2015-11-4 09:52
    楼主的问题解决了吗,我也遇到 了同样的问题,也是CANTFLG总是满的(软件仿真时发现动作三次就停止了,即CA ...

    这个问题你解决了吗
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    45
    最后登录
    2020-10-17
    发表于 2018-6-22 16:11:57 | 显示全部楼层
    目前也碰到了类似的问题,现已确认发送时钟没有问题,发送回路中接入了一个STM32单片机作为数据的接收,能接收到数据,但接收到的数据不变,也就是MC9S12单片机一直在发送第一次放入缓冲器的数据,并且存入三次后缓冲器一直为满,请问此种情况应该怎样解决,麻烦大神帮忙解答一下,谢谢
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-26 01:22 , Processed in 0.103507 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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