基于STM32F103C8T6工控板上的兩個(gè)SPI接口進(jìn)行互相通訊設(shè)計(jì)方案


STM32F103C8T6工控板雙SPI接口互通設(shè)計(jì)方案
引言
在現(xiàn)代工業(yè)控制系統(tǒng)中,高效、可靠的數(shù)據(jù)通信是實(shí)現(xiàn)設(shè)備間協(xié)同工作的基石。串行外設(shè)接口(SPI)因其全雙工、高速、同步的特性,在短距離、嵌入式設(shè)備間的通信中扮演著重要角色。STM32F103C8T6作為一款性能卓越的微控制器,憑借其豐富的片上資源,包括多個(gè)SPI接口,為實(shí)現(xiàn)復(fù)雜的通信方案提供了可能。本文旨在詳細(xì)闡述基于STM32F103C8T6工控板上兩個(gè)SPI接口進(jìn)行互相通信的設(shè)計(jì)方案,深入探討核心元器件的選擇、功能及其在整個(gè)系統(tǒng)中的作用,并提供必要的軟件設(shè)計(jì)思路。
1. 系統(tǒng)概述與SPI通信基礎(chǔ)
1.1 系統(tǒng)架構(gòu)
本設(shè)計(jì)方案的核心是利用一塊STM32F103C8T6工控板上的兩個(gè)獨(dú)立的SPI接口(例如SPI1和SPI2)進(jìn)行雙向數(shù)據(jù)交換。其中一個(gè)SPI接口配置為主模式(Master),負(fù)責(zé)產(chǎn)生時(shí)鐘信號和片選信號,并主動發(fā)起數(shù)據(jù)傳輸;另一個(gè)SPI接口配置為從模式(Slave),根據(jù)主機(jī)的時(shí)鐘和片選信號進(jìn)行數(shù)據(jù)收發(fā)。這種主從模式的配置,模擬了兩個(gè)獨(dú)立設(shè)備之間通過SPI進(jìn)行通信的場景,對于理解SPI通信的本質(zhì)以及未來擴(kuò)展到多設(shè)備通信具有重要意義。
1.2 SPI通信原理回顧
SPI是一種同步串行通信協(xié)議,通常由四根信號線組成:
SCK (Serial Clock):串行時(shí)鐘,由主設(shè)備生成,用于同步數(shù)據(jù)傳輸。
MOSI (Master Output, Slave Input):主設(shè)備數(shù)據(jù)輸出,從設(shè)備數(shù)據(jù)輸入。
MISO (Master Input, Slave Output):主設(shè)備數(shù)據(jù)輸入,從設(shè)備數(shù)據(jù)輸出。
NSS (Negative Slave Select) 或 CS (Chip Select):片選信號,由主設(shè)備控制,用于選擇特定的從設(shè)備進(jìn)行通信,通常為低電平有效。
SPI通信的特點(diǎn)是全雙工,即主從設(shè)備可以同時(shí)發(fā)送和接收數(shù)據(jù)。數(shù)據(jù)傳輸以字節(jié)為單位,通過移位寄存器完成。主設(shè)備通過SCK信號同步移位寄存器,MOSI線上的數(shù)據(jù)從主設(shè)備移入從設(shè)備,MISO線上的數(shù)據(jù)從從設(shè)備移入主設(shè)備。
2. 核心元器件選型與分析
2.1 微控制器:STM32F103C8T6
選擇理由:STM32F103C8T6是一款基于ARM Cortex-M3內(nèi)核的32位微控制器,屬于STM32F1系列中的“中等密度”產(chǎn)品。它具有卓越的性價(jià)比、豐富的片上外設(shè)和強(qiáng)大的處理能力,非常適合工業(yè)控制應(yīng)用。其內(nèi)置的多個(gè)SPI接口(通常是SPI1和SPI2)可以直接滿足本方案中兩個(gè)SPI接口互通的需求。此外,該型號擁有足夠的GPIO引腳用于配置SPI通信、中斷處理以及其他潛在的控制功能。其成熟的開發(fā)生態(tài)系統(tǒng),包括ST-Link調(diào)試器和Keil MDK、STM32CubeIDE等開發(fā)環(huán)境,也大大簡化了開發(fā)過程。
功能特性:
Cortex-M3內(nèi)核:提供高性能和低功耗的均衡。
閃存與SRAM:通常為64KB閃存和20KB SRAM,足以存儲復(fù)雜的通信協(xié)議和應(yīng)用代碼。
多個(gè)SPI接口:STM32F103C8T6通常提供兩個(gè)全雙工SPI接口(SPI1和SPI2),每個(gè)接口都可以配置為主模式或從模式。支持多種數(shù)據(jù)幀格式(8位或16位)、多種時(shí)鐘極性(CPOL)和時(shí)鐘相位(CPHA)組合,以及不同的波特率預(yù)分頻器。
通用I/O (GPIO):豐富的GPIO引腳可靈活配置為SPI通信引腳(SCK、MOSI、MISO、NSS),以及用于其他控制和指示的引腳。
中斷控制器 (NVIC):支持多種中斷源,包括SPI中斷,方便進(jìn)行非阻塞的數(shù)據(jù)處理。
DMA控制器:支持DMA(直接存儲器訪問),可以實(shí)現(xiàn)SPI數(shù)據(jù)的自動收發(fā),無需CPU干預(yù),大大提高數(shù)據(jù)傳輸效率,降低CPU負(fù)載。
2.2 邏輯電平轉(zhuǎn)換芯片(可選)
選擇理由:如果STM32F103C8T6的SPI接口需要與不同電壓域(例如5V)的外部設(shè)備通信,或者考慮到未來擴(kuò)展兼容性,建議使用邏輯電平轉(zhuǎn)換芯片。盡管在本方案中,兩個(gè)SPI接口都在同一塊STM32芯片上,通常不需要電平轉(zhuǎn)換,但如果在實(shí)際工控板設(shè)計(jì)中,SPI信號會引出到外部連接器,并可能連接到其他電壓等級的模塊時(shí),提前預(yù)留電平轉(zhuǎn)換電路是明智之舉。這可以避免因電壓不匹配導(dǎo)致芯片損壞或通信不穩(wěn)定。
推薦型號:
TXB0104RGYR (TI):這是一款4位雙向電壓電平轉(zhuǎn)換器,無需方向控制信號,可自動檢測數(shù)據(jù)流方向。支持1.2V至3.6V和1.65V至5.5V之間的電壓轉(zhuǎn)換,響應(yīng)速度快,適用于高速SPI通信。
SN74LVC2T45DCUR (TI):雙位雙電源總線收發(fā)器,可實(shí)現(xiàn)異步雙向電壓電平轉(zhuǎn)換。它需要方向控制引腳,但同樣適用于寬電壓范圍的轉(zhuǎn)換,且速度快。
功能特性:
實(shí)現(xiàn)不同電壓域之間信號的可靠傳輸。
保護(hù)低壓芯片免受高壓信號的損壞。
確保信號完整性,減少噪聲干擾。
2.3 其他輔助元器件
電源管理單元:為STM32F103C8T6提供穩(wěn)定的3.3V電源。通常集成在工控板上,例如采用AMS1117-3.3 (AIM Semiconductor) 等低壓差線性穩(wěn)壓器(LDO)或DC-DC轉(zhuǎn)換器。AMS1117-3.3成本低廉,易于使用,可以為微控制器提供穩(wěn)定的3.3V供電。
晶振:為STM32F103C8T6提供精確的時(shí)鐘源。通常選用8MHz或12MHz的無源晶振,并配合兩個(gè)20pF左右的匹配電容。晶振的精度直接影響微控制器的工作穩(wěn)定性,尤其對于定時(shí)器和通信波特率的準(zhǔn)確性至關(guān)重要。
復(fù)位電路:由一個(gè)復(fù)位按鍵和RC充放電電路組成,用于初始化微控制器。通常包括一個(gè)10KΩ電阻和一個(gè)0.1μF電容,連接到STM32的NRST引腳。
調(diào)試接口:SWD(Serial Wire Debug)接口,通常使用SWD接頭,用于連接ST-Link調(diào)試器,實(shí)現(xiàn)程序下載和在線調(diào)試。這是開發(fā)過程中不可或缺的工具。
3. 硬件連接設(shè)計(jì)
在本方案中,兩個(gè)SPI接口位于同一顆STM32F103C8T6芯片內(nèi)部,因此硬件連接相對簡單,主要涉及GPIO引腳的正確分配。
SPI1(主機(jī)配置)引腳分配:
PA5 -> SPI1_SCK (時(shí)鐘輸出)
PA6 -> SPI1_MISO (數(shù)據(jù)輸入)
PA7 -> SPI1_MOSI (數(shù)據(jù)輸出)
PA4 -> SPI1_NSS (片選輸出,通常配置為軟件片選或硬件片選)
SPI2(從機(jī)配置)引腳分配:
PB10 -> SPI2_SCK (時(shí)鐘輸入)
PB14 -> SPI2_MISO (數(shù)據(jù)輸出)
PB15 -> SPI2_MOSI (數(shù)據(jù)輸入)
PB12 -> SPI2_NSS (片選輸入,通常配置為硬件片選)
關(guān)鍵連接原則:
SPI1_SCK連接到SPI2_SCK:實(shí)現(xiàn)時(shí)鐘同步。
SPI1_MOSI連接到SPI2_MOSI:主機(jī)的輸出連接到從機(jī)的輸入。
SPI1_MISO連接到SPI2_MISO:從機(jī)的輸出連接到主機(jī)的輸入。
SPI1_NSS連接到SPI2_NSS:主機(jī)的片選輸出連接到從機(jī)的片選輸入,確保主從設(shè)備在同一時(shí)刻被激活進(jìn)行通信。
4. 軟件設(shè)計(jì)方案
軟件設(shè)計(jì)是實(shí)現(xiàn)SPI互通的核心,主要包括SPI接口的初始化配置、數(shù)據(jù)傳輸機(jī)制以及中斷/DMA處理。
4.1 SPI接口初始化
使用STM32CubeMX或HAL庫進(jìn)行初始化是最便捷的方式。
SPI1(主機(jī))配置:
模式:主模式(Master Mode)
數(shù)據(jù)幀格式:8位或16位(根據(jù)應(yīng)用需求選擇,通常為8位)
數(shù)據(jù)順序:MSB優(yōu)先(高位在前)或LSB優(yōu)先(低位在前)
時(shí)鐘極性(CPOL)與時(shí)鐘相位(CPHA):根據(jù)需要選擇,例如CPOL=Low, CPHA=1Edge(SPI模式0)或CPOL=High, CPHA=2Edge(SPI模式3)。主從設(shè)備必須保持一致。
波特率預(yù)分頻器:選擇合適的預(yù)分頻器以獲得期望的SCK頻率。例如,如果系統(tǒng)時(shí)鐘為72MHz,選擇
/8
分頻,則SPI時(shí)鐘為9MHz。NSS管理:軟件NSS(通過GPIO控制NSS引腳)或硬件NSS輸出(由SPI外設(shè)自動控制NSS引腳)。在本方案中,由于兩個(gè)SPI接口在同一芯片內(nèi),且SPI1作為主機(jī)控制SPI2,建議將SPI1的NSS配置為硬件輸出NSS,并連接到SPI2的硬件NSS輸入,以簡化同步。
CRC校驗(yàn):根據(jù)需要啟用或禁用。
數(shù)據(jù)大小:通常為8位。
SPI2(從機(jī))配置:
模式:從模式(Slave Mode)
數(shù)據(jù)幀格式:與SPI1一致
數(shù)據(jù)順序:與SPI1一致
時(shí)鐘極性(CPOL)與時(shí)鐘相位(CPHA):與SPI1一致
NSS管理:硬件NSS輸入,由SPI外設(shè)自動處理。
4.2 數(shù)據(jù)傳輸機(jī)制
有三種主要的數(shù)據(jù)傳輸方式:輪詢、中斷和DMA。
輪詢(Polling)方式:
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,無需中斷服務(wù)函數(shù)。
缺點(diǎn):CPU會持續(xù)檢查SPI狀態(tài)寄存器,等待數(shù)據(jù)傳輸完成,效率低下,會阻塞其他任務(wù)。
實(shí)現(xiàn):
中斷(Interrupt)方式:
優(yōu)點(diǎn):非阻塞式傳輸,CPU可以在等待數(shù)據(jù)傳輸完成時(shí)執(zhí)行其他任務(wù),提高CPU利用率。
缺點(diǎn):每次傳輸一個(gè)字節(jié)都會產(chǎn)生中斷,對于大數(shù)據(jù)量傳輸,中斷開銷較大。
實(shí)現(xiàn):
C
// SPI1(主機(jī))發(fā)送/接收中斷回調(diào)函數(shù)示例void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi){
if (hspi->Instance == SPI1) { // 主機(jī)發(fā)送/接收完成處理
// ...
} if (hspi->Instance == SPI2) { // 從機(jī)發(fā)送/接收完成處理
// ...
}
}// 啟動中斷傳輸HAL_SPI_TransmitReceive_IT(&hspi1, &tx_buffer_master, &rx_buffer_master, data_len);
HAL_SPI_TransmitReceive_IT(&hspi2, &tx_buffer_slave, &rx_buffer_slave, data_len);啟用SPI1和SPI2的RXNE(接收非空)和TXE(發(fā)送空中)中斷。
在中斷服務(wù)函數(shù)中,根據(jù)中斷標(biāo)志位進(jìn)行數(shù)據(jù)的發(fā)送和接收。
DMA(Direct Memory Access)方式:
優(yōu)點(diǎn):最高效的數(shù)據(jù)傳輸方式,CPU無需參與數(shù)據(jù)傳輸過程,DMA控制器直接在內(nèi)存和SPI外設(shè)之間搬運(yùn)數(shù)據(jù),極大地降低CPU負(fù)載,適用于大數(shù)據(jù)量、高速傳輸。
缺點(diǎn):配置相對復(fù)雜,需要正確設(shè)置DMA通道、數(shù)據(jù)方向、傳輸模式等。
實(shí)現(xiàn):
// 啟動DMA傳輸HAL_SPI_TransmitReceive_DMA(&hspi1, &tx_buffer_master, &rx_buffer_master, data_len);
HAL_SPI_TransmitReceive_DMA(&hspi2, &tx_buffer_slave, &rx_buffer_slave, data_len);在DMA傳輸完成后,會觸發(fā)DMA完成中斷,可以在DMA中斷回調(diào)函數(shù)中處理后續(xù)邏輯。
在STM32CubeMX中為SPI1和SPI2配置DMA通道(通常SPI1_TX/RX和SPI2_TX/RX)。
在代碼中調(diào)用DMA傳輸函數(shù)。
// 主機(jī)發(fā)送一個(gè)字節(jié),并接收一個(gè)字節(jié)HAL_SPI_TransmitReceive(&hspi1, &tx_data, &rx_data, 1,
HAL_MAX_DELAY);// 從機(jī)接收一個(gè)字節(jié),并發(fā)送一個(gè)字節(jié)HAL_SPI_TransmitReceive(&hspi2, &tx_data_slave,
&rx_data_slave, 1, HAL_MAX_DELAY);
在實(shí)際應(yīng)用中,主機(jī)先發(fā)送,從機(jī)準(zhǔn)備好接收,然后從機(jī)發(fā)送,主機(jī)接收。
4.3 通信協(xié)議設(shè)計(jì)
雖然是兩個(gè)SPI接口在同一芯片內(nèi)互通,但設(shè)計(jì)一個(gè)簡單的通信協(xié)議仍然有助于管理數(shù)據(jù)流和錯(cuò)誤處理。
數(shù)據(jù)幀結(jié)構(gòu):可以定義數(shù)據(jù)包的起始標(biāo)志、數(shù)據(jù)長度、數(shù)據(jù)內(nèi)容、校驗(yàn)和等。
握手機(jī)制:簡單的握手協(xié)議可以確保數(shù)據(jù)傳輸?shù)耐叫?。例如,主機(jī)發(fā)送一個(gè)命令字,從機(jī)接收并返回一個(gè)應(yīng)答字。
錯(cuò)誤校驗(yàn):在數(shù)據(jù)包中加入CRC校驗(yàn)(如CRC8或CRC16),以確保數(shù)據(jù)完整性。STM32的SPI外設(shè)通常也內(nèi)置了CRC校驗(yàn)功能。
4.4 軟件流程圖(偽代碼)
主程序:
初始化系統(tǒng)時(shí)鐘
初始化GPIO
初始化SPI1 (主機(jī)模式, DMA/中斷使能)
初始化SPI2 (從機(jī)模式, DMA/中斷使能)
// 確保SPI2從機(jī)準(zhǔn)備好接收
// 如果是DMA模式,先啟動從機(jī)接收DMA
HAL_SPI_Receive_DMA(&hspi2, &slave_rx_buffer, data_len);
While (1)
{
// 主機(jī)準(zhǔn)備數(shù)據(jù)
Fill_Master_Tx_Buffer(master_tx_buffer);
// 主機(jī)啟動DMA傳輸 (發(fā)送并接收)
HAL_SPI_TransmitReceive_DMA(&hspi1, master_tx_buffer, master_rx_buffer, data_len);
// 等待主機(jī)DMA傳輸完成 (通過回調(diào)函數(shù)或標(biāo)志位)
Wait_For_Master_DMA_Completion();
// 處理主機(jī)接收到的數(shù)據(jù)
Process_Master_Rx_Data(master_rx_buffer);
// 從機(jī)處理接收到的數(shù)據(jù),并準(zhǔn)備發(fā)送數(shù)據(jù)
Process_Slave_Rx_Data(slave_rx_buffer);
Fill_Slave_Tx_Buffer(slave_tx_buffer);
// 如果需要,重新啟動從機(jī)DMA接收和發(fā)送
// HAL_SPI_Receive_DMA(&hspi2, &slave_rx_buffer, data_len);
// HAL_SPI_Transmit_DMA(&hspi2, &slave_tx_buffer, data_len);
// 延時(shí)或執(zhí)行其他任務(wù)
HAL_Delay(100);
}
// SPI主機(jī)DMA傳輸完成回調(diào)函數(shù)
void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi->Instance == SPI1) {
// 主機(jī)傳輸完成標(biāo)志置位
master_transfer_complete = SET;
}
if (hspi->Instance == SPI2) {
// 從機(jī)傳輸完成標(biāo)志置位
slave_transfer_complete = SET;
}
}
5. 調(diào)試與驗(yàn)證
示波器:這是調(diào)試SPI通信最強(qiáng)大的工具。通過觀察SCK、MOSI、MISO、NSS信號的時(shí)序,可以驗(yàn)證波特率、CPOL/CPHA設(shè)置是否正確,以及數(shù)據(jù)是否按照預(yù)期傳輸。
邏輯分析儀:如果示波器通道不夠,或者需要長時(shí)間的數(shù)據(jù)捕獲和協(xié)議解析,邏輯分析儀是更好的選擇。
串口調(diào)試:通過UART將SPI傳輸?shù)臄?shù)據(jù)打印到PC端,方便查看數(shù)據(jù)內(nèi)容。
斷點(diǎn)調(diào)試:使用ST-Link和Keil/STM32CubeIDE進(jìn)行在線調(diào)試,觀察寄存器狀態(tài)和變量值,逐步跟蹤代碼執(zhí)行。
6. 潛在問題與解決方案
時(shí)鐘極性與相位不匹配:這是SPI通信中最常見的問題。主從設(shè)備的CPOL和CPHA必須嚴(yán)格一致。通過示波器觀察SCK和數(shù)據(jù)線的波形即可判斷。
NSS信號控制不當(dāng):硬件NSS和軟件NSS的選擇、NSS的有效電平(高電平或低電平有效)以及NSS信號的正確時(shí)序都至關(guān)重要。
數(shù)據(jù)收發(fā)不同步:在DMA或中斷模式下,需要確保主從設(shè)備在開始傳輸前都已準(zhǔn)備就緒。例如,從機(jī)DMA接收應(yīng)在主機(jī)開始發(fā)送前啟動。
緩沖區(qū)溢出/欠載:在高速傳輸時(shí),如果處理速度跟不上,可能導(dǎo)致接收緩沖區(qū)溢出或發(fā)送緩沖區(qū)欠載??梢钥紤]增大緩沖區(qū)大小,優(yōu)化數(shù)據(jù)處理邏輯,或者使用DMA。
電平不兼容:雖然在本方案中兩個(gè)SPI接口在同一芯片內(nèi),但如果涉及到外部SPI設(shè)備,需要確認(rèn)電平是否匹配,必要時(shí)使用電平轉(zhuǎn)換芯片。
DMA配置錯(cuò)誤:DMA通道、數(shù)據(jù)方向、傳輸模式、內(nèi)存地址增量等配置參數(shù)的任何錯(cuò)誤都可能導(dǎo)致DMA傳輸失敗。
7. 結(jié)論
本文詳細(xì)闡述了基于STM32F103C8T6工控板雙SPI接口互通的設(shè)計(jì)方案。通過選擇合適的微控制器和輔助元器件,并進(jìn)行精心的硬件連接和軟件編程,可以實(shí)現(xiàn)高效、可靠的片內(nèi)SPI通信。理解SPI通信原理、掌握STM32的SPI外設(shè)配置以及選擇合適的傳輸模式(輪詢、中斷或DMA)是成功的關(guān)鍵。此方案不僅適用于STM32內(nèi)部SPI接口的互通,其設(shè)計(jì)思想和調(diào)試方法也為未來擴(kuò)展到STM32與其他外部SPI設(shè)備(如傳感器、存儲器、顯示屏等)的通信奠定了堅(jiān)實(shí)基礎(chǔ),為工業(yè)控制系統(tǒng)的設(shè)計(jì)與開發(fā)提供了寶貴的參考。
責(zé)任編輯:David
【免責(zé)聲明】
1、本文內(nèi)容、數(shù)據(jù)、圖表等來源于網(wǎng)絡(luò)引用或其他公開資料,版權(quán)歸屬原作者、原發(fā)表出處。若版權(quán)所有方對本文的引用持有異議,請聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時(shí)處理。
2、本文的引用僅供讀者交流學(xué)習(xí)使用,不涉及商業(yè)目的。
3、本文內(nèi)容僅代表作者觀點(diǎn),拍明芯城不對內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨(dú)立判斷做出的,請讀者明確相關(guān)結(jié)果。
4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。
拍明芯城擁有對此聲明的最終解釋權(quán)。