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

xilinxue

xilinxue   |   当前状态:在线

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

注册时间: 2008-06-26

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

空间 发短消息加为好友

Can总线收发实例 4

xilinxue  发表于 2008/9/23 12:28:52      734 查看 0 回复  [上一主题]  [下一主题]

手机阅读

;************************************************************************
;*函数:      BCAN_DATA_RECEIVE                                          *
;*应用资源:  R0,ACC,R1,R7,F0                                         *
;*参数说明:  R0,存放微处理器保存数据缓冲区的首地址                      *
;*返回值:    F0=0;接收成功                                              *
;*           F0=1;接收失败                                              *
;*说明:CAN控制器接收数据,仅限于接收数据                                 *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R1,      #DATA_BUF0      ;;装入微处理器要发送数据的首地址 *
;*    LCALL   BCAN_DATA_RECEIVE        ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码             *
;*    LJMP    ERROR_PRG                ;;失败,跳到错误处理             *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************
BCAN_DATA_RECEIVE:
     MOV           R1,     #REG_STATUS
     MOVX          A,      @R1
     SETB          F0
     JNB           ACC.0,  BCAN_DR_QUIT   ;判断报文是否有效
     CLR           F0


     MOV           R1,     #REG_RxBuffer2 ;接收报文的ID号的低3位 \RTR位 \数据长度DLC
     MOVX          A,      @R1
     MOV           R1,     #REG_RxBuffer1 ;接收缓冲区的首地址
     JB            ACC.4,  BCAN_RCVYB     ;接收到的是远程帧


;//数据帧
     ANL           A,      #0FH           ;计算接收到的数据长度
     ADD           A,      #02H           ;计算报文的长度
     MOV           R7,     A
     AJMP          BCAN_RCVDATA


BCAN_RCVYB:
     MOV           R7,     #02            ;远程帧


BCAN_RCVDATA:                             ;开始读取数据
     MOVX          A,      @R1
     MOV           @R0,    A
     INC           R0
     INC           R1
     DJNZ          R7,     BCAN_RCVDATA


BCAN_DR_QUIT:


     RET


;************************************************************************
;*子程序:    BCAN_SET_BANDRATE                                          *
;*应用资源:  DPTR,ACC,R5,R6,R7,F0                                       *
;*参数说明:  R7            波特率(Kbit/s)         BTR0     BTR1               *
;*           0             20              053H,    02FH                *
;*           1             40              087H,    0FFH               *
;*           2             50              047H,    02FH               *
;*           3             80              083H,    0FFH                *
;*           4             100             043H,    02fH                *
;*           5             125             03H,     01cH                 *
;*           6                      200             081H,    0faH               *
;*           7             250             01H,     01cH            *
;*           8             400             080H,    0faH                *
;*           9             500             00H,     01cH               *
;*           10             666             080H,    0b6H                 *
;*           11             800             00H,     016H             *
;*           12             1000            00H,     014H                  *
;*返回值:    F0,存放返回值                                              *
;*           0 ;波特率设置成功                                          *
;*           1 ;波特率设置失败                                          *
;*                                                                      *
;*说明:设置CAN控制器SJA1000通讯波特率.SJA1000的晶振为必须为16MHZ,       *
;*     其它晶体的频率的值的波特率,需自己计算 。该子程序只能用于        *
;*     复位模式                                                         *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R7,      #06             ;;设置波特率100KBPS              *
;*    LCALL   BCAN_SET_BANDRATE        ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码             *
;*    LJMP    ERROR_PRG                ;;失败,跳到错误处理             *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************


BCAN_SET_BANDRATE:
    MOV      A,R7                               ;判断波特率的值是否存在
    CLR      CY
    SUBB     A,#13                              ;
    SETB     F0
    JNC      BCAN_SETBR_QUIT                    ;输入的值大于12则不正确
    CLR      F0
    MOV      A,R7
    RL       A
    MOV      DPTR,#BCAN_SETBR                   ;查表找出相应的预设第一个值
    MOVC     A,@A+DPTR
    MOV      R5,A                               ;将数据保存
    MOV      A,R7                               ;找出第二个值
    RL       A
    INC      A
    MOVC     A,@A+DPTR
    MOV      R6,A                               ;保存值


    MOV      R0,#REG_BTR0                       ;装入波特率预设值,同步跳转宽度
                                                ;位宽度
    MOV      A,R5
    MOVX     @R0,A
    SETB     F0
    NOP
    MOVX     A,@R0
    XRL      A,R5                               ;判断写入是否正确
    JNZ      BCAN_SETBR_QUIT                    ;不正确
    CLR      F0
    INC      R0
    MOV      A,R6
    MOVX     @R0,A
    SETB     F0
    NOP
    MOVX     A,@R0
    XRL      A,R6                               ;判断写入是否正确
    JNZ      BCAN_SETBR_QUIT
    CLR      F0
BCAN_SETBR_QUIT:
    RET



