打印
[CAN-bus/DeviceNet]

急得不得了,大家看看问题出在什么地方?

[复制链接]
2209|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lotto023|  楼主 | 2007-5-28 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, se, AN, CAN, rc
   我用的是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

相关帖子

沙发
lotto023|  楼主 | 2007-5-29 20:02 | 只看该作者

怎么没人回帖啊

做个CAN总线怎么这么难,真郁闷.有问题都没办法解决啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

17

帖子

0

粉丝