新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 調試好的CAN總線程序(匯編1)

        調試好的CAN總線程序(匯編1)

        作者: 時間:2016-12-15 來源:網絡 收藏

        系統can地址為550,用于can系統測試,應用T0定時器每隔1s向can總線發送一組數據:數據長度為8個字節,
        首字節為05H,第二個字節為累加變量,每秒鐘數值增加1,

        本文引用地址:http://www.104case.com/article/201612/330387.htm

        CONTROLLER_BASEEQU7E00H;SJA1000的片選地址

        RCV_GOODBIT0FH;成功的接收一幀標志
        SEC_FLAGBIT010H;一秒到標志
        ERR_FLAGBIT011H;監測到錯誤標志

        SAVE_INT_INFODATA032H;保存SJA1000中斷寄存器的內容

        SEND_DATA_BUF1DATA040H;發送緩沖區
        SEND_DATA_BUF2DATA041H
        SEND_DATA_BUF3DATA042H
        SEND_DATA_BUF4DATA043H
        SEND_DATA_BUF5DATA044H
        SEND_DATA_BUF6DATA045H
        SEND_DATA_BUF7DATA046H
        SEND_DATA_BUF8DATA047H
        SEND_DATA_BUF9DATA048H
        SEND_DATA_BUF10DATA049H

        RCV_DATA_BUF1DATA050H;接收緩沖區
        RCV_DATA_BUF2DATA051H
        RCV_DATA_BUF3DATA052H
        RCV_DATA_BUF4DATA053H
        RCV_DATA_BUF5DATA054H
        RCV_DATA_BUF6DATA055H
        RCV_DATA_BUF7DATA056H
        RCV_DATA_BUF8DATA057H
        RCV_DATA_BUF9DATA058H
        RCV_DATA_BUF10DATA059H

        ERROR_STATUSDATA07CH;錯誤狀態表示
        TEST_DATADATA07FH;測試發送數據

        ;程序開始
        ORG0000H
        LJMPMAIN;運行主程序

        ORG0003H
        LJMPBCAN_INT0;中斷方式訪問SJA1000程序

        ORG000BH
        LJMPT0_INTERRUPT;定時器0中斷

        ORG0100H;程序開始
        MAIN:
        MOVR0,#07fH
        CLRA
        MOV@R0,A
        DJNZR0,$-1
        MOV@R0,A
        MOVSP,#60H;設置SP
        CLRP2.0;SJA1000退出硬件復位模式

        LCALLSJA1000_INT0;初始化SJA1000
        LCALLT0_INIT
        CLRP3.4;點亮指示燈
        SETBPX0
        SETBIT0
        SETBEX0
        SETBET0
        SETBTR0
        SETBEA

        LOOPER:
        JNBRCV_GOOD,LOOPER2;sja1000成功接收一幀,通知CPU處理
        CLRRCV_GOOD
        LCALLRCVDATA_PRG
        LOOPER2:
        JNBSEC_FLAG,LOOPER3;一秒時間到,每秒發送一次
        CLRSEC_FLAG
        CLRP3.5;點亮指示燈
        LCALLSENDDATA_PRG
        LOOPER3:
        JNBERR_FLAG,LOOPER4;錯誤標志,錯誤處理
        CLRERR_FLAG
        LCALLERR_PRG
        LOOPER4:
        AJMPLOOPER

        ;;;;;;;;;初始化SJA1000;;

        SJA1000_INT0:
        LCALLBCAN_CREATE_COMMUNATION ;調用SJA1000接口測試函數
        MOVR7,#04
        LCALLBCAN_SET_BANDRATE;設置波特率為100k
        MOVR7,#0A8H;設置接收報文ID
        MOVR6,#0FFH
        LCALLBCAN_SET_OBJECT
        MOVR7,#0AAH;設置輸出控制、時鐘分頻;正常輸出模式
        MOVR6,#048H;使能內部比較器、禁止CLKOUT
        LCALLBCAN_SET_OUTCLK;
        LCALLBCAN_QUIT_RETMODEL;退出復位狀態
        MOVDPTR,#REG_CONTROL;開放SJA1000內部功能中斷
        MOVA,#01EH;中斷開放
        MOVX@DPTR,A
        CLRF0
        RET

        ;;;;;錯誤信息處理;;;;;;;;;;;;
        ERR_PRG:
        LCALLBCAN_ENTER_RETMODEL;進入復位模式
        LCALLSJA1000_INT0 ;
        MOVERROR_STATUS,#0FCH
        RET

        ;;;;;;;;;接收數據處理部分;;;;;
        RCVDATA_PRG:
        MOVR0,# RCV_DATA_BUF1;微處理器接收首地址
        LCALLBCAN_DATA_RECEIVE;調用接收數據子程序
        MOVR7,#04H;釋放接收緩沖區
        LCALLBCAN_CMD_PRG;
        RET
        ;;;;;;;;;;;;;;;;;;控制SJA1000向CAN總線發送數據處理部分;;;;;;;;;;;;;;;
        SENDDATA_PRG:
        MOVR0,#SEND_DATA_BUF1
        MOV@R0,#02H
        INCR0
        MOV@R0,#08H
        INCR0
        MOV@R0,#05H
        MOVA,TEST_DATA
        INCR0
        MOV@R0,A
        MOVR0,#SEND_DATA_BUF1
        LCALLBCAN_DATA_WRITE;將要發送的數據送入發送緩沖區
        MOVR7,#01
        LCALLBCAN_CMD_PRG
        RET

        ;;;;;;;;;;定時器0初始化;;;;;;;;;;
        T0_INIT:
        MOVA,TMOD
        ANLA,#0F0H
        ORLA,#01H
        MOVTMOD,A;T0工作在方式1
        MOVTH0,#0FCH;定時周期1MS
        MOVTL0,#066H
        MOV3AH,#00H
        RET

        ;;;;;;;;;外部中斷0;;;;;;;;;;;
        BCAN_INT0:
        pushDPH
        PUSHDPL
        PUSHPSW;PSW,ACC入棧
        PUSHACC
        USING3;應用寄存器第3組
        MOVDPTR,#REG_INTERRUPT;讀中斷寄存器
        MOVXA,@DPTR;
        MOVSAVE_INT_INFO,A;保存中斷寄存器的內容
        JNBACC.0,BCAN_INT1;接收中斷
        SETBRCV_GOOD;置位接收標志

        BCAN_INT1:
        MOVA,SAVE_INT_INFO
        JNBACC.2,BCAN_INT2;錯誤中斷
        SETBERR_FLAG;置位錯誤標志
        BCAN_INT2:
        POPACC
        POPPSW
        POPDPL
        POPDPH
        RETI
        ;;;;;;;;定時器0中斷;;;;
        T0_INTERRUPT:
        pushDPH
        PUSHDPL
        PUSHPSW;PSW、ACC入棧
        PUSHACC
        USING2
        MOVTH0,#80H;設置定時周期0.3S
        MOVTL0,#26H
        INC3AH
        MOVA,3AH
        CJNEA,#23H,T0_QUIT;判斷1秒時間是否到
        MOV3AH,#00H
        INCTEST_DATA;測試發送的數據,每1秒加1
        SETBSEC_FLAG;置位1秒到標志
        T0_QUIT:
        POPACC
        POPPSW
        POPDPL
        POPDPH
        RETI

        BCAN_ENTER_RETMODEL:
        MOVDPTR,#REG_CONTROL;控制寄存器訪問
        MOVXA,@DPTR;
        ORLA,#01H;置位復位請求
        MOVX@DPTR,A;
        CLRF0
        MOVXA,@DPTR;驗證復位是否寫入
        JBACC.0,BCAN_ER_QUIT
        SETBF0;復位不成功
        BCAN_ER_QUIT:
        RET



        關鍵詞: CAN總線程序匯

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 广平县| 贺州市| 勐海县| 武穴市| 庐江县| 饶河县| 天柱县| 南投县| 莎车县| 通道| 曲阳县| 济南市| 梅州市| 连南| 吴旗县| 白银市| 洪泽县| 平湖市| 交城县| 长春市| 东乡族自治县| 华安县| 固阳县| 西林县| 乐安县| 和顺县| 噶尔县| 彭泽县| 临夏市| 章丘市| 彝良县| 卓资县| 方城县| 东兰县| 同心县| 屏边| 大名县| 河北区| 莲花县| 泗阳县| 南陵县|