飛凌i.MX8M Plus開發(fā)板的M核SPI主從模式通訊詳解
為了能夠讓更多工程師朋友了解多核異構(gòu)處理器,飛凌嵌入式特別推出了【玩轉(zhuǎn)多核異構(gòu)】專題,幫助大家解決在多核異構(gòu)處理器的開發(fā)過程中遇到的問題。專題持續(xù)更新中,歡迎您的訂閱關(guān)注。
SPI(串行外圍設(shè)備接口)是一種低成本、易使用的接口協(xié)議,具備全雙工、高速、通訊簡單的特點,被廣泛應(yīng)用于微控制器和外圍設(shè)備芯片之間的通訊。當(dāng)SPI接口作為主模式時可以連接Flash存儲器、AD采樣芯片、實時時鐘RTC、LCD顯示屏、音頻芯片以及各種傳感器。

隨著產(chǎn)品功能的愈加豐富,多處理器使用SPI接口進行通訊的場景開始出現(xiàn),而多個SPI設(shè)備之間通信必須由主設(shè)備(Master)來控制從設(shè)備(Slave)。小編手上的OKMX8MP-C開發(fā)板基于NXP i.MX8M Plus多核異構(gòu)處理器設(shè)計,它的M核有1路SPI,因而為實現(xiàn)SPI的相互通訊,我們就需要兩塊OKMX8MP-C開發(fā)板的SPI互作主從設(shè)備進行通信。本文小編就將從應(yīng)用角度為大家講解M核SPI間通訊的實現(xiàn)方式。

SPI主模式
1. SPI初始化
SPI初始化主要包括總線時鐘、管腳和相應(yīng)寄存器的初始化。具體如下:
(1)SPI總線時鐘:現(xiàn)將SPI總線倍頻到800MHz,再10分頻到80MHz。

(2)管腳配置:選擇SPI2的四個管腳。

(3)SPI速率:設(shè)置速率為500K。

(4)數(shù)據(jù)長度選擇:8bit。

- (5)四種模式選擇:CPOL和CPHA的四種組合即為SPI的四種模式。

(6)主模式選擇:設(shè)置SPI為主模式。
config->channelConfig.channelMode = kECSPI_Master; // ?主模式
(7)通道選擇:一個 SPI 有四個硬件片選信號,每個片選信號是一個硬件通道,本程序選擇通道0。
config->channel ? ? ? ? ? ? ?= kECSPI_Channel0; ? // ?通道0
(8)關(guān)閉自回環(huán):如果開啟了自回環(huán),那么SPI數(shù)據(jù)會在芯片內(nèi)回環(huán),不會到外部管腳,在程序調(diào)試時可以排除外部端子的干擾,但真實應(yīng)用時,需要關(guān)閉自回環(huán),從外部管腳收發(fā)數(shù)據(jù)。
Config->enableLoopBack ? ? ? ?= false; // 不回環(huán),使用外部管腳
2. SPI收發(fā)流程
我們分別將兩塊OKMX8MP-C開發(fā)板命名為開發(fā)板1和開發(fā)板2,并且將開發(fā)板1的SPI接口采用主模式,使能收發(fā)中斷;將開發(fā)板2的SPI接口采用從模式,使能收發(fā)中斷。
SPI主發(fā)送64字節(jié)數(shù)據(jù),SPI從接收后,將數(shù)據(jù)回傳。SPI主接收回傳信息后,比對接收和發(fā)送的數(shù)據(jù)是否一致,輸出比對結(jié)果。如一致,本次傳輸結(jié)束,等待輸入任何按鍵啟動下一次傳輸。
(1)SPI發(fā)送數(shù)據(jù):EXAMPLE_ECSPI_MASTER_BASEADDR 表示為SPI2,g_m_handle為SPI實例,包含了發(fā)送接收中斷及其回調(diào)函數(shù),masterXfer為要發(fā)送的64字節(jié)數(shù)據(jù)。
ECSPI_MasterTransferNonBlocking(EXAMPLE_ECSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer); ?//主模式中斷方式發(fā)送數(shù)據(jù)
(2)SPI接收數(shù)據(jù):SPI總線的發(fā)送和接收都是主模式控制的,因此接收函數(shù)的過程和發(fā)送是一致的。
(3)接收和發(fā)送數(shù)據(jù)對比:

