搜索
bottom↓
回复: 4

请教关于C8051F500的CAN通信问题

[复制链接]

出0入0汤圆

发表于 2016-7-17 18:40:39 | 显示全部楼层 |阅读模式
大家好,是这样的,用两个c8051f500进行CAN通信时,一个为A节点,一个为B节点,A发送数据给B。主程序和CAN配置程序如下:
问题是,AB不能通信,STAT寄存器值为0X62,也就是提示Error Passive=1,也就是CAN处于 error passive state状态,Warning Status=1,也就是错误计数器计满,Form Error=1,也就是收到的数据帧中的固定的格式错误。

着实不知道该怎么弄了,目的就是实现两个51的CAN通信。各位路过的大神帮忙看一眼,拜谢拜谢!!!都快崩溃了啊…………

A发送的程序和B接收的程序在下面的帖子,拜谢各位大神!!
       

出0入0汤圆

 楼主| 发表于 2016-7-17 18:41:04 | 显示全部楼层
本帖最后由 hswkcg 于 2016-7-17 18:43 编辑

A发送程序:
这是主程序:
        ORG    0000H
        LJMP   INITIAL                                                        ;初始化

                        MAIN:                 NOP
                                                         CLR A
                        MAIN01:  LCALL CAN0Send
                                                         JNB         CANTX,MAIN01
                                                         CLR  CANTX
                                                         MOV A,#0FFH
                        MAIN02:  DEC A
                                                         JNZ MAIN02
                                                         LJMP  MAIN
这是发送函数:
CAN0Send:
                                                 
                                                        MOV SDATA1,#01H
                                                        MOV SDATA2,#02H
                                                        MOV SDATA3,#03H
                                                        MOV SDATA4,#04H
                                                        MOV SDATA5,#05H
                                                        MOV SDATA6,#06H
                                                        MOV SDATA7,#07H
                                                        MOV SDATA8,#08H

                                                  MOV    SFRPAGE,#0CH  
              MOV    CAN0IF1DA1L,SDATA1
              MOV    CAN0IF1DA1H,SDATA2
              MOV    CAN0IF1DA2L,SDATA3
              MOV    CAN0IF1DA2H,SDATA4
              MOV    CAN0IF1DB1L,SDATA5
              MOV    CAN0IF1DB1H,SDATA6
              MOV    CAN0IF1DB2L,SDATA7
              MOV    CAN0IF1DB2H,SDATA8
              
                                                        SETB                CANTX
                                                       
                                                        MOV    CAN0IF1CML,#87H             ;Write TxRqst, all 8 data bytes
              MOV    CAN0IF1CRL,#02H             ;Start command request
    CAN0Send1:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,CAN0Send1
                MOV        A,#00H;
        CAN0Send5:
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                NOP
                DEC        A;
                JNZ        CAN0Send5;
     CAN0Send2: MOV      A,CAN0STAT;
                ANL      A,#0E7H;
                JNZ     CAN0Send4;
                MOV      A,CAN0STAT;
                ANL      A,#08H;
                JZ       CAN0Send2;
     CAN0Send3:  XRL      CAN0STAT,#08H;
                MOV    SFRPAGE,#00H
                 RET            
     CAN0Send4: LCALL       iniCAN;
                MOV    SFRPAGE,#00H
               
                                                                 RET;

