;于士友 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