<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è) > 嵌入式系統 > 設計應用 > SAM4E單片機之旅——19、CAN間通信

SAM4E單片機之旅——19、CAN間通信

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

  協(xié)議具有良好的可靠性,在工業(yè)中應用廣泛。這次就先熟悉的基本功能。

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

  開(kāi)發(fā)板有兩個(gè),每個(gè)CAN有8個(gè)信箱。這次內容是從CAN0的信箱0發(fā)送數據到CAN1的信箱0。

  除本次使用的功能外,CAN還有遠程幀、強大的錯誤處理功能。

  一、電路

  CAN總線(xiàn)上的邏輯數值是用顯性電平和隱性電平表示的?!帮@性”的意思是指在同時(shí)傳輸顯性電平和隱性電平時(shí),總線(xiàn)上呈現的是顯性電平。顯性電平表示邏輯“0”,隱性電平表示邏輯“1”。

  在使用CAN的過(guò)程中,需要使用一個(gè)CAN收發(fā)器進(jìn)行電平的轉換與解釋。開(kāi)發(fā)板使用的CAN收發(fā)器為SN65HVD234,其接線(xiàn)如下圖所示:

    

clip_image002
clip_image004

 

  其中CANTXx和CANRXx引腳可以復用為CAN的外設。而在使用該收發(fā)器時(shí),需要將CANRXxEN驅動(dòng)為高電平以啟用收發(fā)器的接收功能,將CANTXxRS驅動(dòng)求低電平以啟用發(fā)送功能。

  在實(shí)驗的時(shí)候,需要將這兩個(gè)口(J13和J14)使用線(xiàn)纜連接起來(lái)。當連接完成而未通電時(shí),可以測得CANH和CANL是短路狀態(tài)的。

  二、CAN網(wǎng)絡(luò )參數及波特率

  假設MCK為96 MHz,需要設置的CAN波特率為1000 Kbps。

  CAN的波特率的設置不是那么的直接。CAN定義了一個(gè)名為“原子時(shí)間(TQ)”的最小時(shí)間單位;然后把一個(gè)比特的傳輸過(guò)程分為若干階段(同步段、傳播時(shí)間段、相位緩沖端1、相位緩沖段2),每個(gè)階段的時(shí)間均是由TQ的數量表示。

