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布局空間,但缺點就是沒有指定的流控制,沒有應答機制來確定訊號收到與否,...