打印
[CAN-bus/DeviceNet]

关于SJA1000自测的一点问题

[复制链接]
3519|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
comeon_000|  楼主 | 2007-8-26 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wxj1952| | 2007-8-27 08:14 | 只看该作者

程序有错误。

贴上来看看。

使用特权

评论回复
板凳
comeon_000|  楼主 | 2007-8-27 09:47 | 只看该作者

这是原程序 还在调试阶段 子程序已经写完 请指教

        BTRC        EQU    30H
        SAVE_INT_INFO   DATA    32H
    AMRBF       EQU     32H
        ACRBF       EQU     36H
        ERRCT       EQU     3BH
        TXBF        EQU     40H
        RXBF        EQU     50H
        RCV_GOOD    BIT    0FH    ;成功的接收一帧标志
        ERR_FLAG    BIT    11H    ;监测到错误标志
        OVER_FLAG    BIT    12H    ;超载标志
        DS_END_FLAG    BIT    13H    ;SJA1000发送完成标志
        WUI_FLAG    BIT     14H    ;唤醒SJA1000标志
        MODELCT       BIT     15H    ;工作模式选择标志
        STRET       BIT     16H    ;自检结果标志
        CAMOD       EQU     4000H
        CMR         EQU     4001H
        SR          EQU     4002H
        IR          EQU     4003H
        IER         EQU     4004H
        BTR0        EQU     4006H
        BTR1        EQU     4007H
        OCR         EQU     4008H
        REGTEST     EQU     4009H
        ALC         EQU     400BH
        ECC         EQU     400CH
        EWLR        EQU     400DH
        RXERR       EQU     400EH
        TXERR       EQU     400FH
        TXB         EQU     4010H
        RXB         EQU     4010H
        ACR         EQU     4010H
        AMR         EQU     4014H
        RMC         EQU     401DH
        RBSA        EQU     401EH
        CDR         EQU     401FH

           ORG         0000H
           LJMP        MAIN
       ORG        0013H
       LJMP        PCAN_INT0        ;中断方式访问SJA1000程序



           ORG         0100H
MAIN:
           MOV            R0,#07fH
           CLR          A
           MOV          @R0,A
           DJNZ            R0,$-1
           MOV          @R0,A
           MOV          SP,#60H
           SETB         PX1
           SETB         EX1
           SETB         EA
           LCALL    DELAY
           LCALL    DELAY

SJA1000_INIT0:
           MOV          ERRCT,#020H
           LCALL        PCAN_TEST
           JNB          F0,OK
           DJNZ         ERRCT,SJA1000_INIT0
WRONG:     SJMP         $
OK:        MOV        AMRBF,#0FFH
       MOV        AMRBF+1,#0FFH
        MOV        AMRBF+2,#0FFH
        MOV        AMRBF+3,#0FFH
       MOV        ACRBF,#00H
       MOV        ACRBF+1,#00H
        MOV        ACRBF+2,#00H
        MOV        ACRBF+3,#00H
       MOV        BTRC,#03H
       SETB        BTRC                   ;选择测试模式
       LCALL    SJA1000_INIT1
       JNB            F0,RT_TESTDATA
RT_TESTDATA:
       MOV        TXBF,#88H
       MOV        TXBF+1,#0AAH
       MOV        TXBF+2,#55H
       MOV        TXBF+3,#0AAH
       MOV        TXBF+4,#55H
       MOV        TXBF+5,#0AAH
       MOV        TXBF+6,#55H
       MOV        TXBF+7,#0AAH
       MOV        TXBF+8,#55H
       MOV        TXBF+9,#0AAH
           MOV        TXBF+10,#55H
       MOV        TXBF+11,#0AAH
       MOV        TXBF+12,#55H
       LCALL    PCAN_DATA_WRITE
           NOP
           NOP
           LCALL        PCAN_DATA_RECEIVE

           MOV          DPTR,#SR
           MOVX         A,@DPTR
           JNB        DS_END_FLAG,WRONG
           JNB            RCV_GOOD,WRONG
           SETB        STRET               ;自收发测试通过
           CLR        BTRC                ;选择正常模式
       SJMP        $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;程序功能:测试SJA1000接口是否正常
;入口条件:无
;出口    :测试结果F0

