STM32值SPI的使用及SPI初始化注意事項

2021-07-23 16:54:19 字數 2813 閱讀 3287

在stm32f10x系列晶元中,雖然所擁有的spi同步串列埠數量不相同,但是初始化的方法都是一樣的。其中使用spi時候我們回憶gpio的使用,要注意6點,我們這裡主要講解一點。

根據系統對該不同功能的要求,初始化不同功能外設,初始化gpio,初始化spi同步串列埠裝置就會比較複雜。stm32f10x系列晶元的所有sip同步串列埠都是和gpio共用,spi的初始化分為2大塊,就是spi所使用的i/o口的初始化和spi功能的初始化。對於spi同步串列埠要用到的引腳,根據資料的方向,要設定gpio_mode_in_floating或者gpio_mode_af_pp復用推免輸出。其他的和gpio引腳設定一樣。

至於低於spi同步串列埠引數的初始化方法將在之後的乙個例子中體現出來。

我們在使用spi時候,必須開啟spi的同步串列埠的時鐘。這樣系統才可以從這個開啟的同步串列埠中傳送和接收資料。

rcc_apb2periphclockcmd(rcc_apb2periph_spi1,enable);

在spi傳送資料很簡單,把要傳送的資料位元組寫進傳送緩衝器時,傳送過程就開始了。只不過在試圖寫傳送緩衝器之前,需要確認txe標誌是否為1.

同樣對於接收器而言,當資料傳輸完成時,資料結束以後也完成。在最後取樣時鐘沿,rxne標誌位置位。在移位暫存器中接收到的資料字被傳送到接收快取器。都spi_dr暫存器時將清楚rxne位。

例:要用pa7做spi1同步串列埠的mosi引腳,用pa6做spi1同步串列埠的miso引腳,同pa5做sck引腳,用pa4做nss片選引腳。在定義同步串列埠spi1為主裝置,每次傳送8個 資料位,高位在前,spi時鐘頻率為9mhz,資料捕獲在第二個時鐘沿,時鐘空閒時為低電平,nss引腳有軟體管理。

完整的**如下:

#include"stm32f10x_lib.h"

void spi_configuration(void)

//spi_1串列埠引數部分定義,spi_1引數為時鐘平時為高,上公升沿取樣

spi_inittypedef  spi_initstructure;

gpio_inittypedef  gpio_initstructure;

rcc_apb2periphclockcmd(rcc_apb2periph_spi2,enable);//使能spi_2時鐘

//配置spi1的miso(pa6)為浮空輸入

gpio_initstructure.gpio_pin = gpio_pin_6;

gpio_initstructure.gpio_mode = gpio_mode_in_floating;

gpio_init(gpioa,&gpio_initstructure);

//配置spi1的mosi(pa7)和spi1的clk(pa5)為復用推免輸出

gpio_initstructure.gpio_pin = gpio_pin_5|gpio_pin_7;

gpio_initsturcture.gpio_speed = gpio_speed_50mhz;

gpio_initstructure.gpio_mode = gpio_mode_af_pp;

gpio_init(gpioa,&gpio_initstructure);

//配置spi1的nss(pa4)為推免輸出

gpio_initstructure.gpio_pin = gpio_pin_4;

gpio_initsturcture.gpio_speed = gpio_speed_50mhz;

gpio_initstructure.gpio_mode = gpio_mode_out_pp;

gpio_init(gpioa,&gpio_initsturcture);

//spi1同步引數初始化定義

spi_inittypedef spi_initstructure;

spi_initstructure.spi_direction = spi_direction_2lines_fullduplex;

spi_initstructure.spi_mode = spi_mode_master;

spi_initstructure.spi_datasize = spi_datasize_8b;

spi_initstructure.spi_cpol = spi_cpol_low;

spi_initstructure.spi_cpha = spi_cpha_2edge;

spi_initstructure.spi_nss = spi_nss_soft;

spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_4;

spi_initstructure.spi_firstbit = spi_firstbit_msb;

spi_initstructure.spi_crcpolynomial = 7;

spi_init(spi1,&spi_initstructure);

spi_cmd(spi1,enable);

//通過spi1口傳送乙個資料,同時接受乙個資料

unsigned char spi_sendbyte(unsigned char byte)

//如果傳送暫存器資料沒有傳送完,迴圈等待

while(spi_t1s_getflagstatus(spi1,spi_t1s_flag_txe) == reset);

//往傳送暫存器寫入要傳送的資料

spi_t1s_senddata(spi2,byte);

//如果接受暫存器沒有收到資料,迴圈

while(spi_t1s_getflagstatus(spi1,spi_t1s_flag_rxne) == reset);

return spi_t1s_receivedata(spi1);

STM32之間SPI通訊

這幾天實驗室比較忙,所以部落格這邊停了一下,繼續吧。繼串列埠中斷後,大家可以嘗試微控制器間串列埠通訊,這裡就不再多贅述。串列埠完了之後,我接著學的就是spi通訊了,作為hello moto公司推出的這種4線全雙工通訊,很節約pcb布局空間,但缺點就是沒有指定的流控制,沒有應答機制來確定訊號收到與否,...

STM32 快速上手SPI

基本的部分前文 stm32 spi 已經介紹過了,這裡只記怎麼用。stm32f103zet6的三個spi的引腳分別為 spi1在apb1時鐘下,spi2和spi3在apb2時鐘下。void spi i2s deinit spi typedef spix void spi init spi typed...

STM32 硬體SPI主從通訊

本例子基於stm32f103zet6晶元,實現spi1與spi2的主從通訊。其中spi1配置為主機,spi2配置為從機,均配置為全雙工模式。硬體連線圖 其中,我們需要注意的是,spi的從機不能主動傳送資料,只能應答資料。本例子的資料互動過程 主機使用查詢方式傳送資料給從機。從機使用中斷接收方式接收資...