clip_image006

  SAM4中,時(shí)間TQ用“CAN系統時(shí)鐘(CSC)”表示。波特率相關(guān)的參數均通過(guò)CAN波特率寄存器(CAN_BR)設置。

  TQ(CSC)設置。組成每個(gè)位時(shí)間的TQ數量的范圍為8—25。為取整,這里將數量選擇為16。所以CAN系統時(shí)鐘的頻率為CAN波特率的16倍,即16 MHz。再所以需要將MCK進(jìn)行6分頻。根據BRP字段的作用方法,需要將BRP字段設置為5。

  同時(shí),可以計算出每個(gè)TQ的長(cháng)度為62.5 ns。

  同步段固定為1 TQ。

  傳播時(shí)間端PROP_SEG需要根據硬件相關(guān)的信息確定,用于吸收網(wǎng)絡(luò )的物理(發(fā)送單元、總線(xiàn)、接收單元)延遲。該段的時(shí)間需要為總物理延遲的2倍。在芯片手冊的示例中,該延遲為190 ns。所以該段的時(shí)長(cháng)需要設置為380 ns,即約6 TQ。將PROPAG字段設置為5即可達到目的。

  剩下的16-1-6=9 TQ,均用與相位緩沖段。在A(yíng)tmel的CAN中,需要2 TQ確定總線(xiàn)的電平。因為采樣點(diǎn)位于相位緩沖段2的起始,所以它的長(cháng)度不能少于2 TQ 。這里使兩個(gè)階段盡量等長(cháng),所以讓相位緩沖段1設置為4 TQ,段2設置為5 TQ。將PHASE1和PHASE2分別設置為3和4即可。

  再補償寬度。最小可配置為1 TQ,最多可配置為相位緩沖段1和4 TQ間的較小值。這里配置為4 TQ。將SJW段設置為3即可。

  具體設置代碼如下:

  const uint32_t can_br = CAN_BR_BRP(5)

   CAN_BR_PROPAG(5)

   CAN_BR_PHASE1(3)

   CAN_BR_PHASE2(4)

   CAN_BR_SJW(3)

   CAN_BR_SMP_ONCE;

  CAN0->CAN_BR = can_br;

  CAN1->CAN_BR = can_br;

  三、CAN初始化

  GPIO及PMC設置。注意將PE1和PE3驅動(dòng)為高電平,PE0和PE2驅動(dòng)為低電平。

  網(wǎng)絡(luò )參數設置。在啟用CAN之前,需要設置好網(wǎng)絡(luò )參數。

  啟用CAN。CAN使能后,需要和總線(xiàn)進(jìn)行同步。在連續檢測到11個(gè)隱性位時(shí),CAN進(jìn)入喚醒狀態(tài),且WAKEUP位置位:

  CAN0->CAN_MR = CAN_MR_CANEN;

  CAN1->CAN_MR = CAN_MR_CANEN;

  while( ((CAN0->CAN_SR & CAN_SR_WAKEUP) == 0)

   ((CAN1->CAN_SR & CAN_SR_WAKEUP) == 0) );

  信箱設置。通過(guò)設置CAN_MMR的MOT字段即可設置信箱的類(lèi)型。由于這個(gè)設置是立即生效的,所以在設置這個(gè)字段時(shí),需要先(或同時(shí))完成其他相關(guān)信息的設置。同時(shí),在修改設置時(shí),應該先關(guān)閉信箱。

  發(fā)送信箱需要先設置好的只有優(yōu)先級:

  #define TX_MB (CAN0->CAN_MB + 0)

  TX_MB->CAN_MMR = CAN_MMR_PRIOR(0)

   CAN_MMR_MOT_MB_TX;

  接收信箱需要先設置好ID相關(guān)的信息。簡(jiǎn)單起見(jiàn),這里只使用標準格式的幀,即只指定MIDvA部分,同時(shí)MIDE位指定為0(默認)。由于符合接收條件的ID設置為1個(gè),即需要比較接收ID所有的位,所以將CAN_MAM的MIDvA字段全部置1。

  #define RX_MB (CAN1->CAN_MB + 0)

  #define CAN_COMM_ID 5

  RX_MB->CAN_MID = CAN_MID_MIDvA(CAN_COMM_ID);

  RX_MB->CAN_MAM = CAN_MAM_MIDvA(~(uint32_t)0);

  RX_MB->CAN_MMR = CAN_MMR_MOT_MB_RX;

  四、數據傳輸

  通過(guò)UART讀取一個(gè)數字:

  int num;

  scanf("%d", &num);

  通過(guò)信箱發(fā)送數據。

  假設int為4字節,則通過(guò)CAN_MDL即可表示所需信息。發(fā)送時(shí),在確定信箱可用后,需要指定好信息ID。然后向CAN_MCR寫(xiě)入信息長(cháng)度(用byte表示),同時(shí)寫(xiě)入MTCR位以開(kāi)始發(fā)送操作。最后,在發(fā)送完成后,CAN_MSR的MRDY位重新置位。

  // 等待信箱可用

  while(!(TX_MB->CAN_MSR & CAN_MSR_MRDY));

  TX_MB->CAN_MID = CAN_MID_MIDvA(CAN_COMM_ID); // ID

  TX_MB->CAN_MDL = num; // 低4字節數據

  TX_MB->CAN_MCR = CAN_MCR_MDLC(4) // 數據長(cháng)度

  | CAN_MCR_MTCR; // 開(kāi)始嘗試發(fā)送

  printf("-I- Sending message from TX mailbox...rn");

  // 等待發(fā)送完成

  while(!(TX_MB->CAN_MSR & CAN_MSR_MRDY));

  通過(guò)信箱接收數據。

  通過(guò)查詢(xún)CAN_MSR的MRDY位可以確定是否接收到了數據,然后在CAN_MSR的MDLC字段可以確定信息長(cháng)度。在完成數據接收后,需要向CAN_MCR寫(xiě)入MTCR字段以完成本次接收,從而開(kāi)始下一次信息接收工作。

  // 等待信息接收完成

  while(!(RX_MB->CAN_MSR & CAN_MSR_MRDY));

  // 檢查信息長(cháng)度

  const int rec_len =

  (RX_MB->CAN_MSR & CAN_MSR_MDLC_Msk) >> CAN_MSR_MDLC_Pos;

  if (rec_len == 4) {

  // 讀取信息并打印

  printf("-I- Data read from RX mailbox: %d rn",

  (int)RX_MB->CAN_MDL);

  }

  // 開(kāi)始下一次接收

  RX_MB->CAN_MCR = CAN_MCR_MTCR;



關(guān)鍵詞: SAM4E CAN

評論


技術(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>