PCAN_TEST:
           MOV            DPTR,   #REGTEST
           SETB           F0
           MOVX           A,      @DPTR
           MOV            A,      #0AAH
           MOVX           @DPTR,  A
           CLR            A
           MOVX           A,      @DPTR
           CJNE           A,      #0AAH,PCAN_CM_QUIT
           MOV            A,      #055H
           MOVX           @DPTR,  A
           CLR            A
           MOVX           A,      @DPTR
           CJNE           A,      #055H,PCAN_CM_QUIT
           CLR            A
           MOVX           @DPTR,  A
           CLR            F0
PCAN_CM_QUIT:
           RET

;程序功能:进入复位模式
PCAN_ENTER_RETMODEL:
      MOV            DPTR,   #CAMOD
      MOVX           A,      @DPTR
      ORL            A,      #01H
      MOVX           @DPTR,  A
      CLR            F0
      MOVX           A,      @DPTR
      JB             ACC.0,  PCAN_ER_QUIT
      SETB           F0
PCAN_ER_QUIT:
      RET

;程序功能:进入自检模式
PCAN_ENTER_STMODEL:
      MOV            DPTR,   #CAMOD
      MOVX           A,      @DPTR
      ORL            A,      #04H
      MOVX           @DPTR,  A
      CLR            F0
      MOVX           A,      @DPTR
      JB             ACC.0,  PCAN_ES_QUIT
      SETB           F0
PCAN_ES_QUIT:
      RET

;程序功能:退出自检模式
PCAN_QUIT_STMODEL:
      MOV            DPTR,   #CAMOD
      MOVX           A,      @DPTR
      ANL            A,      #0F6H
      MOVX           @DPTR,  A
      CLR            F0
      MOVX           A,      @DPTR
      JB             ACC.0,  PCAN_QS_QUIT
      SETB           F0
PCAN_QS_QUIT:
      RET

;程序功能:进入工作模式
PCAN_QUIT_RETMODEL:
      MOV            DPTR,   #CAMOD
      MOVX           A,      @DPTR
      ANL            A,      #0FEH
      MOVX           @DPTR,  A
      CLR            F0
      MOVX           A,      @DPTR
      JNB            ACC.0,  PCAN_QR_QUIT
      SETB           F0
PCAN_QR_QUIT:
      RET

;程序功能:数据发送
PCAN_DATA_WRITE:
TXSB:      MOV          DPTR,#SR
           MOVX         A,@DPTR
           JB           ACC.4,TXSB
TXSB0:     MOVX         A,@DPTR
           JNB          ACC.3,TXSB0
TXSB1:     MOVX         A,@DPTR
           JNB          ACC.2,TXSB0
TXSB2:     MOV          R0,#TXBF
           MOV               DPTR,#TXB
           MOV          A,@R0
       JB           ACC.6,PCAN_WYB

           ANL          A,#0FH
           ADD          A,#05H
             MOV          R7,A
           AJMP         PCAN_WRTXBUF

PCAN_WYB:
           MOV               R7,#05H

PCAN_WRTXBUF:

           MOV               A,@R0
           MOVX              @DPTR,A
           INC               R0
           INC               DPTR
           DJNZ              R7,PCAN_WRTXBUF
           MOV               R7,#10H
           LCALL             PCAN_CMD_PRG

PCAN_DW_QUIT:
           RET

;程序功能:接收数据于内部接收数据缓冲区
PCAN_DATA_RECEIVE:
     MOV           DPTR,   #SR
     MOVX          A,      @DPTR
     SETB          F0
     JNB           ACC.0,  PCAN_DR_QUIT
     CLR           F0
     MOV           R0,#RXBF

     MOV           DPTR,   #RXB
     MOVX          A,      @DPTR

;     JB            ACC.6,  PCAN_RCVYB

     ANL           A,      #0FH
     ADD           A,      #05H
     MOV           R7,     A
     AJMP          PCAN_RCVDATA

PCAN_RCVYB:
     MOV           R7,     #02

PCAN_RCVDATA:
                   
     MOVX          A,      @DPTR
     MOV           @R0,    A
     INC           DPTR
     INC           R0
     DJNZ          R7,     PCAN_RCVDATA
     MOV       R7,#04H                  ;释放接收缓冲区
     LCALL       PCAN_CMD_PRG
           MOV          DPTR,#ALC
           MOVX         A,@DPTR
           MOV          DPTR,#ECC
           MOVX         A,@DPTR

PCAN_DR_QUIT:

     RET

