查看: 10242|回复: 9

[其他] 调试MSCAN初始化不成功

[复制链接]

该用户从未签到

4

主题

29

帖子

0

新手上路

Rank: 1

积分
57
最后登录
1970-1-1
发表于 2011-7-27 10:23:06 | 显示全部楼层 |阅读模式
我用的是MC9S12P32单片机,程序初始化不成功,老是在 while(!(CANCTL0_SYNCH));  /* Wait for Synchronization */这里等待,以下是我的初始化代码,希望能得到高人的指点,已经调了有几天了.
void CANInit(void) {
    CANCTL0 |= CANCTL0_INITRQ_MASK;          /* Enter Initialization Mode
                               * 
                               *  0b00000001
                               *    ||||||||__ Enter Initialization Mode
                               *    |||||||___ Sleep Mode Request bit
                               *    ||||||____ Wake-Up disabled
                               *    |||||_____ Time stamping disabled
                               *    ||||______ Synchronized Status
                               *    |||_______ CAN not affected by Wait
                               *    ||________ Receiver Active Status bit
                               *    |_________ Received Frame Flag bit
                               */
                               
    while (!(CANCTL1&0x01)){}; /* Wait for Initialization Mode acknowledge
                                 * INITRQ bit = 1
                                 */
    CANCTL1 |= CANCTL1_CANE_MASK|CANCTL1_CLKSRC_MASK;         
   CANCTL1_LOOPB = 0;          /* Set to 1 for LoopBack Mode, 0 otherwise */
    CANCTL1_LISTEN = 0;         /* Not listen only mode 0ÊÇÕý³£Ä£Ê½*/                          
                           
   
    CANBTR0_BRP = 1;
 CANBTR0_SJW =1;
 CANBTR1_SAMP = 0;      /* One sample per bit */ 
 
   
   CANBTR1_TSEG_10 = 4;   
         
    CANBTR1_TSEG_20 = 1;  
 
                             
     CANIDAC_IDAM = 0x01;               /* Four 16-bit acceptance filters */   
                                              
                             
                          
                                
    /* Acceptance Filters */
    CANIDAR0 = ACC_CODE_ID100_HIGH;    //|\    16 bit Filter 0
    CANIDMR0 =0xff; //MASK_CODE_ST_ID_HIGH;   //| \__ Accepts Standard Data Frame Msg
    CANIDAR1 = ACC_CODE_ID100_LOW;     //| /   with ID 0x100
    CANIDMR1 = 0xff;//MASK_CODE_ST_ID_LOW;    //|/
 
   
    CANIDAR2 = 0x00;                   //|\    16 bit Filter 1
    CANIDMR2 =0xff;// MASK_CODE_ST_ID_HIGH;   //| \__ Accepts Standard Data Frame Msg
    CANIDAR3 = 0x00;                   //| /   with ID 0x000
    CANIDMR3 = 0xff;//MASK_CODE_ST_ID_LOW;    //|/
   
    CANIDAR4 = 0x00;                   //|\    16 bit Filter 2
    CANIDMR4 = 0xff;//MASK_CODE_ST_ID_HIGH;   //| \__ Accepts Standard Data Frame Msg
    CANIDAR5 = 0x00;                   //| /   with ID 0x000
    CANIDMR5 = 0xff;//MASK_CODE_ST_ID_LOW;    //|/
   
    CANIDAR6 = 0x00;                   //|\    16 bit Filter 3
    CANIDMR6 = 0xff;//MASK_CODE_ST_ID_HIGH;   //| \__ Accepts Standard Data Frame Msg
    CANIDAR7 = 0x00;                   //| /   with ID 0x000
    CANIDMR7 = 0xff;//MASK_CODE_ST_ID_LOW;    //|/
   
     CANCTL0_INITRQ = 0;            /* Exit initialization mode request */
    while (CANCTL1_INITAK); /* Wait for Normal Mode */
    while(!(CANCTL0_SYNCH));  /* Wait for Synchronization */
   CANRFLG_RXF = 1;       /* Clear receiver flags */                                  
    CANRIER_RXFIE = 0;     /* Enable Full Receive Buffer interrupt */
 
}
我知道答案 目前已有9人回答
回复

