国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

CAN總線學習筆記四:CAN總線通信

發布時間:2016-2-25 11:50    發布者:designapp
關鍵詞: CAN總線 , SJA1000
  在理解了CAN總線的自通信程序后,再來探討CAN總線間的相互通信變得容易了許多。對于是自通信還是相互通信,這個肯定是需要對寄存器進行必要的設置的,分析PIAE的兩個程序后不難發現,自通信和互通信需要設置的知識模式寄存器,這個是在SJA1000的初始化時進行設定的。
  SJA1000的初始化程序我根據習慣,直接把它獨立成一個子程序了。如下,是工作于自通信時的初始化程序。
  ///////////////////////////////////////////////
  //函數:init_sja1000
  //說明:獨立CAN控制器SJA1000的初始化
  //入口:無
  //返回:無
  ///////////////////////////////////////////////
  void init_sja1000(void)
  {
  uchar state;
  uchar ACRR[4];
  uchar AMRR[4];
  // 接收代碼寄存器
  ACRR[0] = 0xff;
  ACRR[1] = 0x22;
  ACRR[2] = 0x33;
  ACRR[3] = 0x44;
  // 接收屏蔽寄存器,只接收主機發送的信息
  AMRR[0] = 0xff;
  AMRR[1] = 0Xff;
  AMRR[2] = 0xff;
  AMRR[3] = 0xff;
  // 使用do--while語句確保進入復位模式
  do
  { // 設置MOD.0=1--進入復位模式,以便設置相應的寄存器
  MODR = 0x09;
  state = MODR;
  }
  while( !(state & 0x01) );
  // 對SJA1000部分寄存器進行初始化設置
  CDR = 0x88; // CDR為時鐘分頻器,CDR.3=1--時鐘關閉, //CDR.7=0---basic CAN,  CDR.7=1---Peli CAN
  BTR0 = 0x31; // 總線定時寄存器0 ;總線波特率設定
  BTR1 = 0x1c; // 總線定時寄存器1 ;總線波特率設定
  IER = 0x01; // IER.0=1--接收中斷使能; IER.1=0--關閉發送中斷使能
  OCR = 0xaa; // 配置輸出控制寄存器
  CMR = 0x04; // 釋放接收緩沖器
  // 初始化接收代碼寄存器
  ACR0 = ACRR[0];
  ACR1 = ACRR[1];
  ACR2 = ACRR[2];
  ACR3 = ACRR[3];
  // 初始化接收屏蔽寄存器
  AMR0 = AMRR[0];
  AMR1 = AMRR[1];
  AMR2 = AMRR[2];
  AMR3 = AMRR[3];
  // 使用do--while語句確保進入自接收模式
  do
  { //MOD.2=1--進入自接收模式,MOD.3=0--雙濾波器模式
  MODR = 0x04;
  state = MODR;
  }
  while( !(state & 0x04) );
  }
  兩個數組ACRR[4]和AMRR[4]分別存儲著需要設置的接收代碼寄存器和接收屏蔽寄存器的數值。這兩個數組的設置設計者可以根據需要自己設定(在互通信時就需要在這里做文章了)。AMRR的四個值都設定為OXFF說明無論總線上傳輸的ID值是什么,也不管ACRR的數值設定是什么,這個SJA1000都照單全收(至于為什么,上節關于驗收濾波的日志做了詳細討論了)。
  然后進入設定模式寄存器進入復位模式。在復位模式下,可以對SJA1000部分寄存器進行初始化設置,并且把剛才兩個數組的數據存入接收代碼寄存器和接收屏蔽寄存器里,自此初始化算是完成了。但是因為CAN總線控制器要進行自通信,所以必須對模式寄存器設定使得SJA1000進入復位模式,這就是最后的do--while語句的作用。
  接下來,我們看CAN總線互相通信的初始化設置。
  ///////////////////////////////////////////////
  //函數:init_sja1000
  //說明:獨立CAN控制器SJA1000的初始化
  //入口:無
  //返回:無
  ///////////////////////////////////////////////
  void init_sja1000(void)
  {
  uchar state;
  uchar ACRR[4];
  uchar AMRR[4];
  // 接收代碼寄存器
  ACRR[0] = 0x11;
  ACRR[1] = 0x22;
  ACRR[2] = 0x33;
  ACRR[3] = 0x44;
  // 接收屏蔽寄存器
  AMRR[0] = 0x00;
  AMRR[1] = 0Xff;
  AMRR[2] = 0x00;
  AMRR[3] = 0xff;
  // 使用do--while語句確保進入復位模式
  do
  { // 設置MOD.0=1--進入復位模式,以便設置相應的寄存器
  MODR = 0x09;
  state = MODR;
  }
  while( !(state & 0x01) );
  // 對SJA1000部分寄存器進行初始化設置
  CDR = 0x88; // CDR為時鐘分頻器,CDR.3=1--時鐘關閉, //CDR.7=0---basic CAN,  CDR.7=1---Peli CAN
  BTR0 = 0x31; // 總線定時寄存器0 ;總線波特率設定
  BTR1 = 0x1c; // 總線定時寄存器1 ;總線波特率設定
  IER = 0x01; // IER.0=1--接收中斷使能; IER.1=0--關閉發送中斷使能
  OCR = 0xaa; // 配置輸出控制寄存器
  CMR = 0x04; // 釋放接收緩沖器
  // 初始化接收代碼寄存器
  ACR0 = ACRR[0];
  ACR1 = ACRR[1];
  ACR2 = ACRR[2];
  ACR3 = ACRR[3];
  // 初始化接收屏蔽寄存器
  AMR0 = AMRR[0];
  AMR1 = AMRR[1];
  AMR2 = AMRR[2];
  AMR3 = AMRR[3];
  // 使用do--while語句確保退出復位模式
  do
  {
  MODR = 0x08; //MOD.3=0--雙濾波器模式
  state = MODR;
  }
  while( state & 0x01 );
  }
  很容易可以發現,CAN互通信和自通信的初始化設置,只有最后的設置是不一樣的,自通信時把模式寄存器的自通信寄存器位置位,而互通信時只要退出復位模式(同時把自通信寄存器位清零)即可。其它的設置根據需要設定。
  上面討論了自通信和互通信兩種工作方式下的寄存器設置。那么,我就在想,如果用互通信的模式下,如果發送幀的ID設定和自身接收的驗收濾波吻合,是不是也能進行自接收呢?答案是否定的,根據以上的設想做的實驗表明,在互通信模式下,CAN總線上若只有一個節點,那么CAN總線是不會達到你預想的變化的,按下鍵后紅燈會一直亮著,說明CAN總線陷入了無法接收或者正在接收的死循環跳不出來了。
  另外,我還做了一個實驗。就是當CAN節點1發送的數據幀ID不僅和節點2的吻合,也和自身的驗收濾波吻合,那么當節點1的數據幀發送后是不是節點1和節點2都能接收到數據呢?結果證明這個設想是成立的。這也就說明了掛靠在CAN總線上的每一個節點,只要CAN總線上的數據幀ID和某節點驗收濾波通過,該節點就可以接收數據。
  在初始化設置了模式寄存器后,下一步就是設定不同的發送幀的ID和本節點的接收代碼寄存器值和屏蔽寄存器值。我這里只有兩個節點通信,一般如果要使CAN總線上的兩個節點相互接收到對方的數據。那么根據上一節的原理設定接收代碼寄存器值和屏蔽寄存器值以及發送幀的ID值就可以了。
  在看懂并且理解了PIAE工作組的CAN自通信和互通信后,我想對于CAN總線協議的工作方式算是已經入門了,剩下的就是繼續從官方或者第三方提供的datasheet里補知識,根據不同的場合和不同的應用把CAN總線控制器的寄存器設置用活來。
                               
               
