| 
 
|    我用的是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 /> | 
 |