您的位置:控制工程论坛网论坛 » 现场总线 » can总线发送端测试程序 1

xilinxue

xilinxue   |   当前状态:在线

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

注册时间: 2008-06-26

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

空间 发短消息加为好友

can总线发送端测试程序 1

xilinxue  发表于 2008/9/23 13:08:20      1022 查看 0 回复  [上一主题]  [下一主题]

手机阅读

;于士友 2008.9.22
;can总线下位机发送端测试程序


;发送一帧数据 0AAH 08H 55H 55H 55H 55H 55H 55H 55H 55H
;加上ID等共10个字节(不连CRC给上位机接收。只发送一次就进入死循环。
;延时一段时间才发送,以等待上位机初始化完毕。
;**************************************************************
;*************** BASIC CAN 测试程序 ***************************
;* 说明:                                                     *
;*      本程序测试硬件电路在BASIC CAN 模式下是否能够正常工作  *
;*      电路同样适用于PeliCan 模式。不包括串口发送程序        *
;**************************************************************
;* 测试电路说明:                                             *
;*      SJA1000 的AD.0 ~ AD.7 连接单片机的P0.0 ~ P0.7         *
;*      SJA1000 的RST 通过单片机的P1.4口控制                  *
;* 单片机型号:                                               *
;*      AT89S52   11.0592MHz                                  *
;* CAN 控制器及收发器:                                       *
;*      SJA1000  PCA82C250  12MHz                             *
;**************************************************************
;* 程序开始编制日期      2008. 9. 10                          *
;* 程序调试通过日期                                           *
;* 程序版本号            Ver 1.0                              *
;**************************************************************
;**************************************************************


;//以下为电路中的资源定义
;硬件电路相关
SJA1000_RESET     BIT   P1.4
SJA1000_CS        BIT   P1.5
SJA1000_INT       BIT   INT0


;//包含周立功SJA1000内部资源定义头文件
$INCLUDE (SJA_BCANCONF.ASM)


;//RAM 资源分配
SEND_DATA_BUF1    DATA  040H ;发送缓冲区
SEND_DATA_BUF2    DATA 041H
SEND_DATA_BUF3    DATA 042H
SEND_DATA_BUF4    DATA 043H
SEND_DATA_BUF5    DATA 044H
SEND_DATA_BUF6    DATA 045H
SEND_DATA_BUF7    DATA 046H
SEND_DATA_BUF8    DATA 047H
SEND_DATA_BUF9    DATA 048H
SEND_DATA_BUF10   DATA 049H


RCV_DATA_BUF1     DATA 04AH ;接收缓冲区
RCV_DATA_BUF2     DATA 04BH
RCV_DATA_BUF3     DATA 04CH
RCV_DATA_BUF4     DATA 04DH
RCV_DATA_BUF5     DATA 04EH
RCV_DATA_BUF6     DATA 04FH
RCV_DATA_BUF7     DATA 050H
RCV_DATA_BUF8     DATA 051H
RCV_DATA_BUF9     DATA 052H
RCV_DATA_BUF10    DATA 053H


ERROR_STATUS      DATA  030H     ;错误状态表示
TEST_DATA         DATA 031H     ;测试发送数据


SAVE_INT_INFO     DATA 032H  ;保存SJA1000中断寄存器的内容
ERRORCOUNT        DATA  033H         ;错误计数


;//SJA1000中断位标志定义
EI_FLAG           BIT   00H      ;错误中断
DOI_FLAG          BIT   01H      ;数据溢出中断
TI_FLAG           BIT   02H      ;发送中断
RI_FLAG           BIT   03H      ;接收中断


 


;***************************************************************************
;//中断服务程序地址定义
       ORG     0000H
       JMP              MAIN


       ORG      0003H                           ;外部中断0
       ;JMP              INT_RECEIVE


;***************************************************************************


;//主程序开始
       ORG      0035H
MAIN:
       NOP
       NOP
       NOP
       MOV              R7,#00H
       DJNZ             R7,$                    ;延时


       ;内部RAM清零
       MOV              R0,#07fH
       CLR              A
       MOV              @R0,A
       DJNZ             R0,$-1
       MOV              @R0,A


       CLR              EA
       MOV              IE,#00H
       MOV              IP,#00H
       MOV              SP , #60H
       MOV              P0,#0FFH
       MOV              P1,#0FFH
       MOV              P2,#0FFH
       MOV              P3,#0FFH
       CALL             INIT_AT89S52        ;单片机初始化


       ;MOV              P2,#00H             ;调试用
      
       MOV              TEST_DATA,#55H      ;要发送的实验数据 
         
       CALL             HARD_RESET_SJA1000  ;硬件复位SJA1000


       CLR              SJA1000_CS          ;选通SJA1000
       CALL             INIT_SJA1000        ;初始化SJA1000
      
       JNB              F0,INIT_SJA1000_INT ;初始化成功则跳
       CLR              P1.1                ;调试用 初始化失败


       ;;设置SJA1000中断使能
INIT_SJA1000_INT:


       MOV             R0,#REG_CONTROL
       MOVX             A,@R0             ;只允许发送中断
       ANL              A,#01H
       ORL              A,#04H


       MOVX             @R0,A


       ;SETB             SJA1000_CS
      
       MOV              R4,#0FFH
       CALL             DELAYNMS
       MOV              R4,#0FFH
       CALL             DELAYNMS                ;等待0.5秒再发送,以使上位机准备好接收
      
SENDDATA_PRG:
    MOV           R0,#SEND_DATA_BUF1
    MOV           @R0,#0AAH
    INC           R0
    MOV       A,TEST_DATA
    MOV           R7,#08
    MOV           A,#08
    MOV           @R0,A                        ;数据帧 8个数据
RB_DATA:
    MOV           A,TEST_DATA
    INC           R0
    MOV           @R0,A
    DJNZ          R7,RB_DATA                    ;将特定格式的帧存入发送缓冲区


    MOV           R0,#SEND_DATA_BUF1
    LCALL         BCAN_DATA_WRITE               ;将要发送的数据送入发送缓冲区
  
    MOV           R7,#01                        ;发送请求
    LCALL         BCAN_CMD_PRG


;//进入主循环
MAIN_LOOP:
       SETB             SJA1000_INT             ;置一以便输入


       JB               SJA1000_INT,MAIN_LOOP   ;为1则继续检测


       ;发送完数据
       CLR              SJA1000_CS
       MOV              R0,#REG_INTERRUPT
       MOVX             A,@R0
       JNB              ACC.1,MAIN_LOOP


       CLR              P1.0                    ;发送完数据 拉低 调试用
       JMP              $


       JMP             MAIN_LOOP

1楼 0 0 回复