⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can模块程序清单.asm

📁 基于sja1000的CAN驱动程序 可以直接使用在现场总线中
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;程序清单:
CANADR     EQU  00H
CONTROL   EQU    00H    ;内部控制寄存器地址
COMMAND   EQU    01H    ;内部命令寄存器地址;只可进行写,读出值为0XFF
STATUS    EQU    02H    ;内部状态寄存器地址;可进行读,写操作无效
INTERRUPT EQU    03H    ;内部中断寄存器地址; 只读
ACR       EQU    04H    ;内部验收代码寄存器地址;可读写
AMR      EQU    05H     ;内部验收屏蔽寄存器地址;可读写
BTR0     EQU    06H     ;总线定时寄存器0;可读写
BTR1     EQU    07H     ;总线定时寄存器1; 可读写
OCR      EQU    08H     ;输出控制寄存器; 可读写
;********************************************************************
;发送缓冲区(内部地址0AH--13H)
;********************************************************************
TxBuffer1               EQU	0AH            ;发送缓冲区1
TxBuffer2               EQU	0BH            ;发送缓冲区2
TxBuffer3               EQU	0CH            ;发送缓冲区3
TxBuffer4               EQU	0DH            ;发送缓冲区4
TxBuffer5               EQU	0EH            ;发送缓冲区5
TxBuffer6               EQU	0FH            ;发送缓冲区6
TxBuffer7               EQU	10H            ;发送缓冲区7
TxBuffer8               EQU	11H            ;发送缓冲区8
TxBuffer9               EQU	12H            ;发送缓冲区9
TxBuffer10              EQU	13H            ;发送缓冲区10
;********************************************************************
;接收缓冲区(内部地址014H--01DH)
;********************************************************************
RxBuffer1               EQU     14H	           ;接收缓冲区1
RxBuffer2               EQU     15H            ;接收缓冲区2
RxBuffer3               EQU     16H            ;接收缓冲区3
RxBuffer4               EQU     17H            ;接收缓冲区4
RxBuffer5               EQU     18H            ;接收缓冲区5
RxBuffer6               EQU     19H            ;接收缓冲区6
RxBuffer7               EQU     1AH            ;接收缓冲区7
RxBuffer8               EQU     1BH            ;接收缓冲区8
RxBuffer9               EQU     1CH            ;接收缓冲区9
RxBuffer10              EQU     1DH            ;接收缓冲区10
;********************************************************************;CAN的命令字
;********************************************************************
TRCMD                   EQU   01h	       ;发送请求命令
ATCMD                   EQU   02h     	       ;夭折发送命令
RRBCMD                  EQU   04h              ;释放接收缓冲区
COSCMD                  EQU   08h              ;清除超载状态
GTSCMD                  EQU   10h              ;进入睡眠状态命令
;********************************************************************
;数据存贮区
;********************************************************************
SDATABUFO                EQU   70H
RDATABUFO                EQU   0A0H

;********************************************************************
;主程序
;********************************************************************
      ORG                    0000H
      LJMP                   START
      ORG                    002BH
      LJMP                   CANINT
      ORG                    0100H
START:
      MOV       P4,     #00H
      LCALL     INIT				;初始化
      LCALL     SENDCODE			;发送数据
WAITRINT:							;等待接收中断
      AJMP      WAITRINT
ERRORPRG:							;若错误,程序重新运行
      LJMP      START
RET
;********************************************************************
;接收中断子程序
;********************************************************************
CANINT:
       MOV       CANADR,        #INTERRUPT      ;读中断寄存器
       MOV       A,             CANDAT
       MOV      IEN0,   #00H                     ;关闭中断
       MOV     R0,      #SDATABUFO              ;装入微处理器要接收数据的首地址
       LCALL   DATARECEIVE                      ;调用子程序
       JNB     F0,      USER_CODE1              ;成功,继续用户代码
       LJMP    ERRORPRG                         ;失败,跳到错误处理
USER_CODE1:
       MOV      R7,     #RRBCMD                 ;释放接收缓冲区
       LCALL    CMDPRG
       JB     F0,      USER_CODE1
QUITINT:
       LCALL    SENDCODE                         ;发送子程序
       MOV       IEN0,   #0A0H                    ;开放中断
       RETI
;********************************************************************
;发送子程序
;********************************************************************
SENDCODE:
SEND:
      MOV       R0,     #SDATABUFO
      LCALL     DATAWRITE
      JNB       F0,      CMDPRGCODE
      LJMP      ERRORPRG
CMDPRGCODE:
      MOV       R7,     #TRCMD
      LCALL     CMDPRG
      JNB       F0,     LOOPSD
      LJMP      ERRORPRG
LOOPSD:
      RET
