您的位置:控制工程论坛网论坛 » 现场总线 » Can总线收发实例 2

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

Can总线收发实例 2

xilinxue  发表于 2008/9/23 12:22:49      789 查看 0 回复  [上一主题]  [下一主题]

手机阅读

;***************************************************************************
;接收数据处理部分
RCVDATA_PRG:  
 MOV R0,# RCV_DATA_BUF1              ;微处理器接收首地址
 LCALL BCAN_DATA_RECEIVE           ;调用接收数据子程序
 MOV R7,#04H            ;释放接收缓冲区
 LCALL BCAN_CMD_PRG  ;
;将接收的数据发送至串口
 MOV R0,# RCV_DATA_BUF2               ;计算接收数据长度判断远程帧、数据帧
 MOV         A,@R0
 JB          ACC.4,RD_PRG1  ;远程帧
;数据帧
 ANL A,#0FH              ;计算数据数目
 ADD A,#02H                   ;计算帧的数据长度
 MOV  R7, A
 AJMP        RD_UARTSD
RD_PRG1:
 MOV         R7,#02H
RD_UARTSD:   
 MOV         R0,#RCV_DATA_BUF1              ;微处理器接收首地址
 CALL UART_SEND                           ;调用串口发送程序


;***************************************************************************
      
       JMP              $


       JMP             MAIN_LOOP



;**************************************************************
;*子程序定义                                                  *
;*                                                            *
;*                                                            *
;*                                                            *
;**************************************************************


;$INCLUDE (SJA_BCANCONF.ASM)
;************************************************************************
;************************************************************************
;************************************************************************
;*                                                                      *
;*  CAN 控制器SJA1000基本CAN汇编子程序说明(BasicCAN 工作方式)          *
;*                                                                      *
;************************************************************************
;************************************************************************
;*                                                                      *
;*  目的:       用户在应用SJA1000组成CAN网络中通过简单的参数设置和调用  *
;*              本文件提供函数便能使自己的CAN系统进行基本的调试和运行   *
;*                                                                      *
;*  文件名:     SJA_BCANFUNC.ASM                                        *
;*                                                                      *
;*  模块名:     --                                                      *
;*                                                                      *
;*  目标系统:   任何基于任何兼容8051指令的微处理器同SJA1000组成的CAN    *
;*              系统                                                    *
;*                                                                      *
;*  应用语言:   Keil ASM-51 or Intel ASM-51                             *
;*                                                                      *
;************************************************************************
;*  版本 :V1.0                                                          *
;*                                                                      *
;************************************************************************


;//以下为函数定义
;************************************************************************
;*函数:      BCAN_CREATE_COMMUNATION                                    *
;*应用资源:  R0,ACC,F0                                                *
;*参数说明:  无                                                         *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示SJA1000接口正常                                    *
;*           1 ; 表示SJA1000与处理器接口不正常                          *
;*                                                                      *
;*说明:该函数用于检测CAN控制器的接口是否正常                            *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    LCALL   BCAN_CREATE_COMMUNATION  ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;接口不正常跳到错误处理         *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************


BCAN_CREATE_COMMUNATION:
      MOV            R0,#REG_TEST                           ;对测试寄存器进行读写测试
      MOVX           A,@R0
      MOV            A,#0AAH                                ;写入值0AAH
      MOVX           @R0,A
      SETB           F0
      NOP
      MOVX           A,@R0                                  ;读出值
      CJNE           A,#0AAH,BCAN_CM_QUIT                   ;测试写入读出是否正确
      MOV            A,#055H                                ;再次测试
      MOVX           @R0,A                                  ;写入055H
      NOP
      NOP
      MOVX           A,@R0
      CJNE           A,#055H,BCAN_CM_QUIT                   ;测试写入读出是否正确
      CLR            A                                      ;清零测试寄存器
      MOVX           @R0,A
      CLR            F0                                     ;接口正确
BCAN_CM_QUIT:
      RET


;************************************************************************
;*函数:      BCAN_ENTER_RETMODEL                                        *
;*应用资源:  DPTR,ACC,F0                                                *
;*参数说明:  无                                                         *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示成功进入复位工作模式                               *
;*           1 ; 表示不能进入复位工作模式                               *
;*                                                                      *
;*说明:CAN控制器进入复位工作模式                                        *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    LCALL   BCAN_ENTER_RETMODEL      ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;复位请求不成功跳到错误处理     *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_ENTER_RETMODEL:
      MOV            R0,   #REG_CONTROL       ;控制寄存器访问
      MOVX           A,      @R0              ;
      ORL            A,      #01H               ;置位复位请求
      MOVX           @R0,  A                              ;
      CLR            F0
      MOVX           A,      @R0              ;验证复位是否写入
      JB             ACC.0,  BCAN_ER_QUIT
      SETB           F0                         ;复位不成功