这是CAN的配置:
iniCAN:   MOV    SFRPAGE,#0CH
              MOV    CAN0CN,#41H                 ;Start Intialization mode
                                                
                                                 ;Enable access to bit timing register     
              MOV    CAN0CFG,#00H;                                                                ;配置时钟等于系统时钟
              NOP
              NOP
              NOP   
              NOP
              NOP
              NOP
              NOP
              MOV    CAN0BTL,#0C8H;;CAN0BTL,#47H                ;CAN bit rate to 125Kbps
              MOV    CAN0BTH,#06FH;;CAN0BTH,#5FH
              ;Message Object 1用于接收
              MOV    CAN0IF1CML,#0F0H            ;Write Mask,Arbitration,Control to Message Object
              ;IF1 Mask1
              MOV    CAN0IF1M1L,#00H             ;Mask Bits 15-0 not used for filtering
              MOV    CAN0IF1M1H,#00H
              ;IF1 Mask2
              MOV    CAN0IF1M2L,#0FCH            ;Ignore Extended Identifier for filtering
              MOV    CAN0IF1M2H,#5FH             ;Used Direction bit for filtering  Use ID bits 28-18 for filtering(11个ID位都要仲裁)
              ;IF1 Arbitration1
              MOV    CAN0IF1A1L,#00H             ;11-bit ID, so lower 16-bits not used
              MOV    CAN0IF1A1H,#00H
              ;IF1 Message Control Register
              MOV    CAN0IF1MCL,#88H             ;Message Size=8      Message Object is a Single Message      
              MOV    CAN0IF1MCH,#14H             ;Enable Receive Interrupt   Use Acceptance Mask
              ;IF1 Arbitration2
              ;A_RECEIVE_ID
                                                        MOV    A,#IDCONST2
              MOV    B,#64
              DIV    AB
              ORL    A,#80H
              MOV    CAN0IF1A2H,A
              MOV    A,#4
              MUL    AB
              MOV    CAN0IF1A2L,A
              MOV    CAN0IF1CRL,#01H             ;Start command request
     INITCPU1:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,INITCPU1
              ;Message Object 2用于发送
              ;IF1 Message Control Register
              MOV    CAN0IF1MCL,#88H             ;Message Size=8      Message Object is a Single Message      
              MOV    CAN0IF1MCH,#08H             ;Enable Transmit Interrupt
              ;IF1 Arbitration2
              ;A_SEND_ID
                                                        MOV    A,#IDCONST1
              MOV    B,#64
              DIV    AB
              ORL    A,#0A0H
              MOV    CAN0IF1A2H,A
              MOV    A,#4
              MUL    AB
              MOV    CAN0IF1A2L,A
              MOV    CAN0IF1CRL,#02H             ;Start command request
     INITCPU2:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,INITCPU2
              ;Message Object 3—32不使用
              MOV    CAN0IF1A2L,#20H             ;Set 11-bit Identifier to 08H
              MOV    CAN0IF1A2H,#20H             ;Set MsgVal to unvalid        Message Direction = transmit  
              MOV    R0,#03H
     INITCPU3:MOV    CAN0IF1CRL,R0
     INITCPU4:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,INITCPU4
              INC    R0
              CJNE   R0,#33,INITCPU3
              MOV    CAN0CN,#0EH                 ;Return to Normal Mode and disable access to bit timing register
            
                                                  RET;

出0入0汤圆

 楼主| 发表于 2016-7-17 18:44:36 | 显示全部楼层
B接收程序,
这是主函数:
ORG    0000H
        LJMP   INITIAL                                                        ;初始化

                        MAIN:                 NOP
                                                         CLR A
                        MAIN01:  LCALL CAN0Rev
                                                         JNB         CANRX,MAIN01
                                                         CLR  CANRX
                                                         MOV A,#0FFH
                        MAIN02:  DEC A
                                                         JNZ MAIN02
                                                         LJMP  MAIN
这是接收函数:
CAN0Rev:        MOV     SFRPAGE,#0CH;
                        MOV     A,CAN0STAT;
                        ANL     A,#010H;
                        JNZ     CAN0Rev_1;
                        
                        MOV     SFRPAGE,#00;
                        RET;
                        

       CAN0Rev_1:      
                         MOV    CAN0IF1CML,#7FH              ;Read all of message object to IF1        Clear IntPnd and newData
                         MOV    A,#01
                         MOV    CAN0IF1CRL,A
       CAN0Rev_2:         NOP
                         NOP
                         MOV    A,CAN0IF1CRH
                         JB     ACC.7,CAN0Rev_2
                        MOV    RDATA1,CAN0IF1DA1L
                        MOV    RDATA2,CAN0IF1DA1H
                        MOV    RDATA3,CAN0IF1DA2L
                        MOV    RDATA4,CAN0IF1DA2H
                        MOV    RDATA5,CAN0IF1DB1L
                        MOV    RDATA6,CAN0IF1DB1H
                        MOV    RDATA7,CAN0IF1DB2L
                        MOV    RDATA8,CAN0IF1DB2H   
                        SETB       CANRX;
                        XRL    CAN0STAT,#010H;                    
                        MOV    SFRPAGE,#00H;
                        RET;
