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