您的位置:控制工程论坛网论坛 » 现场总线 » Can总线收发实例 1

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

Can总线收发实例 1

xilinxue  发表于 2009/2/7 13:21:40      1060 查看 1 回复  [上一主题]  [下一主题]

手机阅读

;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                                ;如果接收到的与设定发送的不相符则拉低 ;调试用

1楼 0 0 回复
  • xilinxue

    xilinxue   |   当前状态:在线

    总积分:16186  2024年可用积分:0

    注册时间: 2008-06-26

    最后登录时间: 2020-03-22

    空间 发短消息加为好友

    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

    2楼 回复本楼

    引用 xilinxue 2009/2/7 13:21:40 发表于2楼的内容

总共 , 当前 /