經過了痛苦的兩天我終於算是搞懂了spi了,看了網路上排名很高但是及其不負責任的例程踩了很多坑,終於靜下心來分析暫存器得出了正確的結論。趕緊寫下來以防忘記。
spi的原理是,主機傳送時鐘訊號給從機,然後主從機隨著時鐘訊號,乙個乙個地交換在dr暫存器裡面的值,過程如下圖所示(圖二右鍵在新標籤中開啟能看到**)
所以我們常常可以看到spi的**是這麼寫的,發和收是一樣的,這是因為spi的傳送和接受是乙個環。不想看也行,就是示例**看到明明是發資料卻還要收不要覺得奇怪。
unsigned char
spi_sendbyte(unsigned char byte)
第一次弄spi往往不知道怎麼開始,其實最好的方法就是自己傳送自己接受,我將spi1設定為主機,spi2設定為從機。我用的是stm32f103一般引腳都是一樣的所以下面的**其實能夠直接抄過去,部分內容我會在**中講解。我這裡貼出來的是全部的**,沒有一句**是浪費的。順便附上我的接線
a4-3v3
b12-gnd
a5-b13
a6-b14
a7-b15
#include
"stm32f10x.h"
void spi_writebyte(u8 data);
u8 spi_slv_sendbyte(u8 data);
u8 spi_slv_readbyte();
int main(void)
}void spi_writebyte(u8 data)
void spi_writebyte(u8 data)
u8 spi_slv_sendbyte(u8 data)
u8 spi_slv_readbyte()
如果上面的**無法執行,則開啟看看暫存器配置對了沒,我的暫存器配置如下圖所示,如果依舊有問題,我這裡推薦乙個講解暫存器很不錯的網頁
spi暫存器詳解
在搞spi時踩過的坑
1.能夠成功設定spi1中的dr暫存器(最開始提過這個暫存器)的值,然後傳輸成功,但是就是無法設定成功spi2中的值。我們可以在初始化後加乙個斷點來設定spi2中dr的值。我們會發現無法設定,不管設定什麼都會變成原來的值,但是spi1的dr值原封不動。這是因為時鐘是主機發出的,所以除非主機主動交換dr暫存器裡的值,否則是無法交換的。所以我們可以在spi2的dr暫存器裡面輸入乙個值(然後會變回來,但是不要管),然後在spi1的暫存器裡再輸入乙個值然後回車,你會發現你原本想輸入spi2的dr值成功換到了spi1的dr裡面了。
2.在下面這個**前加了斷點
while(spi_i2s_getflagstatus(spi1,spi_i2s_flag_rxne) == reset);始終進不去,這個問題的原因在
這個鏈結裡面的坑1裡面有講,主要是除錯模式造成的禍
除錯模式的坑
第一次飛行
開始敲下這段話時,窗外下面正是一片片陽光照耀著的白雲,伴隨著張學友的歌聲,心潮起伏.雖然從初中起,我就經常乙個人坐著火車,汽車東奔西跑,坐飛機卻是第一次.早上上飛機前,心裡忐忑,必竟還是踏在陸地上踏實.但上了飛機後注意力就放在其它地方上去了,而且,運氣好的是我有乙個靠窗的位置.飛機準備起飛了,助跑加...
第一次面試
話說3月4號學院召開實習動員大會並有三家公司過來進行宣講會,分別是國家體育總局亞運專案組,金蝶和華際友天,由此開始了實習生涯。周五的傍晚,正吃著飯的時候突然收到簡訊通知,金蝶週六上午10點有個面試。當晚就瀏覽著些簡歷製作相關的網頁,為第二天做準備,總以為,簡歷弄得可以了,然後每太留意去完善 後來才知...
第一次哭泣
第一次來到南方 沒有朋友 沒有親人 乙個從沒有出過門的乙個女孩子 為了工作 學習c 在這碰到了乙個很好的老師 當老師控制我的機器時 或者給我講題時 我都是很感動的 幾乎是每天都有問題 形成了依賴 以前他說不要一有問題就舉手問 我依然問 就算我不問他也會控制我的機器 看看我在做什麼 或者有什麼錯誤 現...