STM32F407 SPI通訊介面

2021-10-08 12:22:43 字數 1929 閱讀 5674

spi,是一種高速的,全雙工,同步的通訊匯流排,並且在晶元的管腳上只占用四根線,節約了晶元的管腳,同時為pcb的布局上節省空間,提供方便,主要應用在 eeprom,flash,實時時鐘,ad轉換器,還有數字訊號處理器和數碼訊號解碼器之間。

spi介面一般使用4條線通訊:

主機和從機都有乙個序列移位暫存器,主機通過向它的spi序列暫存器寫入乙個位元組來發起一次傳輸。

序列移位暫存器通過mosi訊號線將位元組傳送給從機,從機也將自己的序列移位暫存器中的內容通過miso訊號線返回給主機。這樣,兩個移位暫存器中的內容就被交換。

外設的寫操作和讀操作是同步完成的。如果只進行寫操作,主機只需忽略接收到的位元組;反之,若主機要讀取從機的乙個位元組,就必須傳送乙個空位元組來引發從機的傳輸。

上方兩個圖為spi傳輸的時序圖,cpol,cpha有四種組合情況,cpol(時鐘極性)控制在沒有資料傳輸時時鐘的空閒狀態電平,對主從裝置都有效。 cpha(時鐘相性)控制採集的第幾個時鐘邊沿。

如:當cpol=1,此時表明在沒有資料傳輸時sck為高電平,當cpha=0時,表示採集第乙個邊沿,當cpha=1表示採集第二個邊沿。

2). spi常用暫存器:

3). spi引腳復用

根據開發手冊上的說明,可以檢視哪些io口可以復用為哪個spi的引腳。如上圖為spi1對應的引腳復用。

也可以通過原理圖檢視對應的引腳復用說明。

4). spi狀態標誌

spi匯流排有三個狀態標誌:

5). 資料幀格式

有倆個地方要設定,spi_datasize(資料大小),可以選擇8bit和16bit

spi_firstbit(選擇是msb還是lsb),選擇msb方式,舉個例子假設用16bit,就是[15,0]這樣,如果是lsb就是[0,15]這樣。

配置過程:

①使能spix和io口時鐘

rcc_ahbxperiphclockcmd() / rcc_apbxperiphclockcmd();

②初始化io口為復用功能

void gpio_init(gpio_typedef* gpiox, gpio_inittypedef* gpio_initstruct);

③設定引腳復用對映:

gpio_pinafconfig();

②初始化spix,設定spix工作模式

void spi_init(spi_typedef* spix, spi_inittypedef* spi_initstruct);

③使能spix

void spi_cmd(spi_typedef* spix, functionalstate newstate);

④spi傳輸資料

void spi_i2s_senddata(spi_typedef* spix, uint16_t data);

uint16_t spi_i2s_receivedata(spi_typedef* spix) ;

⑤檢視spi傳輸狀態

spi_i2s_getflagstatus(spi2, spi_i2s_flag_rxne);

STM32F407使用硬體SPI驅動MCP3008

前段時間校企合作專案裡一塊板子上用了mcp3008,一開始老是得到值,後來終於得到了,以此來寫一下部落格分享給大家,讓大家少走彎路。言歸正傳,我們開始 mcp3008是乙個逐漸接近的10位模擬數字轉化器,板載取樣和保持電路.它可程式設計,提供四個偽差分輸入對或八個單端輸入.微分非線性 dnl 積分非...

基於stm32f407建立stm32F427工程

分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...

STM32之間SPI通訊

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