STM32中SPI概述與程式設計

2021-09-02 14:21:01 字數 2044 閱讀 5618

spi 是英語serial peripheral inte***ce的縮寫,顧名思義就是序列外圍裝置介面。是motorola首先在其mc68hcxx系列處理器上定義的。c1101的引腳為 vcc gnd csn si so sck gd00 gd02 後兩個貌似可以不接,他們能產生中斷

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

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

miso 主裝置資料輸入,從裝置資料輸出。

mosi 主裝置資料輸出,從裝置資料輸入。

sclk時鐘訊號,由主裝置產生。

cs從裝置片選訊號,由主裝置控制。

spi工作原理總結:

硬體上為4根線。

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

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

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

程式配置過程:

①配置相關引腳的復用功能,使能spix時鐘

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

②初始化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);

w25q128(w25q64)將16m(8m)的容量分為256(128)個塊(block),每個塊大小為64k位元組,每個塊又分為16個扇區(sector),每個扇區4k個位元組。w25qxx的最小擦除單位為乙個扇區,也就是每次必須擦除4k個位元組。這樣我們需要給w25qxx開闢乙個至少4k的快取區,這樣對sram要求比較高,要求晶元必須有4k以上sram才能很好的操作。

void spi2_init(void)

//spi 速度設定函式

//speedset:

//spi_baudrateprescaler_2 2分頻

//spi_baudrateprescaler_8 8分頻

//spi_baudrateprescaler_16 16分頻

//spi_baudrateprescaler_256 256分頻

void spi2_setspeed(u8 spi_baudrateprescaler)

//spix 讀寫乙個位元組

//txdata:要寫入的位元組

//返回值:讀取到的位元組

u8 spi2_readwritebyte(u8 txdata)

spi_i2s_senddata(spi2, txdata); //通過外設spix傳送乙個資料

retry=0;

while (spi_i2s_getflagstatus(spi2, spi_i2s_flag_rxne) == reset) //檢查指定的spi標誌位設定與否:接受快取非空標誌位

return spi_i2s_receivedata(spi2); //返回通過spix最近接收的資料

}

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...

FPGA與STM32 模擬32位SPI通訊(二)

1 下午又繼續實驗,發現fpga不輸出資料了,但是sck訊號還有,情況比上午還糟,用signaltap 了一陣也沒有結果,後來發現是杜邦線松了。教訓是以後接線時鬆的線務必不要將就,尤其是在接比較密集的杜邦線,線鬆動了會很難排查,熟悉了signaltap的 但仿不出全部的32個sck訊號,取樣率設到6...