SPI是一種非常簡(jiǎn)單易用的全雙工主從式通信協(xié)議。
本文使用兩片STM32F429,一個(gè)作為主機(jī),一個(gè)作為從機(jī)完成SPI的全雙工通信測(cè)試。
在STM32的HAL庫(kù)中簡(jiǎn)化了SPI主機(jī)端的發(fā)送接收,但是HAL庫(kù)沒(méi)有提供一個(gè)簡(jiǎn)單的SPI從機(jī)代碼接口,這樣就需要自己拼接接口來(lái)完成全雙工的通信。以下都以實(shí)現(xiàn)全雙工通信為目的進(jìn)行配置和編寫:
一 主機(jī)端:
禁止使用SPI的硬件片選信號(hào),因?yàn)檫@個(gè)信號(hào)是SPI使能了之后就一直為低,直到禁止了SPI之后才為高。可以使用某一個(gè)普通IO來(lái)充當(dāng)片選信號(hào)。
這里選用一個(gè)較低的速率來(lái)通信,在HAL庫(kù)的spi頭文件中有說(shuō)明各個(gè)模式下SPI的最大速度。
二 從機(jī)端:
主從的速率要一樣,從機(jī)打開SPI中斷
三 硬件連接:
主機(jī) 從機(jī)
CS CS
CLK CLK
MISO MISO
MOSI MOSI
接收和發(fā)送都是直連不需要交叉。
四 主機(jī)代碼:
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, txbuf, rxbuf, 1, 0xFF);
HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_SET);
HAL_Delay(500);
}
/* USER CODE END 3 */
五 從機(jī)代碼:
現(xiàn)在while之前打開spi接收中斷:
/* USER CODE BEGIN 2 */
HAL_SPI_Receive_IT(&hspi1, rxbuf, 1);
/* USER CODE END 2 */
在中斷中使用阻塞函數(shù)把數(shù)據(jù)發(fā)送出去:
/* USER CODE BEGIN 4 */
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi == &hspi1)
{
HAL_SPI_Transmit(&hspi1, txbuf, 1, 0xFFFF);
HAL_SPI_Receive_IT(&hspi1, rxbuf, 1);
}
}
/* USER CODE END 4 */
使用邏輯分析儀可以看到主機(jī)在發(fā)送的同時(shí)也收到了從機(jī)返回的數(shù)據(jù)。
可能在中斷里調(diào)用阻塞發(fā)送不是很好,如果有更好的方法歡迎指正。
另外在一片stm32上使用兩個(gè)SPI接口模擬主從機(jī)通信好像不能正常工作。
最后需要注意的是如果你使用了以上方法,能測(cè)試spi通信成功,但是當(dāng)主程序有其他任務(wù)的時(shí)候就會(huì)非常卡頓,因?yàn)樵谥袛嘀姓{(diào)用了阻塞發(fā)送的函數(shù)。為了讓程序更加流暢一種方法是減小HAL_SPI_Transmit的等待時(shí)間,另外一種方法就是使用DMA.
因?yàn)檫@里我只需要用DMA回復(fù)SPI master數(shù)據(jù),所以我只開啟了從機(jī)的SPI發(fā)送DMA,而且沒(méi)有使能DMA中斷。配置如下圖:
將spi.c中的代碼更改如下:
/* USER CODE BEGIN 1 */
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi == &hspi1)
{
HAL_SPI_Transmit_DMA(&hspi1, p_phase_buf, 1);
//HAL_SPI_Transmit(&hspi1, p_phase_buf, 1, 0xFFF);
HAL_SPI_Receive_IT(&hspi1, p_pwm_freq, 1);
}
}
/* USER CODE END 1 */
添加DMA就是這么簡(jiǎn)單,由此就看到HAL庫(kù)高效的地方了,使用起來(lái)確實(shí)能大幅提高工作效率
上一篇:s3c2440裸板_中斷體系結(jié)構(gòu)
下一篇:STM32之串口DMA接收不定長(zhǎng)數(shù)據(jù)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 美光出貨全球首款基于 1γ(1-gamma)制程節(jié)點(diǎn)的 LPDDR5X 內(nèi)存,賦能移動(dòng) AI 應(yīng)用
- BOE(京東方)攜手AOC重磅推出首款愛瞳圓偏光電競(jìng)顯示器 樹立行業(yè)健康護(hù)眼新標(biāo)桿
- esp32 devkit v1下載marlin2.1,程序無(wú)法運(yùn)行的解決方案
- 【TVM系列八】microTVM在ESP32上調(diào)優(yōu)算子
- 驅(qū)動(dòng)算力的心臟革命:AI服務(wù)器電源三大技術(shù)躍遷與測(cè)試破局
- 恩智浦推出自主安全訪問(wèn)解決方案,重新定義門禁
- Zephyr 環(huán)境搭建 - ESP32 篇
- ESP32讀取甲醛傳感器數(shù)據(jù)
- ESP32接入巴法云,開源安卓app、微信小程序控制
- ESP32單片機(jī)基礎(chǔ)知識(shí)
- iOS13升級(jí)后 CarPlay車載系統(tǒng)帶來(lái)哪些改變?
- iOS 12用戶需每小時(shí)解鎖iPhone以保持USB連接
- 5G將大爆發(fā),產(chǎn)業(yè)鏈相關(guān)廠商都怎么說(shuō)?
- 北歐各國(guó)簽署5G發(fā)展意向書
- 臺(tái)積電VLSI研討會(huì)發(fā)表了多篇先進(jìn)制程論文
- 蘋果獲得汽車側(cè)視鏡專利 智能汽車再無(wú)盲點(diǎn)
- 立功科技云平臺(tái)接入技術(shù)
- 歐盟研發(fā)新款電動(dòng)汽車,鋰硫電池的能量密度高達(dá)310Wh/kg
- 電子電氣架構(gòu)將引領(lǐng)智能汽車的技術(shù)變革
- 重磅新聞!2020年1月起全部乘用車將強(qiáng)制裝胎壓監(jiān)測(cè)系統(tǒng)
- 國(guó)產(chǎn)FPGA芯片第五坑“No devices found”再現(xiàn)
- 一個(gè)不知名的符號(hào)
- CNTTR通信電子培訓(xùn)資料電源工程設(shè)計(jì)
- 求解答,工具是ccs2.2,讀寫flash空間和Clist問(wèn)題
- 【T叔藏書閣】電磁鐵優(yōu)化設(shè)計(jì)制作新工藝與電磁兼容屏蔽及性能測(cè)量新技術(shù)實(shí)用手冊(cè)
- 2017新年快樂(lè)
- stm32解碼sd卡中的gif圖片
- 數(shù)字轉(zhuǎn)模擬(D/A) 隔離轉(zhuǎn)換器485/232轉(zhuǎn)4-20MA
- 近期迷上了這個(gè)機(jī)械
- 求助關(guān)于基于單片機(jī)的數(shù)字PID調(diào)節(jié)問(wèn)題