BCAN_SETBR:
    DB 053H,     02FH                     ;20KBPS的预设值
    DB 087H,     0FFH                     ;40KBPS的预设值
    DB 047H,     02FH                     ;50KBPS的预设值
    DB 083H,     0FFH                     ;80KBPS的预设值


    ;DB 043H,     02fH                     ;100KBPS的预设值
    DB 042H,      02FH                    ;100KBPS的预设值  12MHZ晶振


    DB 03H,      01cH                     ;125KBPS的预设值
    DB 081H,     0faH                     ;200KBPS的预设值
    DB 01H,      01cH                     ;250KBPS的预设值
    DB 080H,     0faH                     ;400KBPS的预设值
    DB 00H,      01cH                     ;500KBPS的预设值
    DB 080H,     0b6H                     ;666KBPS的预设值
    DB 00H,      016H                     ;800KBPS的预设值
    DB 00H,      014H                     ;1000KBPS的预设值



;************************************************************************
;*子程序:    BCAN_SET_OBJECT                                            *
;*应用资源:  R0,ACC,R6,R7,F0                                          *
;*    R7:存放验收代码寄存器(ACR)的参数设置                            *
;*    R6:存放接收屏蔽寄存器(AMR)的参数设置                            *
;*返回值:    F0,存放返回值                                              *
;*           0 ;通信对象设置成功                                        *
;*           1 ;通信对象设置失败                                        *
;*                                                                      *
;*说明:设置CAN节点的通讯对象,允许接收的报文ID号的高8位(D10--D3) 。     *
;*     允许接收的报文,是由AMR和ACR共同决定的.                           *
;*    满足以下条件的ID号的报文才可以被接收                              *
;*[(ID.10-ID.3)≡(AC.7-AC.0)]||(AM.7-AM.0)≡11111111              *
;*    该子程序只能用于复位模式                                          *                                                                                                                     *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R7,      #0AAH           ;;只允许接收ID号高8位为'10101010'*
;*    MOV     R6,      #00H            ;;                               *
;*    LCALL   BCAN_SET_OBJECT          ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码             *
;*    LJMP    ERROR_PRG                ;;失败,跳到错误处理             *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************



BCAN_SET_OBJECT:


    MOV      R0,#REG_ACR                        ;写ACR寄存器
    MOV      A,R7
    MOVX     @R0,A
    NOP
    NOP
    MOVX     A,@R0
    SETB     F0
    XRL      A,R7                               ;检验写入是否正确
    JNZ      BCAN_SETO_QUIT
    CLR      F0
    INC      R0                                 ;写AMR寄存器
    MOV      A,R6
    MOVX     @R0,A
    NOP
    NOP
    MOVX     A,@R0
    SETB     F0
    XRL      A,R6                               ;检验写入是否正确
    JNZ      BCAN_SETO_QUIT
    CLR      F0
BCAN_SETO_QUIT:
    RET



;************************************************************************
;*子程序:    BCAN_SET_OUTCLK                                            *
;*应用资源:  R0,ACC,R6,R7,F0,B                                        *
;*    R7:存放输出寄存器(OCR)的参数设置                                *
;*    R6:存放时钟分品寄存器(REG_CDR)的参数设置                        *
;*返回值:    F0,存放返回值                                              *
;*           0 ;设置成功                                                *
;*           1 ;设置失败                                                *
;*                                                                      *
;*说明:设置SJA1000的输出模式和时钟分频 。该子程序只能用于复位模式       *                                                                                                                     *
;************************************************************************
;*子程序调用示例:                                                       *
;* USER_CODE:                          ;;用户代码                       *
;*    -----   -----                                                     *
;*    MOV     R7,      #0AAH           ;;输出为正常模式                 *
;*    MOV     R6,      #048H           ;;禁止CLKOUT,BasicCAN模式        *
;*    LCALL   BCAN_SET_OUTCLK          ;;调用子程序                     *
;*    JNB     F0,      USER_CODE1      ;;成功,继续用户代码             *
;*    LJMP    ERROR_PRG                ;;失败,跳到错误处理             *
;*                                                                      *
;* USER_CODE1:                                                          *
;*    -----   -----                    ;;用户代码                       *
;************************************************************************


BCAN_SET_OUTCLK:
    MOV      R0,#REG_OCR                        ;写OCR寄存器
    MOV      A,R7
    MOVX     @R0,A
    MOV      B,A
    NOP
    NOP
    MOVX     A,@R0
    SETB     F0
    CJNE     A,B,BCAN_SETOC_QUIT                ;检验写入是否正确
    CLR      F0
    MOV      R0,#REG_CDR                        ;写CDR寄存器
    MOV      A,R6
    MOVX     @R0,A
    MOV      B,A
    MOVX     A,@R0
    SETB     F0
    CJNE     A,B,BCAN_SETOC_QUIT                ;检验写入是否正确
    CLR      F0
BCAN_SETOC_QUIT:
    RET

1楼 0 0 回复