我用的是ZLG的DP-51PROC实验箱,DP-668实验板做CAN通信实验,硬件连接如下;DP-668中SJA1000的CAN_INT脚接MCU的INT0,DP-51PROC实验箱中的CAN模块是插上去的,所以CAN模块的地址得自己连接硬件来确定,我把MCU的高8位地址总线中的A15,A14,A13通过74LS138译码器进行译码(A15接A,A14接B,A13接C),74LS138译码器的输出端Y6接SJA1000的CAN_CS,这样我就把SJA1000的地址设为0X6000。同理我把DP-51PROC实验箱中的CAN_INT脚接脚接MCU的INT0。两个板子之间通过双绞线连接(板内部已有120欧的匹配电阻)。 然后我将DP-668光盘里带的汇编示例程序下了进去,(对DP-51只是修改了SJA1000的地址) 现在的问题是系统在程序下载后不出结果,我观察了一下发现SJA1000的INT脚不产生跳变,因而产生不了外部中断.但我不知道产生这种情况的原因是什么.有对DP-51PROC实验箱和DP-668实验板中CAN模块熟悉的高手请指点一下啊,我硬件连的对不对? 程序如下:
$INCLUDE (SJA_BCANCONF.ASM) ;导入硬件定义文件
;使用前变量定义 RCV_GOOD BIT 0FH ;成功的接收一帧标志 SEC_FLAG BIT 010H ;一秒到标志 ERR_FLAG BIT 011H ;监测到错误标志 OVER_FLAG BIT 012H ;超载标志 DS_END_FLAG BIT 013H ;SJA1000发送完成标志 WUI_FLAG BIT 014H ;唤醒SJA1000标志
;TOIR BIT 015H ;定时器T0标志
;;;;;;;;;;;;;;;显示闪烁标志区;;;;;;;;;;;;;;;;;;;; FLIGHDISP DATA 02FH FLIGHBIT0 BIT 07FH FLIGHBIT1 BIT 07EH FLIGHBIT2 BIT 07DH FLIGHBIT3 BIT 07CH FLIGHBIT4 BIT 07BH FLIGHSYNC BIT 07AH
;;;;;;;;;;;;;;显示位选选择;;;;;;;;;;;;;;;;;; ;EN_DISPBIT0 BIT P1.7 ;EN_DISPBIT1 BIT P1.6 ;EN_DISPBIT2 BIT P1.5 ;EN_DISPBIT3 BIT P1.4 ;EN_DISPBIT4 BIT P1.3
;;;;;;;;;;;;;;;显示闪烁频率计数;;;;;;;;;;;;;;;;;;;; FLIGHCOUNT DATA 07EH
;;;;;;;;;;;;;;;显示位选计数;;;;;;;;;;;;;;;;;;;; DISP_POINT DATA 07DH
SEC_COUNT_L DATA 030H ;秒定时计数器 SEC_COUNT_H DATA 031H SAVE_INT_INFO DATA 032H ;保存SJA1000中断寄存器的内容 ERRORCOUNT DATA 033H ;错误计数 DISPLAYBUF0 DATA 034H ;显示缓冲区34H--38H
; 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 050H ;接收缓冲区 RCV_DATA_BUF2 DATA 051H RCV_DATA_BUF3 DATA 052H RCV_DATA_BUF4 DATA 053H RCV_DATA_BUF5 DATA 054H RCV_DATA_BUF6 DATA 055H RCV_DATA_BUF7 DATA 056H RCV_DATA_BUF8 DATA 057H RCV_DATA_BUF9 DATA 058H RCV_DATA_BUF10 DATA 059H
ERROR_STATUS DATA 07CH ;错误状态表示 TEST_DATA DATA 07FH ;测试发送数据
;程序开始 ORG 8000H LJMP MAIN ;运行主程序
ORG 8003H LJMP BCAN_INT0 ;中断方式访问SJA1000程序
ORG 800BH LJMP T0_INTERRUPT ;定时器0中断
ORG 8100H ;程序开始 MAIN: ;内部RAM清零 MOV R0,#07fH CLR A MOV @R0,A DJNZ R0,$-1 MOV @R0,A MOV SP,#60H ;设置SP CLR P1.0 LCALL DELAY ;延时 LCALL DELAY LCALL UART_INIT ;串口初始化 LCALL SJA1000_INT0 ;初始化SJA1000 LCALL T0_INIT ;初始化定时器0 CLR P1.1 ;点亮指示灯 SETB PX0 SETB IT0 SETB EX0 SETB ET0 SETB TR0 SETB EA
LOOPER: JNB RCV_GOOD,LOOPER2 ;sja1000成功接收一帧,通知CPU处理 CLR RCV_GOOD LCALL RCVDATA_PRG LOOPER2: JNB SEC_FLAG,LOOPER3 ;一秒时间到,每秒发送一次 CLR SEC_FLAG CLR P1.2 ;点亮指示灯 LCALL SENDDATA_PRG LOOPER3: JNB ERR_FLAG,LOOPER4 ;错误标志,错误处理 CLR ERR_FLAG LCALL ERR_PRG LOOPER4: AJMP LOOPER
SJA1000_INT0: LCALL BCAN_CREATE_COMMUNATION ;调用SJA1000接口测试函数 MOV R7, #04 LCALL BCAN_SET_BANDRATE ;设置波特率为100k MOV R7, #0A8H ;设置接收报文ID MOV R6, #0FFH LCALL BCAN_SET_OBJECT MOV R7, #0AAH ;设置输出控制、时钟分频;正常输出模式 MOV R6, #048H ;使能内部比较器、禁止CLKOUT LCALL BCAN_SET_OUTCLK ; LCALL BCAN_QUIT_RETMODEL ;退出复位状态 MOV DPTR,#REG_CONTROL ;开放SJA1000内部功能中断 MOV A,#01EH ;中断开放 MOVX @DPTR,A CLR F0 RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ERR_PRG: LCALL BCAN_ENTER_RETMODEL ;进入复位模式 MOV ERROR_STATUS,#SJA_SEND_ERR
;接收数据处理部分 RCVDATA_PRG: ;LCALL UART_INIT 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 ;微处理器接收首地址 LCALL UART_SEND ;调用串口发送程序 ; LCALL DISP_OK LJMP LOOPER2 ;控制SJA1000向CAN总线发送数据处理部分 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 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 LJMP LOOPER3
;定时器0初始化 T0_INIT: MOV A,TMOD ANL A,#0F0H ORL A,#01H MOV TMOD,A;T0工作在方式1 MOV TH0,#0FCH ;定时周期1MS MOV TL0,#066H SETB ET0 MOV TCON,#055H ;启动定时器 RET ;串口初始化 UART_INIT: MOV SCON,#050H ;串口数据1个STOP,8个DATA,无校验 MOV A,TMOD ANL A,#0FH ORL A,#020H MOV TMOD,A ;用定时器1做波特率发生器 MOV TH1,#0FDH ;波特率9600bps MOV TL1,#0FDH SETB TR1 clr ES CLR TI RET
;延时程序 DELAY: MOV R7,#0FFH D1: MOV R6,#0ffh DJNZ R6,$ DJNZ R7,D1 RET ;串口发送子程序 UART_SEND: CLR TI MOV A,@R0 MOV SBUF,A JNB TI,$ CLR TI INC R0 DJNZ R7,UART_SEND RET ;外部中断0 BCAN_INT0: push DPH PUSH DPL PUSH PSW ;PSW,ACC入栈 PUSH ACC USING 3 ;应用寄存器第3组 MOV DPTR,#REG_INTERRUPT ;读中断寄存器 MOVX A,@DPTR ; MOV SAVE_INT_INFO,A ;保存中断寄存器的内容 JNB ACC.0,BCAN_INT1 ;接收中断 SETB RCV_GOOD ;置位接收标志
BCAN_INT1: MOV A,SAVE_INT_INFO JNB ACC.2,BCAN_INT2 ;错误中断 SETB ERR_FLAG ;置位错误标志 BCAN_INT2: POP ACC POP PSW POP DPL POP DPH RETI ;定时器0中断 T0_INTERRUPT: push DPH PUSH DPL PUSH PSW ;PSW、ACC入栈 PUSH ACC USING 2 MOV TH0,#80H ;设置定时周期0.3S MOV TL0,#26H INC 3AH MOV A,3AH CJNE A,#23H,T0_QUIT ;判断1秒时间是否到 MOV 3AH,#00H INC TEST_DATA ;测试发送的数据,每1秒加1 SETB SEC_FLAG ;置位1秒到标志 T0_QUIT: POP ACC POP PSW POP DPL POP DPH RETI
$INCLUDE (SJA_BCANFunc.ASM) ;导入子程序文件 END
|