;2008.9.23调通
;西岭雪 2008.9.22
;can总线上位机接收端测试程序 调试用
;串口调通 2008.9.20
;下位机发送一帧数据 0AAH 08H 55H 55H 55H 55H 55H 55H 55H 55H
;加上ID等共10个字节(不连CRC)。上位机接收,并根据出错状态等改变相应
;的端口的状态。并把接收到的10个子节发送到串口,最后死循环。
;**************************************************************
;*************** 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. 8. 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 ;单片机初始化
SETB TR1 ;启动定时器1 产生波特率
;MOV P2,#00H ;调试用
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,#02H
MOVX @R0,A
;SETB SJA1000_CS
;//进入主循环
MAIN_LOOP:
SETB SJA1000_INT ;置一以便输入
JB SJA1000_INT,MAIN_LOOP ;为1则继续检测
;接收到数据
CLR SJA1000_CS
MOV R0,#REG_INTERRUPT
MOVX A,@R0
JNB ACC.0,MAIN_LOOP
CLR P1.0 ;如果接收到数据 则拉低 ;调试用
MOV R4,#200
CALL DELAYNMS ;延时以等待数据接收完
;***************************************************************************
;调试处理部分
MOV R0,#REG_RxBuffer1 ;接收缓冲区的首地址
MOVX A,@R0
XRL A,#0AAH
JNZ RCVDATA_PRG ;ID不为0AAH则跳
INC R0
MOVX A,@R0
XRL A,#08H
JNZ RCVDATA_PRG
INC R0
MOV R7,#08
DEBUG_LOOP:
MOVX A,@R0
XRL A,#055H
JNZ RCVDATA_PRG
INC R0
DJNZ R7,DEBUG_LOOP
CLR P1.2 ;如果接收到的与设定发送的不相符则拉低 ;调试用
-
-
xilinxue 发表于 2009/2/7 13:21:40
MOV R0,#REG_RxBuffer1 ;接收缓冲区的首地址
MOVX A,@R0
XRL A,#0AAH
JNZ RCVDATA_PRG ;ID不为0AAH则跳
INC R0
MOVX A,@R0
XRL A,#08H
JNZ RCVDATA_PRG
INC R0
MOV R7,#08
DEBUG_LOOP:
MOVX A,@R0
XRL A,#055H
JNZ RCVDATA_PRG
INC R0
DJNZ R7,DEBUG_LOOP
CLR P1.2 ;如果接收到的与设定发送的不相符则拉低 ;调试用end
引用 xilinxue 2009/2/7 13:21:40 发表于2楼的内容