<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 調(diào)試好的CAN總線程序(匯編1)

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

          作者: 時(shí)間:2016-12-15 來源:網(wǎng)絡(luò) 收藏

          系統(tǒng)can地址為550,用于can系統(tǒng)測(cè)試,應(yīng)用T0定時(shí)器每隔1s向can總線發(fā)送一組數(shù)據(jù):數(shù)據(jù)長(zhǎng)度為8個(gè)字節(jié),
          首字節(jié)為05H,第二個(gè)字節(jié)為累加變量,每秒鐘數(shù)值增加1,

          本文引用地址:http://www.ex-cimer.com/article/201612/330387.htm

          CONTROLLER_BASEEQU7E00H;SJA1000的片選地址

          RCV_GOODBIT0FH;成功的接收一幀標(biāo)志
          SEC_FLAGBIT010H;一秒到標(biāo)志
          ERR_FLAGBIT011H;監(jiān)測(cè)到錯(cuò)誤標(biāo)志

          SAVE_INT_INFODATA032H;保存SJA1000中斷寄存器的內(nèi)容

          SEND_DATA_BUF1DATA040H;發(fā)送緩沖區(qū)
          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;接收緩沖區(qū)
          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;錯(cuò)誤狀態(tài)表示
          TEST_DATADATA07FH;測(cè)試發(fā)送數(shù)據(jù)

          ;程序開始
          ORG0000H
          LJMPMAIN;運(yùn)行主程序

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

          ORG000BH
          LJMPT0_INTERRUPT;定時(shí)器0中斷

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

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

          LOOPER:
          JNBRCV_GOOD,LOOPER2;sja1000成功接收一幀,通知CPU處理
          CLRRCV_GOOD
          LCALLRCVDATA_PRG
          LOOPER2:
          JNBSEC_FLAG,LOOPER3;一秒時(shí)間到,每秒發(fā)送一次
          CLRSEC_FLAG
          CLRP3.5;點(diǎn)亮指示燈
          LCALLSENDDATA_PRG
          LOOPER3:
          JNBERR_FLAG,LOOPER4;錯(cuò)誤標(biāo)志,錯(cuò)誤處理
          CLRERR_FLAG
          LCALLERR_PRG
          LOOPER4:
          AJMPLOOPER

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

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

          ;;;;;錯(cuò)誤信息處理;;;;;;;;;;;;
          ERR_PRG:
          LCALLBCAN_ENTER_RETMODEL;進(jìn)入復(fù)位模式
          LCALLSJA1000_INT0 ;
          MOVERROR_STATUS,#0FCH
          RET

          ;;;;;;;;;接收數(shù)據(jù)處理部分;;;;;
          RCVDATA_PRG:
          MOVR0,# RCV_DATA_BUF1;微處理器接收首地址
          LCALLBCAN_DATA_RECEIVE;調(diào)用接收數(shù)據(jù)子程序
          MOVR7,#04H;釋放接收緩沖區(qū)
          LCALLBCAN_CMD_PRG;
          RET
          ;;;;;;;;;;;;;;;;;;控制SJA1000向CAN總線發(fā)送數(shù)據(jù)處理部分;;;;;;;;;;;;;;;
          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;將要發(fā)送的數(shù)據(jù)送入發(fā)送緩沖區(qū)
          MOVR7,#01
          LCALLBCAN_CMD_PRG
          RET

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

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

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

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



          關(guān)鍵詞: CAN總線程序匯

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();