一、 概述
本文主要介紹 SemiDrive E3 SSDK 軟體包中 driver_demo/mbox 示例。
Demo 主要功能為使用 E3 晶片的 mailbox 在不同的 core 之間傳輸消息,示例中以 SF core和 SX0 core 之間的通信為例,SX0 core 發送數據至 SF core。
硬體設備:E3640 GATEWAY 開發板
軟體包:SSDK PTG3.0
二、 代碼下載及 demo 介紹
使用 SemiDrive support 系統上的 SSDK Builder ,選擇型號 E3640 和示例 app_demo/mbox 生成參考代碼。
首先使用 JLINK 下載 SF 的鏡像至 E3 gateway 開發板,並啟動調試,進入 mailbox 接收等待狀態。
先點擊 make 編譯代碼,然後點擊 download and debug 燒錄代碼,最後點擊 go 運行代碼。
圖 2.1 SF 代碼下載並運行
再下載 SX0 的鏡像至 E3 gateway 開發板,並啟動調試,將數據通過 mailbox 發送給 SF 核。
先點擊 make 編譯代碼,然後點擊 download and debug 燒錄代碼,最後點擊 go 運行代碼。
圖 2.2 SX0 代碼下載並運行
SF 核接收到 SX0 的數據後,進行檢驗是否正確,正確則通過串口列印 “SSDK E3 Mbox Demo Success” 的 log,表示 mbox demo 運行成功。
示例中 SX0 發送了 32 字節的 0xA 給到 SF 核。
圖 2.3 運行成功 log
三、 代碼解析
3.1 SF 代碼流程
SF 核的代碼流程圖如下:
圖 3.1 SF 核代碼流程圖
首先進行初始化,初始化各模塊、clock 時鐘、VIC1 中斷、Pinmux 配置和串口號等,並列印歡迎信息。
board_reset_init(); 會 reset SF 核的 VIC1, SX0 core,和 maibox 模塊。
board_mbox_init(); 為初始化 maibox 模塊,將配置的 sdrv_mbox_cfg 信息傳遞給 g_sdrv_mbox_dev。主要包含 Mailbox Register base address、Mailbox Buffer base address和 mbox irq number。
mbox_recv_demo(); 為 SF 核主要部分。
先定義一個 sdrv_mbox_chan_req_t 類型的結構體 chan_req,配置參數 rproc 為通信另一方的 core id ,這裡配置的為發送方 SX0;配置參數 src_addr 和 dest_addr,分別為源地址和目標地址的數據類型,無特殊要求則設為原始數據類型 MBOX_ADDR_RAW。
然後根據配置的參數,申請 mailbox channel。在設置接收 callback 函數,然後進入等待接收循環,循環中會判斷 callback 中的標誌位 mbox_recv_flag。
在 callback 函數中會根據接收數據的長度,判斷接收的數據中 0xA 的數量,如果為 32,則將標誌位 mbox_recv_flag 置 1,並列印串口 log。
While 循環中,判斷 mbox_recv_flag 非 0 後,則會退出,並釋放申請的 mailbox channel ,列印 demo 運行成功 log。
3.2 SX0 代碼流程
首先進行初始化,與 SF 核代碼類似,初始化各模塊、VIC3 中斷和列印輸出串口等,並列印歡迎信息。
board_reset_init(); 會 reset SX0 的 VIC3。
board_mbox_init(); 為初始化 mailbox 模塊,與 SF 核代碼類似。
mbox_send_demo(); 為 SX0 核的主要部分。
首先也是配置 rproc 為通信方 core id,這裡配置的為接收方 SF,配置數據類型為 MBOX_ADDR_RAW。
根據配置的參數,申請 mailbox channel。使 0xA 複製到申請的 send_data 用 memset 將 32 字節數的 數組中。然後調用 sdrv_mbox_send() 將數據發送出去,發送完後釋放 mailbox channel。
SX0 核的代碼流程圖如下:
圖 3.2 SX0 核代碼流程圖
四、 拓展分析說明
1. 多 core 通信
配置的 rproc 參數,可以使用 MBOX_RPROC_SF | MBOX_RPROC_SP0 形式,增加通信方。參考 sdrv_mbox.h 文件的結構體 sdrv_mbox_rproc_t 介紹,對應的 TRM 中的寄存器為 TMH0 的 MDP[7:0]。
另外需要在 sf/configs/reset_cfg.c 中添加對應 core ,比如增加 SP0 core,需要增加 rstsig_cr5_sp0,以 boot 對應 core ,否則會 debug 不成功。
圖 4.1 寄存器 TMH0 的 MDP 介紹
2. 數據長度
根據寄存器 TMH0 的 TXMES_LEN[10:0] 說明,最長配置為 2048 x 2 byte,每次最多只能傳輸 4096 字節。
圖 4.2 寄存器 TMH0 的 TXUSE_MB 和 TXMES_LEN 介紹
在增大發送數據字節數時,IAR 可能會提示堆棧空間不足,則修改 icf 文件中配置的堆棧大小,默認配置的為 0x1000。
define symbol __ICFEDIT_size_cstack__ = 0x1000;
3. 數據收發地址
發送的數據存儲在 MB_MEM_BASE 的位置即 mailbox buffer,地址為 0x02001000。
比如示例中,SX0 核需要發送的 32 字節的 0xA ,使用 IAR 的 memory 觀察如下:
圖 4.3 發送數據存儲地址
根據 TRM 6.2.4 Message Buffer Addressing 介紹,SX0 發送的數據存在的地址為 0xF4005000,示例中在 SF 的 callback 函數中設置斷點,可以使用 memory 觀察到接收的數據,如下:
圖 4.4 接收 SX0 數據存儲地址
五、 參考文檔
- 《SemiDrive_E3_SSDK_User_Guide》
- 《E3400_E3600_MCU_TRM》
- 《AppNote_E3_Boot_and_OTA》
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:Eason Wang / 王寅森
更多資訊,請掃碼關注我們!
![](https://edit.wpgdadawant.com/uploads/news_file/blog/2024/14609/tinymce/______.png)
評論