本文地址:http://m.qingdxww.cn/thread-161211-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
  • Dev Tool Bits——使用DVRT協議查看項目中的數據
  • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 8848hh四虎免费 | 天堂网2014 | 日本精品高清一区二区不卡 | 欧美亚洲另类综合 | 啪一啪在线视频 | 久久久高清日本道免费观看 | 天天摸天天 | 九色视| 91中文字幕在线 | 亚洲一区中文字幕在线观看 | 日本不卡专区 | 激情天堂| a网站在线观看 | 高清在线一区二区三区亚洲综合 | 97在线视频免费观看 | 极品美女一区二区三区视频 | 中文字幕在线观看一区 | 看黄网站免费 | 国产精品原创 | 欧美乱妇高清无乱码视频在线 | 一级毛片特级毛片国产 | 尹人久久久香蕉精品 | 日日摸夜夜添夜夜免费视 | 亚州综合| 欧美一区二区三区免费观看视频 | 一区二区三区国产精品 | 五月天精品在线 | 一级人做人a爰免费视频 | 国产精品一区不卡 | 日韩免费看 | 免费视频网站在线观看黄 | 免费国产成人高清在线观看麻豆 | 亚洲国产高清一区二区三区 | 国产亚洲欧美另类专区 | www.日日 | 99久久免费国产精品 | 欧美乱妇高清视频免欢看关 | 日韩免费观看视频 | 日韩精品一级毛片 | 日韩视频区 | 福利国模私拍视频在线观看 |