;程序功能:设置SJA1000波特率 晶振12MHZ
PCAN_SET_BANDRATE:
    MOV      A,             R7
    CLR      CY
    SUBB     A,             #9
    SETB     F0
    JNC      PCAN_SETBR_QUIT
    CLR      F0
    MOV      A,             R7
    RL       A
    MOV      DPTR,          #PCAN_SETBR
    MOVC     A,             @A+DPTR
    MOV      R5,            A
    MOV      A,             R7
    RL       A
    INC      A
    MOVC     A,             @A+DPTR
    MOV      R6,            A

    MOV      DPTR,          #BTR0

    MOV      A,             R5
    MOVX     @DPTR,         A
    SETB     F0
    MOVX     A,             @DPTR
    XRL      A,             R5
    JNZ      PCAN_SETBR_QUIT
    CLR      F0
    INC      DPTR
    MOV      A,             R6
    MOVX     @DPTR,         A
    SETB     F0
    MOVX     A,             @DPTR
    XRL      A,             R6
    JNZ      PCAN_SETBR_QUIT
    CLR      F0
PCAN_SETBR_QUIT:
    RET


PCAN_SETBR:
    DB 65H,     1CH                     ;10KBPS
    DB 52H,     1CH                     ;20KBPS
    DB 47H,     1CH                     ;50KBPS
    DB 43H,     1CH                     ;100KBPS
    DB 42H,     1CH                     ;125KBPS
    DB 41H,     1CH                     ;250KBPS
    DB 40H,     1CH                     ;500KBPS
    DB 40H,     16H                     ;800KBPS
    DB 40H,     14H                     ;1000KBPS


;程序功能:写接收码与接收屏蔽码
PCAN_SET_OBJECT:
           MOV          DPTR,#AMR
           MOV          R6,#04H
           MOV          R0,#AMRBF
CANI1:     MOV          A,@R0
           MOVX         @DPTR,A
           MOVX        A,@DPTR
       MOV        B,A
       MOV          A,@R0
       SETB        F0
       XRL          A,B
           JNZ          PCAN_SETO_QUIT
       INC        R0
           INC          DPTR
           DJNZ         R6,CANI1

           MOV          DPTR,#ACR
           MOV          R6,#04H
           MOV          R0,#ACRBF
CANI2:     MOV          A,@R0
           MOVX         @DPTR,A
           MOVX        A,@DPTR
       MOV        B,A
       MOV          A,@R0
       SETB        F0
       XRL          A,B
           JNZ          PCAN_SETO_QUIT
       INC        R0
           INC          DPTR
           DJNZ         R6,CANI2
           CLR          F0
PCAN_SETO_QUIT:
           RET





;程序功能:输出模式时钟分频及中断使能设置
PCAN_SET_OUTCLK:
    MOV      DPTR,      #OCR
    MOV      A,         R7
    MOVX     @DPTR,     A
    MOV      B,         A
    MOVX     A,         @DPTR
    SETB     F0
    CJNE     A,         B,   PCAN_SETOC_QUIT
    CLR      F0
    MOV      DPTR,      #CDR
    MOV      A,         R6
    MOVX     @DPTR,     A
    MOV      B,         A
    MOVX     A,         @DPTR
    SETB     F0
    CJNE     A,         B,   PCAN_SETOC_QUIT
    CLR      F0
    MOV      DPTR,      #IER
    MOV      A,         R5
    MOVX     @DPTR,     A
    MOV      B,         A
    MOVX     A,         @DPTR
    SETB     F0
    CJNE     A,         B,   PCAN_SETOC_QUIT
    CLR      F0

PCAN_SETOC_QUIT :
    RET

;程序功能:FIFO起始地址、发送错误计数器、错误代码捕捉器清0

PCAN_CLR_RTRC:
           MOV          DPTR,#RBSA
           MOV          A,#00H
           MOVX         @DPTR,A
           MOV          DPTR,#TXERR
           MOV          A,#00H
           MOVX         @DPTR,A
           MOV          DPTR,#ECC
           MOVX         A,@DPTR
           RET

;程序功能;命令执行程序

PCAN_CMD_PRG:
     MOV           A,      R7
     CJNE          A,      #01,   PCAN_CMD1

     MOV           DPTR,   #CMR
     MOVX          @DPTR,  A
     CLR           F0
     RET

PCAN_CMD1:
     CJNE          A,      #02,    PCAN_CMD2

     MOV           DPTR,   #SR
     MOVX          A,      @DPTR
     SETB          F0
     JB            ACC.5,  PCAN_CMD_QUIT
     CLR           F0
PCAN_CMD_QUIT:
     RET

PCAN_CMD2:
           CJNE          A,      #04,    PCAN_CMD3

           MOV           DPTR,   #CMR
           MOVX          @DPTR,  A

           MOV           DPTR,   #SR
           MOVX          A,      @DPTR
           SETB          F0
           JB            ACC.0,  PCAN_DB_QUIT
           CLR           F0
