求助:PIC18F2580自带的ECAN模块的通讯问题 点击:1600 | 回复:2



henry_chen

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 0回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2005年12月19日
发表于:2005-12-19 10:02:00
楼主
我用PIC18F2580内置的ECAN模块进行通讯调试。
首先切换到配置模式,进行初始化(波特率配置,接收屏蔽器,接收过滤器),然后切换到工作模式,往输出寄存器以及相应的标识寄存器里赋完值后,启动发送,这是发现在MCU的CANTX口,并没有波形输出。请问,是哪里出了问题?以下是我初始化模块以及发送模块的程序:

CAN_initial:
        bcf        TRISB,2
        bsf        TRISB,3

        bsf        CANCON,REQOP2            ;配置模式
        bcf        CANCON,REQOP1
        bcf        CANCON,REQOP0
    
        banksel    CANSTAT            ;;;;;;;;;;;;;;;;;;;;;;;;;        

        movf    CANSTAT,w
        andlw    B'11100000'
        sublw    B'10000000'
        bnz        $-6

        ;4M,125Kbps,16                ;波特率
        movlw    B'11000000'                ;SJW=11,BRP=000000
        movwf    BRGCON1
        movlw    B'10111001'                ;SEG1PH=111,PRSEG2=001        
        movwf    BRGCON2                    ;采样1次,SEG2PH2可编程
        movlw    B'01000100'                ;唤醒,SEG2PH2=100
        movwf    BRGCON3
    
        movlb    D'15'                    ;RAM BANK 15

        bcf        RXB0CON,RXM1            ;接收器0只接收标准ID
        bsf        RXB0CON,RXM0
        bsf        RXB1CON,RXM1            ;接收器1只接收扩展ID
        bcf        RXB1CON,RXM0
    
;        bcf        RXB0CON,RX0DBEN            ;非双缓冲
        
        movlw   &nb



远 方

  • 精华:1帖
  • 求助:0帖
  • 帖子:18帖 | 401回
  • 年度积分:0
  • 历史总积分:561
  • 注册:2002年1月29日
发表于:2005-12-23 09:15:00
1楼
我使用PIC18F458的代碼,供你參考:
CAN初始化代碼:
void Initcan(unsigned char mode,unsigned char opr_code)            
{
    RXB0IE    = 0;
    RXB1IE    = 0;
    while(!OPMODE2)
    {
        REQOP2 = 1;        // set CAN to CONFIGURE mode
    }
    RXB0CON        = 0X24;
    RXB1CON        = 0X22;
    TXERRCNT    = 0X00;
    CIOCON        = 0X30;

    TXB0RTR        = 0;        // DeviceNet just use standard frame)˙
    TXB1RTR        = 0;
    TXB2RTR        = 0;
    TXB0EXIDE    = 0;
    TXB1EXIDE    = 0;
    TXB2EXIDE    = 0;
    
    switch(DeviceNet.BaudRate)
    {
    case 0x00:  // baud rate=125K
        BRGCON3    = 0X01;
        BRGCON2    = 0X10;
        BRGCON1    = 0X09;
        break;
    case 0x01:  // baud rate=250K
        BRGCON3    = 0X01;
        BRGCON2    = 0X10;
        BRGCON1    = 0X04;
        break;
    case 0x02:  // baud rate=500K
        BRGCON3    = 0X02;
        BRGCON2    = 0X12;
        BRGCON1    = 0X01;
        break;
    default:
        BRGCON3    = 0X01;
        BRGCON2    = 0X10;
        BRGCON1    = 0X09;
        break;
    }
                        //  饜离filter睿maskㄛ敖裁祥剒猁腔杅擂˙
    RXM1SIDL    = 0X00;
    RXM1SIDH    = opr_code & 0XFF;
    RXM0SIDL    = 0X00;
    RXM0SIDH    = opr_code & 0XFF;
    RXF0SIDL    = 0X00;
    RXF0SIDH    = 0X80 | (DeviceNet.MACID & 0x3f);
    RXF1SIDL    = 0X00;
    RXF1SIDH    = 0X80 | (DeviceNet.MACID & 0x3f);
    RXF2SIDL    = 0X00;
    RXF2SIDH    = 0X80 | (DeviceNet.MACID & 0x3f);
    RXF3SIDL    = 0X00;
    RXF3SIDH    = 0X80 | (DeviceNet.MACID & 0x3f);
    RXF4SIDL    = 0X00;
    RXF4SIDH    = 0X80 | (DeviceNet.MACID & 0x3f);
    RXF5SIDL    = 0X00;
    RXF5SIDH    = 0X80 | (DeviceNet.MACID & 0x3f);

    RXB0IP        = 1;
    RXB1IP        = 1;
    PIR3        = 0;
    INTCON2        = 0;
    INTCON3        = 0;
    while((CANSTAT & CAN_OP_MODE_BITS) != mode )
    {
        CANCON    = mode;
    }
    RXB0IE    = 1;
    RXB1IE    = 1;
}

CAN數據發送代碼(發送數據裝載在另外的函數進行,此函數發送TXB0裡的數據)
void TransCanData(void)
{
     if(TXB0REQ == 0)
     {
         TXB0CON = 0x03;
         TXB0REQ =1;
         while(TXB0REQ)
         {
             if(TXBO)
             {
                 nodeState = BUS_OFF;
                 isCANDataTrans = FALSE;
                 TXB0REQ = 0;
             }
         }
     }
}

LN2000分散控制系统

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 228回
  • 年度积分:0
  • 历史总积分:448
  • 注册:2005年4月20日
发表于:2006-12-28 18:02:00
2楼
欢迎交流CAN相关技术  gsjcn@163.com QQ 29992108(不长在线)
-----------------------------------------------
提供CAN光纤模块、ISA接口CAN适配卡,CAN总线采集模块,多重冗余,稳定第一 办公电话:0531-82999787 葛.

热门招聘
相关主题

官方公众号

智造工程师