<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > CAN總線(xiàn)學(xué)習筆記二:CAN自收發(fā)程序解讀

CAN總線(xiàn)學(xué)習筆記二:CAN自收發(fā)程序解讀

作者: 時(shí)間:2015-01-06 來(lái)源:網(wǎng)絡(luò ) 收藏

  花了一整個(gè)下午的時(shí)間,徹頭徹尾的把 PIAE小組提供的源程序解讀了一遍。解讀別人的程序是一件挺費時(shí)費力的一件事,但是在對某項技術(shù)或者說(shuō)某個(gè)芯片的入門(mén)階段參考別人的程序又是一項必不可少的任務(wù)。

本文引用地址:http://dyxdggzs.com/article/267768.htm

  對于這個(gè)程序,頭一個(gè)任務(wù)當然是把頭文件先瀏覽一遍,能弄明白的還是先弄明白,對后面程序的解讀有好處。C文件里給出了三個(gè)頭文件:

  #include

  #include

  #include

  第一個(gè)reg52.h我就不廢話(huà)了,下一個(gè)intrins.h我在上一篇日志里也詳細的作了說(shuō)明,這里也不提了。can_selfdef.h是程序員自己定義的一個(gè)頭文件,在這個(gè)頭文件里除了一些宏定義和管腳的一些說(shuō)明外,最重要的就是要弄明白“總線(xiàn)SJA1000寄存器地址定義”。這個(gè)我開(kāi)始也沒(méi)弄明白,后來(lái)反復琢磨,才發(fā)現作者在這個(gè)程序里吧SJA1000的寄存器作為單片機的外部擴展RAM尋址了,從而省去了編寫(xiě)一些底層的驅動(dòng)程序,這就讓大家連SJA1000的datasheet的時(shí)序圖都不用看了(不過(guò)下一步我想用驅動(dòng)程序來(lái)控制SJA1000)。

  看完頭文件,可不能從第一個(gè)程序依次往下看。應該直接找到主程序main()解讀:

  void main(void)

  {

  //MCU初始化(主要是各中斷寄存器的初始化)

  SJA_RST = 1; //總線(xiàn)復位管腳復位無(wú)效

  SJA_CS = 0; //CAN總線(xiàn)片選有效

  EX1 = 1; //開(kāi)MCU外部中斷INT1

  IT1 = 0; //MCU外部中斷INT1為電平觸發(fā),也是CAN總線(xiàn)接收中斷口

  IT0 = 1; //MCU外部中斷INT0為下降沿觸發(fā)

  EX0 = 1; //開(kāi)MCU外部中斷INT0

  EA = 1; //開(kāi)MCU總中斷

  SJA_CS = 1; //CAN總線(xiàn)片選無(wú)效,使得對數據總線(xiàn)的操作不會(huì )影響SJA1000。

  //SJA1000初始化

  CAN_init(); //對SJA1000寄存器的讀寫(xiě)是采用外部寄存器尋址方式,

  //所以不需要程序單獨控制片選有效無(wú)效

  _nop_();

  _nop_();

  //主循環(huán)

  while(1)

  {

  _nop_();

  _nop_();

  Rxd_deal(); //接收處理程序

  Txd_deal(); //發(fā)送處理程序

  led_seg7(0,Txd_data); //數碼管1-2顯示發(fā)送數據子程序

  led_seg7(1,Rxd_data+3); //數碼管3-4顯示接收數據子程序

  }

  }

  上面的注釋是本人詳細做了加工的,先是單片機中斷寄存器的初始化,打開(kāi)了單片機的INT0和INT1兩個(gè)外部中斷。INT0是外接按鍵的,所以是下降沿觸發(fā)。這個(gè)按鍵每按下一次,待發(fā)送的數據的第一個(gè)字節就會(huì )加一,這個(gè)數據同時(shí)會(huì )顯示在數碼管上。而INT1是外界著(zhù)SJA1000的發(fā)送數據中斷端口的,采用電平觸發(fā),也就是說(shuō)當SJA1000發(fā)送數據時(shí),就會(huì )觸發(fā)中端口INT1,從而讓單片機進(jìn)行數據的接收工作。

  接下來(lái)是SJA1000的各個(gè)寄存器的初始化,主要是在CAN_init();這個(gè)程序里完成的,主要是設置一些寄存器使得滿(mǎn)足本次試驗的要求。

  最后就進(jìn)入了主循環(huán)中。不斷的進(jìn)行接收數據處理、發(fā)送數據處理以及將數據的頭一個(gè)字節的數值顯示在數碼管上。每當按鍵被按下后就會(huì )置位發(fā)送數據狀態(tài)標志位,這時(shí)就進(jìn)入發(fā)送狀態(tài),無(wú)非就是把ID碼和數據等13個(gè)字節送入SJA1000的相應寄存器里,其它的事情就交給SJA1000來(lái)完成就可以了。由于是進(jìn)行自傳送,所以SJA1000在接收到數據后會(huì )給單片機一個(gè)中斷,此時(shí)也就進(jìn)入了接收數據狀態(tài)下,同樣只要把SJA1000里相應的寄存器讀出來(lái)就可以了。為了觀(guān)察發(fā)送和接收的數據是否一致,這個(gè)程序里就把發(fā)送的數據的頭一個(gè)字節通過(guò)數碼管顯示出來(lái)。發(fā)送數據正常顯示,而接收數據為了便于觀(guān)察,我把它+3,就是說(shuō)顯示的接收數據會(huì )比發(fā)送數據大3。最后很好的得到驗證了。



關(guān)鍵詞: CAN 自收發(fā)

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>