PCAN_DB_QUIT:
           RET

PCAN_CMD3:
     CJNE          A,      #08,    PCAN_CMD4

     MOV           DPTR,   #CMR
     MOVX          @DPTR,  A
     NOP
     NOP
     MOV           DPTR,   #SR
     MOVX          A,      @DPTR
     SETB          F0
     JB            ACC.1,  PCAN_DOVER_QUIT
     CLR           F0
PCAN_DOVER_QUIT:
     RET

PCAN_CMD4:
     CJNE          A,      #10H,    PCAN_CMD5

     MOV           DPTR,   #CMR
     MOVX          @DPTR,  A
     CLR           F0
PCAN_CMD5:
     RET

;外部中断0
PCAN_INT0:
    push    DPH
    PUSH    DPL
    PUSH    PSW            ;PSW,ACC入栈
    PUSH    ACC
    MOV    DPTR,#IR    ;读中断寄存器
    MOVX    A,@DPTR          ;
    MOV    SAVE_INT_INFO,A        ;保存中断寄存器的内容
    JNB     ACC.0,BCAN_INT1        ;接收中断
    SETB    RCV_GOOD        ;置位接收标志
;        LCALL   PCAN_DATA_RECEIVE
BCAN_INT1:
    MOV    A,SAVE_INT_INFO
    JNB    ACC.1,BCAN_INT2        ;发送中断
    SETB       DS_END_FLAG        ;置位发送标志
BCAN_INT2:
    MOV    A,SAVE_INT_INFO
    JNB    ACC.2,BCAN_INT3        ;错误中断
    SETB    ERR_FLAG        ;置位错误标志
BCAN_INT3:
    MOV    A,SAVE_INT_INFO
    JNB    ACC.3 ,BCAN_INT4                   
    SETB    OVER_FLAG               ;数据溢出中断               
BCAN_INT4:
    MOV    A,SAVE_INT_INFO
    JNB    ACC.4,BCAN_INT5        ;唤醒中断
    SETB    WUI_FLAG        ;唤醒中断处理标志
BCAN_INT5:
    POP    ACC
    POP    PSW
    POP DPL
    POP DPH
    RET




DELAY:
       MOV            R7,#0FFH
D1:        MOV          R6,#0FFH
       DJNZ            R6,$
       DJNZ            R7,D1
       RET

           END
这是原程序 还在调试阶段 子程序已经写完 请指教 

使用特权

评论回复
地板
comeon_000|  楼主 | 2007-8-27 20:43 | 只看该作者

又调了一天 找不出问题

wxj1952兄有时间可以帮我看看吗 已经头疼了有一段时间了

使用特权

评论回复
5
wxj1952| | 2007-8-27 21:04 | 只看该作者

等我.

错了吧?
PCAN_WRTXBUF:
           MOV               DPTR,#TXB
           MOV               A,@R0
           MOVX              @DPTR,A
           INC               R0
           INC               DPTR
           DJNZ              R7,PCAN_WRTXBUF
           MOV               R7,#10H
           LCALL             PCAN_CMD_PRG

PCAN_DW_QUIT:
           RET

不止123个错.慢慢看.

使用特权

评论回复
6
comeon_000|  楼主 | 2007-8-27 22:12 | 只看该作者

非常感谢

使用特权

评论回复
7
comeon_000|  楼主 | 2007-8-27 22:13 | 只看该作者

确实是那一处错误

现在自收发已经调通了 看来写程序心要细才行

使用特权

评论回复
8
comeon_000|  楼主 | 2007-8-27 22:20 | 只看该作者

修改过的程序

PCAN的发送寄存器只能写不能读是比较郁闷的,BCAN的至少还写能能读,现问题也比较容易发现.个PCAN自收发程序已经修改正确,望能对大家有一定参考价值.

使用特权

评论回复
9
wxj1952| | 2007-8-28 10:20 | 只看该作者

PCAN的发送寄存器能读!

写入是操作模式下通过地址16~28写入,读出是操作模式下通过地址96~108读出。手册上写了。

另外,如果你的硬件没有问题,写入16~28后,必然能从32~95的FIFO中看到你写入的内容。(取决于RBSA指针)因为CAN协议是发送回馈的。

使用特权

评论回复
10
comeon_000|  楼主 | 2007-8-31 08:47 | 只看该作者

谢谢楼上

领教了 学到不少东西

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

58

帖子

0

粉丝