BCAN_ER_QUIT:
      RET



;************************************************************************
;*函数:      BCAN_QUIT_RETMODEL                                         *
;*应用资源:  R0,ACC,F0                                                *
;*参数说明:  无                                                         *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示成功退出复位工作模式                               *
;*           1 ; 表示不能退出复位工作模式                               *
;*                                                                      *
;*说明:CAN控制器退出复位工作模式,进入工作模式                          *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    LCALL   BCAN_QUIT_RETMODEL       ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;不能退出复位模式跳到错误处理   *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_QUIT_RETMODEL:
      MOV            R0,#REG_CONTROL            ; 控制寄存器访问
      MOVX           A,@R0                      ;
      ANL            A,#0FEH                    ;清零复位请求,进入工作状态
      NOP
      MOVX           @R0,  A
      CLR            F0
      MOVX           A,@R0
      JNB            ACC.0,  BCAN_QR_QUIT       ;验证是否退出复位状态
      SETB           F0
BCAN_QR_QUIT:
      RET


;************************************************************************
;*函数:      BCAN_DATA_WRITE                                            *
;*应用资源:  DPTR,ACC,R0,R7                                             *
;*参数说明:                                                             *
;*    R0:存放待发送特定帧各式的数据的首地址                             *
;*                                                                      *
;*返回值:    F0,存放返回值                                              *
;*           0 ; 表示将数据成功的送至发送缓冲区                         *
;*           1 ; 表示上一次的数据正在发送,                             *
;*             ; 表示发送缓冲区被锁定,不能写入数据                     *
;*             ; 表示写入数据错误                                       *
;*                                                                      *
;*说明: 将待发送特定帧各式的数据,送入SJA1000发送缓存区中,然后启动     *
;*        SJA1000发送。                                                 *
;*      特定帧格式为:开始的两个字节存放 '描述符' ,以后的为数据          *
;*   描述符包括11位长的ID(标志符)\1位RTR\4位描述数据长度的DLC共16位    *
;*                                                                      *
;*注:本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否。     *
;*    不指示SJA1000将该数据正确发送到CAN总线上完毕与否,要向总线发送请在*
;*    本子程序后调用发送命令                                            *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R0,      #DATA_BUF0      ;;装入微处理器要发送数据的首地址 *
;*    LCALL   BCAN_DATA_WRITE          ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;继续用户代码                   *
;*    LJMP    ERROR_PRG                ;;写入发送缓冲区错跳到错误处理   *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_DATA_WRITE:
      MOV            R0,   #REG_STATUS  ;读取状态寄存器
      MOVX           A,      @R0        ;判断上次发送是否完成
      SETB           F0
      JNB            ACC.3,  BCAN_DW_QUIT ;正在发送退出
      CLR            F0
      MOVX           A,      @R0        ;判断发送缓冲区是否锁定,
      SETB           F0
      JNB            ACC.2,  BCAN_DW_QUIT ;锁定则跳出
      CLR            F0


      INC            R1                   ;
      MOV            A,      @R1          ;ID号的低3位 \RTR位 \数据长度DLC
      DEC            R1                   ;恢复指针指向发送数据的首地址
      MOV            R0,   #REG_TxBuffer1;发送缓冲区首地址


      JB             ACC.4,  BCAN_WYB     ;远程帧
      ;数据帧
      ANL            A,      #0FH         ;计算发送数据的长度
      ADD            A,      #02H
      MOV            R7,     A
      AJMP           BCAN_WRTXBUF         ;


BCAN_WYB:
      MOV            R7,     #02          ;写入发送缓冲区数据长度为2


BCAN_WRTXBUF:
      MOV            A,      @R1          ;开始写入
      MOVX           @R0,  A
      SETB           F0
      MOVX           A,      @R0        ;校验写入的是否正确
      XRL            A,      @R1
      JNZ            BCAN_DW_QUIT         ;写入错误退出
      CLR            F0                   ;正确写入继续
      INC            R1
      INC            R0
      DJNZ           R7,     BCAN_WRTXBUF ;没有写完继续


BCAN_DW_QUIT:
      RET

1楼 0 0 回复