2020年3月22日 星期日

DSP TI TMS320F283xx eCAN Mailbox TX/RX設置


這篇文章是寫,要如何設置設置TMS320F283xx的TX/RX暫存器,來傳送、

收資料,在接收訊息過載了,要如何處理。還有如何用遠端通訊格式

(Remote Frame)來向另一個CAN節點(Node)要求資料,或是回應遠端節

點的要求。


1.1設置Mailbox用來傳送,以Mailbox 1為例
1. 將Mailbox 1所對應的CANTRS.1設為"0",但對CANTRS.1寫入"0"是無效  
    的,而是將MSGCTRL的RTR設為"1",就可以清除CANTRS.1。
2. 將Mailbox1所對應的CANME.1設為"0",用來Disable Mailbox1,才能去設定
    Mailbox1的參數。
3.初始化Mailbox1的參數,其中MSGID的AAE,AME bit設為"0",作為一般傳送
   模式。
   a.設置Mailbox1.MSGID=0x15AC0000
   b.設置Mailbox1.MSGCTRL,MSGCTRL.DLC為要傳送資料的長度,
   MSGCTRL.RTR設為"0"
   c.設置CANMD.1為"1",用來將Mailbox1設為Transmitter
4.將Mailbox1所對應的CANME.1設為"1",重新將Mailbox1 Enable。


1.2設置要傳送的訊息,發送訊息
1.當CANMC.DBO被設為"0",表示最低byte先,當設定MSGCTRL設為2,表示
   要傳送的2個Bytes存在CANMDL.31~16,對CANMD寫入xxxx0000h(xxxx為
   要傳的資料)。
2.設置CANTRS.1為"1",開始去傳送訊息。等待TA.1為"1",表示這筆資料傳送
   成功。CANTRS.1會自動被清除。
3.要從同一個Mailbox傳送下一筆訊息,要再更新Mailbox RAM     
   (CANMDL/CANMDH)後,再回到步驟2,設置CANTRS.1將訊息發送出去。



2.1設置Mailbox用來接收,以Mailbox 3為例
1. 將Mailbox 3所對應的CANME.3設為"0",用來關閉Mailbox3,才能去設定
  Mailbox3的參數。
2.在Mailbox3.MSGID寫入預設的ID到MSGID.ID[28:0],在MSGID有AME bit,
    如果設為"1",就是開啟"接收遮罩"功能,再到LAM裡[28:0]bit設定那些bit是
    don't care。在傳送端發送ID時,接收端只要去比較沒有被遮罩的位元,
    don't care的bit就不用比較。
3.要將Mailbox3設為接收端(receiver),就要設CANMD.3為"1"。
4.當現有資料存在mailbox, 希望設定要被保護,不被新接收到的訊息覆蓋。可
   以由寫入保護暫存器(CANOPC)裡bit 0~31設定對應的mailbox為"1"。另外可
   以由軟體的方式將新接收到的訊息存到其他的mailbox,避免新訊息被忽略
   掉。
5.設定完成,將CANME.3設為"1",啟動Mailbox3。

2.2設置Mailbox用來接收
1.當有新的訊息要存入Mailbox3時,CANRMP.3會被設為"1",表示有接收到訊
   息。另外中斷旗標也會被設置,通知CPU到Mailbox RAM讀取訊息。
2.CPU需要先將CANRMP.3清除掉再去讀取訊息,並且確認接收訊息遺失暫存
   器RML.3是否為"1",依照不同的應用,CPU需要確認如何處理訊息遺失的現
   象。
3.在CPU從Mailbox讀取訊息後,需要再去確認在讀取訊息的過程中,有新的資
   料進到Mailbox而讓CANRMP再次被設為"1"。

2.3過載訊息狀況處理
1.如果CPU讀取訊息的時間不夠快,就需要為這個ID設置更多的mailbox來接
   收。例如Mailbox 3,4,5有相同的ID,相同MASK,在SCC, Mailbox 3,4,5的Mask
   值一致,都由LAM(3)設定。在eCAN模式,每個Mailbox有自已的LAM設定,
   可以設成LAM(3), LAM(4), LAM(5)。為了避免資料遺失,設置過寫入保護
   OPC暫存器,避免Mailbox 4,5未讀的訊息被覆蓋。當CAN module接收到訊
   息,會先存在Mailbox5 。如果Mailbox5對應的RMP為"1",就會存到
   Mailbox4。如果Mailbox4對應的RMP也為"1",就會存到Mailbox 3,因為
   Mailbox3沒有被設為OPC,所以如果前一筆資料還沒被讀取,又有新資料進
   來,就會覆蓋掉原本的資料,並讓Mailbox3對應的RML為"1",表示接收的資
   料遺失,並由RMLIF發出中斷通知CPU。