这是CAN配置函数:
iniCAN:   MOV    SFRPAGE,#0CH
              MOV    CAN0CN,#41H                 ;Start Intialization mode
                                                
                                                 ;Enable access to bit timing register     
              MOV    CAN0CFG,#00H;                                                                ;配置时钟等于系统时钟
              NOP
              NOP
              NOP   
              NOP
              NOP
              NOP
              NOP
              MOV    CAN0BTL,#0C8H;;CAN0BTL,#47H                ;CAN bit rate to 125Kbps
              MOV    CAN0BTH,#06FH;;CAN0BTH,#5FH
              ;Message Object 1用于接收
              MOV    CAN0IF1CML,#0F0H            ;Write Mask,Arbitration,Control to Message Object
              ;IF1 Mask1
              MOV    CAN0IF1M1L,#00H             ;Mask Bits 15-0 not used for filtering
              MOV    CAN0IF1M1H,#00H
              ;IF1 Mask2
              MOV    CAN0IF1M2L,#0FCH            ;Ignore Extended Identifier for filtering
              MOV    CAN0IF1M2H,#5FH             ;Used Direction bit for filtering  Use ID bits 28-18 for filtering(11个ID位都要仲裁)
              ;IF1 Arbitration1
              MOV    CAN0IF1A1L,#00H             ;11-bit ID, so lower 16-bits not used
              MOV    CAN0IF1A1H,#00H
              ;IF1 Message Control Register
              MOV    CAN0IF1MCL,#88H             ;Message Size=8      Message Object is a Single Message      
              MOV    CAN0IF1MCH,#14H             ;Enable Receive Interrupt   Use Acceptance Mask
              ;IF1 Arbitration2
              ;B_RECEIVE_ID
                                                        ;A_SEND_ID
                                                        MOV    A,#IDCONST1
              MOV    B,#64
              DIV    AB
              ORL    A,#80H
              MOV    CAN0IF1A2H,A
              MOV    A,#4
              MUL    AB
              MOV    CAN0IF1A2L,A
              MOV    CAN0IF1CRL,#01H             ;Start command request
     INITCPU1:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,INITCPU1
              ;Message Object 2用于发送
              ;IF1 Message Control Register
              MOV    CAN0IF1MCL,#88H             ;Message Size=8      Message Object is a Single Message      
              MOV    CAN0IF1MCH,#08H             ;Enable Transmit Interrupt
              ;IF1 Arbitration2
              ;B_SEND_ID
                                                        ;A_RECEIVE_ID
                                                        MOV    A,#IDCONST2
              MOV    B,#64
              DIV    AB
              ORL    A,#0A0H
              MOV    CAN0IF1A2H,A
              MOV    A,#4
              MUL    AB
              MOV    CAN0IF1A2L,A
              MOV    CAN0IF1CRL,#02H             ;Start command request
     INITCPU2:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,INITCPU2
              ;Message Object 3—32不使用
              MOV    CAN0IF1A2L,#20H             ;Set 11-bit Identifier to 08H
              MOV    CAN0IF1A2H,#20H             ;Set MsgVal to unvalid        Message Direction = transmit  
              MOV    R0,#03H
     INITCPU3:MOV    CAN0IF1CRL,R0
     INITCPU4:NOP
              NOP
              MOV    A,CAN0IF1CRH
              JB     ACC.7,INITCPU4
              INC    R0
              CJNE   R0,#33,INITCPU3
              MOV    CAN0CN,#0EH                 ;Return to Normal Mode and disable access to bit timing register
            
                                                  RET;



                                END


拜谢各位大神!!!

出0入14汤圆

发表于 2016-7-17 20:50:45 | 显示全部楼层
汇编不懂,现在能用汇编的都是牛人

出0入0汤圆

 楼主| 发表于 2016-7-19 13:15:21 | 显示全部楼层
isakura 发表于 2016-7-17 20:50
汇编不懂,现在能用汇编的都是牛人

已经调通了,是DIR位写反了,发送的写成接收了,谢谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-11 21:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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