- 02SPI從模式
1. SPI初始化
SPI從模式初始化與主模式要保持一致,除了將工作模式設(shè)為從模式,其他設(shè)置均一樣。主從模式選擇:設(shè)置SPI為從模式。
config->channelConfig.channelMode = kECSPI_Slave; //從模式
2. SPI收發(fā)流程
開發(fā)板2的SPI接口采用從模式,使能收發(fā)中斷。
SPI從進入等待接收狀態(tài),在片選有效后,通過接收中斷獲取數(shù)據(jù),并回傳信息,再次進入接收狀態(tài)。
(1)SPI接收數(shù)據(jù):EXAMPLE_ECSPI_SLAVE_BASEADDR表示為SPI2,g_m_handle為SPI實例,包含了發(fā)送接收中斷及其回調(diào)函數(shù),slaveXfer存儲接收的數(shù)據(jù)。

(2)SPI發(fā)送數(shù)據(jù):SPI總線的發(fā)送和接收都是主模式控制的,因此接收函數(shù)的過程和發(fā)送是一致的。
03A核修改
A核設(shè)備樹中若保留SPI2,內(nèi)核解析設(shè)備樹,在/dev下生成設(shè)備文件spidev1.0。這樣待M核運行后,A核將重新對SPI2初始化,造成M核SPI功能異常,因此需要去除A核對SPI的控制。
1.?修改設(shè)備樹
(1)在設(shè)備樹OK8MP-C.dts中,刪除SPI2設(shè)備節(jié)點相關(guān)信息。

(2)編譯生成新的內(nèi)核鏡像Image及設(shè)備樹OK8MP-C.dtb。
(3)將生成的OK8MP-C.dtb和Image拷貝至開發(fā)板/run/media/mmcblk2p1/目錄下,輸入sync命令,重啟開發(fā)板。
(4)輸ls /dev查看發(fā)現(xiàn)沒有SPI2設(shè)備文件spidev1.0。
04程序驗證
1.?硬件連接
使用杜邦線將兩塊OKMX8MP-C開發(fā)板的SPI一一對應(yīng)連接,線序如下:
開發(fā)板1--SPI主模式開發(fā)板2--SPI從模式管腳名稱開發(fā)板位置管腳名稱開發(fā)板位置MISOP40-10MISOP40-10MOSIP40-8MOSIP40-8SCKP40-1SCKP40-1SS0P40-3SS0P40-3GNDP40-4/P40-7GNDP40-4/P40-7
2. M核程序
修改uboot環(huán)境變量設(shè)置M核自啟動,同時將M核程序forlinx_m7_tcm_firmware.bin
放到/run/media/mmcblk2p1/目錄下。注意,SPI主模式程序須放入開發(fā)板1,SPI從模式程序須放入開發(fā)板2,詳細操作可看以前發(fā)布的文章?>>【玩轉(zhuǎn)多核異構(gòu)】M核程序的啟動、編寫和仿真。
3. 實際測試
(1)開發(fā)板2先上電,M核程序啟動,完成SPI初始化后,進入接收等待狀態(tài);
(2)開發(fā)板1后上電,M核程序啟動,完成SPI初始化后,主動發(fā)送64字節(jié)數(shù)據(jù);
(3)開發(fā)板2的SPI接收數(shù)據(jù),通過串口打印接收的數(shù)據(jù),并將接收的數(shù)據(jù)再次發(fā)送;

(4)開發(fā)板1的SPI接收到回傳信息,通過串口打印接收的數(shù)據(jù)。和發(fā)送數(shù)據(jù)比對,輸出結(jié)果。

(5)此時在開發(fā)板1調(diào)試串口輸入任意鍵,即可開啟新一輪的SPI發(fā)送和接收流程。
以上就是小編為小伙伴帶來的OKMX8MP-C開發(fā)板M核控制SPI主從模式的使用方法了,是不是感覺性能很強大呢?