使用道具 举报

该用户从未签到

4

主题

29

帖子

0

新手上路

Rank: 1

积分
57
最后登录
1970-1-1
 楼主| 发表于 2011-7-27 10:27:45 | 显示全部楼层

RE:调试MSCAN初始化不成功

注明:用LOOP时可以通过初始化
  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2011-7-28 09:12:37 | 显示全部楼层

    RE:调试MSCAN初始化不成功

    将CANCTL0_INITRQ = 0;代码换成下面的代码。
    CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用总线时钟源
    CAN0CTL0 = 0x00;             //返回一般模式运行
    该会员没有填写今日想说内容.

    该用户从未签到

    4

    主题

    21

    帖子

    0

    注册会员

    Rank: 2

    积分
    60
    最后登录
    1970-1-1
    发表于 2011-8-27 14:11:42 | 显示全部楼层

    RE:调试MSCAN初始化不成功

    我用的是9s12g128,和楼主问题一样,用总线时钟作为时钟源时可以初始化成功,但是将时钟源设置为外部晶振就无法初始化成功,不知道什么原因,求助!

    该用户从未签到

    4

    主题

    44

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    207
    最后登录
    1970-1-1
    发表于 2011-11-2 22:39:03 | 显示全部楼层

    RE:调试MSCAN初始化不成功

    标记一下
    呵呵

    该用户从未签到

    1

    主题

    41

    帖子

    0

    注册会员

    Rank: 2

    积分
    139
    最后登录
    2019-11-1
    发表于 2011-11-20 15:48:46 | 显示全部楼层

    RE:调试MSCAN初始化不成功

    学习下了

    该用户从未签到

    6

    主题

    52

    帖子

    0

    注册会员

    Rank: 2

    积分
    172
    最后登录
    1970-1-1
    发表于 2011-11-30 17:30:29 | 显示全部楼层

    RE:调试MSCAN初始化不成功

    楼主已经调通了吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    8

    帖子

    0

    新手上路

    Rank: 1

    积分
    15
    最后登录
    1970-1-1
    发表于 2012-5-6 17:33:17 | 显示全部楼层

    RE:调试MSCAN初始化不成功

    我用个dg128,同样问题,  CANCTL1_LOOPB = 1; can自检可以,但  CANCTL1_LOOPB = 0;  两个单片机通信,就不行了请高手帮忙,下面是我的程序
    #include       /* common defines and macros */
    #include "derivative.h"      /* derivative-specific definitions */
    int a[8],W=0,W1;                          
    void setbusclock(void)   //PLL setting
    {   
        CLKSEL=0X00;    //disengage PLL to system
        PLLCTL_PLLON=1;   / on PLL
        SYNR=0xc2;         
        REFDV=0xc1;          //pllclock=2*osc*(1+SYNR)/(1+REFDV)=64MHz;
        _asm(nop);          //BUS CLOCK=48M
        _asm(nop);
        while(!(CRGFLG_LOCK==1));   //when pll is steady ,then use it;
        CLKSEL_PLLSEL =1;          //engage PLL to system;
    }
    void delay(){
    long j=6000;
    while(j--);
    j=6000;
    while(j--);
    j=6000;
    while(j--);
    j=6000;
    while(j--);
    }                        
    void CANinit(){
    CAN0CTL0_INITRQ=1;
    while (!CAN0CTL1&0x01);   // 等待MSCAN进入初始化状态
    /CAN0IDAC=0X20;
    CAN0IDMR0=0XFF;
    CAN0IDMR1=0XFF;
    CAN0IDMR2=0XFF;
    CAN0IDMR3=0XFF;
    CAN0IDMR4=0XFF;
    CAN0IDMR5=0XFF;
    CAN0IDMR6=0XFF;
    CAN0IDMR7=0XFF;
    CAN0BTR0=0X40;
    CAN0BTR1=0X3F;
    CAN0CTL1=0X80;
      CAN0CTL0_INITRQ=0;
    while(CAN0CTL1&0x01) ;    // 等待MSCAN进入正常运行模式
    while(!(CAN0CTL0&0x10));
    CAN0RIER_RXFIE=1;
    }
    void CAN0_TX(){
    uchar i;
    i=CAN0TFLG;
    CAN0TBSEL=i;
    i=CAN0TBSEL;
    CAN0TXIDR1=0X01;
    CAN0TXIDR2=0X00;
    CAN0TXDSR0=0X01;
    CAN0TXDSR1=0X02;
    CAN0TXDSR2=0X03;
    CAN0TXDSR3=0X04;
    CAN0TXDSR4=0X05;
    CAN0TXDSR5=0X06;
    CAN0TXDSR6=0X07;
    CAN0TXDSR7=0X08;
    CAN0TXDLR=0X08;
    CAN0TFLG=i;

    }
    void main(void) {
      /* put your own code here */
    setbusclock();  
    CANinit();
    EnableInterrupts;
       DDRS=0X00;
      for(;;) {
      if(PTIS_PTIS7==0) {
       
         CAN0_TX();
       
      }
        _FEED_COP(); /* feeds the dog */
      } /* loop forever */
      /* please make sure that you never leave main */
    }
    #pragma CODE_SEG __NEAR_SEG NON_BANKED
    void interrupt 38 CAN0_RX(void) {
    W1=1;
    CAN0CTL0_RXFRM=1;
    a[0]=CAN0RXDSR0;
    delay();
    a[1]=CAN0RXDSR1;
    delay();
    a[2]=CAN0RXDSR2;
    delay();
    a[3]=CAN0RXDSR3;
    delay();
    a[4]=CAN0RXDSR4;
    delay();
    a[5]=CAN0RXDSR5;
    delay();
    a[6]=CAN0RXDSR6;
    delay();
    a[7]=CAN0RXDSR7;
    CAN0RFLG=0X01;
    }
    两个单片机一样的程序,为什么不能通信,请高手帮忙,谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    21

    帖子

    0

    注册会员

    Rank: 2

    积分
    70
    最后登录
    1970-1-1
    发表于 2013-7-7 20:52:40 | 显示全部楼层

    回复:调试MSCAN初始化不成功

    我调CAN的时候CAN0按通用方法能调通,但是CAN4却初始化不成功,while((CAN4CTL1_INITAK==1));在这一步直接跳不出循环了~·不知道楼主有没有这种情况,找到解决方法没~~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    12

    帖子

    0

    注册会员

    Rank: 2

    积分
    52
    最后登录
    2019-7-25
    发表于 2014-10-30 11:49:55 | 显示全部楼层
    我也遇到同样问题,求大虾帮助、就是与总线不能同步,不知道什么原因

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

        CAN0CTL1_CANE = 1;              //MSCAN12模块使能
        CAN0CTL1_CLKSRC = 1;            //时钟源选择总线时钟fmscan=12M (默认为晶振的一半)   
        CAN0CTL1_LISTEN = 0;            //侦听模式禁止
        CAN0CTL1_LOOPB = 0;             //关闭自环测试模式
                  
        CAN0BTR0 = 0x05;                //同步跳转宽度为1Tq,预分频因子为6。
        CAN0BTR1 = 0x23;                //单次采样,时间段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);   //等待关闭初始化模式
       
      //  while (CAN0CTL0_SYNCH == 0);  //等待总线通信时钟同步(连到总线是需要判断同步)
       
        CAN0RFLG_RXF = 1;               //清空消息接受缓冲器
        CAN0RIER_RXFIE = 1;             //使能接收消息中断
        CAN0TIER = 0x07;                //使能发送消息中断
    }
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-26 07:40 , Processed in 0.109388 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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