久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > SPI總線初體驗

SPI總線初體驗

作者: 時間:2016-12-15 來源:網絡 收藏
SPI是當前用的比較多的硬件總線,結構很簡單,一共只要4根線就可以了。 其中兩根是數據線,名字等會說,一根時鐘線,叫SCK; 一根是片選線(CS)。4根線的連接見下面:



SPI的典型應用中,通信的雙方一個是主(Master),一個是從(slave)。區別是由主設備提供通信時鐘信號SCK給從設備,此外主設備還需要提供一個引腳來驅動Slave的片選信號CS。主從設備的SO和SI是交叉連接的, 主的SO是數據輸出口要接在從設備的SI上,反之依然。根據這樣的設計,能做SPI的設備往往是單片機, ARM芯片或者更強一些的CPU什么,而flash, 網絡芯片或者聲音A/D 和D/A轉換芯片就扮演從設備的角色。主設備提供片選信號來選中從設備和連續時鐘信號來驅動雙方設備的讀寫過程。

由于從設備往往都是廠家設計好的, 主要的用戶工作是如何在主設備上把從設備驅動起來。這是把我搞的灰頭土臉的地方。以我要驅動Flash為例,根據看的文檔,我直覺上知道應該把片選信號先拉低(選中flash),然后在SO上發出控制指令,最后等數據到來。結果我的程序是這樣寫的:
1、初始化SPI控制器,包括波特率設置
2、驅動CS為低電平選中flash
3、發送控制命令
4、接受數據

結果我收到的數據只有一個字節,內容為0. 忙了一個早上還是這個結果,搞的我極其郁悶,嚴重懷疑自己的RP,然后開始懷疑單片機是不是壞的,flash是不是壞的。一圈下來繼續懷疑RP。最后實在郁悶,就扛來示波器測波形。因為這個玩也不熟悉,因此不敢輕易動,弄壞了把自己賣了才賠的起了(10G的哦)。結果發現430單片機的片選CS信號正常,在數據發送的時候SO口的確有波形輸出,說明輸出是對的。但是。。。。為什么SCK沒有連續時鐘信號輸出 ???? 我立刻理直氣壯認為 單片機燒了,告訴師兄, 結果師兄暴汗.... :SPI主設備如果不連續輸出數據,就不維護時鐘了。頓時覺得自己長的好白阿。 正確的做法應該在主設備上送完指令后不停的送無用數據讓spi控制器繼續輸出時鐘并且讀取發回來的數據。由于SPI控制器是同步讀取數據的,因此我在發送的同時也讀取數據,因此我送出去一個字節的數據,所以讀回來一個數據,當然這個數據是無用的。

知道問題了,午飯后我把程序改成中斷模式的, 所有的數據發送和接受全部采用中斷。 發送寄存器一空 430就會發一個發送就緒中斷,我在中斷程序中把數組中的命令字發出去,等發完之后就一直發0x00,維護時鐘,直到發送出去的字節數等于期望收到的數據量。另外一方面當數據收到后430就觸發接收中斷得到數據。中斷程序把數據讀出來扔到接收數組里面。 等發送完后要檢查是不是移位寄存器為空,防止還有數據沒出去,等空了就拉高片選信號斷開flash. 完成這些后,檢查接收數組,可以看到如果發送命令為n字節,則前面n字節的數據都是廢的,所以要從n+1的位置來找收到的數據。圓滿大結局。(其實后面還碰到了波特率不對,結果丟數據的問題,但是很快解決了加上現在寫的手酸,就略過拉)


關鍵詞: SPI總線硬件總

評論


技術專區

關閉