2.另外在一筆資料量超過8 bytes的情況,也可以由Mailbox4發出中斷讓CPU一次
    取Mailbox4與Mailbox5的訊息。

3.遠端通訊格式處理
兩個功能,是CAN Module對某個節點(Node)要求資料,第二個功能是某個Node
 發出請求要CAN Module回覆資料。

3.1.1 對另一個Node要求資料
當CAN Module要對某個Node要求資料,CAN Module先設置自已為接收端,
Mailbox3為例子,CPU的執行程序如下。
1.設置Mailbox3的MSGCTRL裡的RTR bit為"1",表示從Mailbox3發出遠端幀
   求 (Remote Frame Request)給某個Node,並由Mailbox 3接收遠端回傳的資
   料。也設定MSGCTRL裡的DLC為"2",表示回傳的資料長度為2 Bytes長度。
2.設置Mailbox3的MSGID為0x4F780000,表示AME(Acceptance mask enable)
   為"1",會使用acceptance mask。因外MSGID.IDE被設為"0",表示為標準
    ID,MSGID.ID 28:0只有28:18有效,所以發送的ID為0x0F780000"右移18
   位,等於0x3DE。
3.設置CANTRS.3為"1",就會從Mailbox3發送Remote Frame Request給對應ID
   的Node。
4.等待RMP.3被設置為"1",表示有接收到資料。

3.1.2 回應遠端資料要求
當CAN Module是做為傳送端,被某個Node要求回傳資料。
1.在Mailbox enable前,先在CANMD設置此Mailbox為傳送端,設置它的
   MSGID.AAM bit為"1",這樣Mailbox在收到Remote request後,自動回覆
   Mailbox message(CANMDL,CANMDH)內的資料。設置MSGID為
   0x35AC0000, 表示AAM bit為"1", ID[28:0]為0x15AC0000。
2. 設置要回覆的資料在CANMDL,CANMDH。
3. 在CANME將Mailbox設置為enable,將來收到remote request後,TRS bit
    會自動被設為"1",並將資料傳送到遠端的Node。在傳送資料後,CANTA對  
    應的Mailbox_n bit會被設為"1"。CPU可以在這個bit被設為"1"後,更新
     Message資料。

3.2 在自動回覆模式時,更新回覆內容
1.設置CANMC CDR bit為"1",CANMC的MBNR選擇要設定的Mailbox。
2.更新Mailbox內的資料CANMDL,CANMDH, 
3.將設置CANMC.CDR bit為"0",表示資料更改完成。
#在設置CDR更新資料前,如果TRSn已經設置,就可能會傳送舊的
  資料,而不是更新後的資料。要避免這個問題,就用TRRn 將傳送要求取消,
   等到資料更新後,再重新設置TRSn,發起傳送請求。


下面是TI TMS320F2833X的參考程式碼,設置迴圈100次,由Mailbox25連續發送訊息。

Example_2833xEcanA_to_B_Xmit.c

// Step 5. User specific code
    //
    // Write to the MSGID field
    //
    ECanaMboxes.MBOX25.MSGID.all = 0x95555555;          // Extended Identifier

    //
    // Configure Mailbox under test as a Transmit mailbox
    //
    ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
    ECanaShadow.CANMD.bit.MD25 = 0;
    ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;

    //
    // Enable Mailbox under test
    //
    ECanaShadow.CANME.all = ECanaRegs.CANME.all;
    ECanaShadow.CANME.bit.ME25 = 1;
    ECanaRegs.CANME.all = ECanaShadow.CANME.all;

    //
    // Write to DLC field in Master Control reg
    //
    ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8;

    //
    // Write to the mailbox RAM field
    //
    ECanaMboxes.MBOX25.MDL.all = 0x55555555;
    ECanaMboxes.MBOX25.MDH.all = 0x55555555;

    //
    // Begin transmitting
    //
    for(i=0; i < TXCOUNT; i++)
    {
        ECanaShadow.CANTRS.all = 0;
        ECanaShadow.CANTRS.bit.TRS25 = 1;     // Set TRS for mailbox under test
        ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

        do
        {
            ECanaShadow.CANTA.all = ECanaRegs.CANTA.all;
        } while(ECanaShadow.CANTA.bit.TA25 == 0 );// Wait for TA5 bit to be set

        ECanaShadow.CANTA.all = 0;
        ECanaShadow.CANTA.bit.TA25 = 1;                  // Clear TA5
        ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;

        loopcount ++;
    }
    __asm(" ESTOP0");  // Stop here
}

//
// End of File

//

Reference
1.TMS320x2833x, 2823x DSP Enhanced Controller Area Network (eCAN) User's Guide