;********************************************************************
;初始化子程序
;********************************************************************
INIT:
      MOV       IP0,    #20H                    ;中断优先级
      MOV       IEN0,   #0A0H                    ;开放中断
      LCALL     RETMODEL                        ;进入复位模式
      JNB       F0,     SETOUTCLKCODE
      LJMP      ERRORPRG
SETOUTCLKCODE:
      MOV       R7,     #0AAH                   ;设置输出控制寄存器
      LCALL     SETOUTCLK
      JNB       F0,      SETBANDRATECODE
      LJMP      ERRORPRG
SETBANDRATECODE:
      MOV       R7,     #0CH
      LCALL     SETBANDRATE                      ;设置通信波特率
      JNB       F0,     SETOBJECTCODE
      LJMP      ERRORPRG
SETOBJECTCODE:
      MOV       R7,     #55H                    ;设置通信接点对象
      MOV       R6,     #00H
      LCALL     SETOBJECT
      JNB       F0,QUITRETMODELCODE
      LJMP      ERRORPRG
QUITRETMODELCODE:
      LCALL     QUITRETMODEL                      ;退出复位模式
      JNB       F0,     OTHERS
      LJMP      ERRORPRG
OTHERS:
RET
;********************************************************************
;子程序:      RETMODEL
;应用资源:  DPTR,ACC,F0
;参数说明:  无
;返回值:    F0,存放返回值
;           0  表示成功进入复位工作模式
;           1  表示不能进入复位工作模式
;说明:CAN控制器进入复位工作模式
;********************************************************************
RETMODEL:
      MOV            CANADR,    #CONTROL       ;控制寄存器访问
      MOV            A,        CANDAT
      ORL            A,        #01H           ;置位复位请求
      MOV            CANDAT,   A
      CLR            F0
      MOV            A,        CANDAT         ;验证复位是否写入
      JB             acc.0,ERQUIT
      SETB           F0                       ;复位不成功
ERQUIT:
      RET
;********************************************************************
;子程序:      QUITRETMODEL
;应用资源:  DPTR,ACC,F0
;参数说明:  无
;返回值:    F0,存放返回值
;           0 ; 表示成功退出复位工作模式
;           1 ; 表示不能退出复位工作模式
;说明:CAN控制器退出复位工作模式,进入工作模式
;********************************************************************
QUITRETMODEL:
      MOV            CANADR,   #CONTROL   ; 控制寄存器访问
      MOV            A,        #62H       ;清零复位请求,开接受中断
      MOV            CANDAT,   A
      CLR            F0
      MOV            A,        CANDAT
      JNB             acc.0,    QRQUIT    ;验证是否退出复位状态
      SETB           F0
QRQUIT:
      RET
;********************************************************************
;子程序:      DATAWRITE
;应用资源:  DPTR,ACC,R0,R7
;参数说明:  R0:存放待发送特定帧各式的数据的首地址
;返回值:    F0,存放返回值
;           0 ; 表示将数据成功的送至发送缓冲区
;           1 ; 表示上一次的数据正在发送
;             ; 表示发送缓冲区被锁定,不能写入数据
;             ; 表示写入数据错误
;说明:     将待发送特定帧各式的数据,送入CAN控制器的发送缓存区中,然后启动发送。
;注:      本函数的返回值仅指示,将数据正确写入发送缓存区中与否, 不指示将该
;     数据正确发送到CAN总线上完毕与否,要向总线发送请在本子程序后调用发送命令
;********************************************************************
DATAWRITE:
      MOV            A,      CANSTA        ;判断上次发送是否完成
      SETB           F0
      JNB            ACC.3,  DWQUIT ;正在发送退出
      CLR            F0
      MOV            A,      CANSTA        ;判断发送缓冲区是否锁定,
      SETB           F0
      JNB            ACC.2,  DWQUIT ;锁定则跳出
      CLR            F0
      INC            R0                   ;
      MOV            A,      @R0          ;ID号的低3位 \RTR位 \数据长度DLC
      DEC            R0                   ;恢复指针指向发送数据的首地址
      MOV            R1,     #TxBuffer1;发送缓冲区首地址
      JB             ACC.4,  WYB     ;远程帧
      ;数据帧
      ANL            A,      #0FH         ;计算发送数据的长度
      ADD            A,      #02H
      MOV            R7,     A
      AJMP           WRTXBUF         ;
WYB:
      MOV            R7,     #02          ;写入发送缓冲区数据长度为2
WRTXBUF:
      MOV            CANADR, R1
      MOV            A,      @R0          ;开始写入
      MOV            CANDAT, A
      SETB           F0
      MOV            A,      CANDAT        ;校验写入的是否正确
      XRL            A,      @R0
      JNZ            DWQUIT         ;写入错误退出
      CLR            F0                   ;正确写入继续
      INC            R0
      INC            R1
      DJNZ           R7,     WRTXBUF ;没有写完继续
DWQUIT:
RET


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -