天天看點

SPI 總線初體驗

最近忙碌 一直沒空上來寫東西。前幾天折騰了一把SPI總線用TI的430單片機來讀取SPI flash資料,搞的灰頭土臉的但是好歹還是搞定了。就拿出來濫竽充數一下。

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的位置來找收到的資料。 圓滿大結局。(其實後面還碰到了波特率不對,結果丢資料的問題,但是很快解決了加上現在寫的手酸,就略過拉)

<a href="http://down.51cto.com/data/2349248" target="_blank">附件:http://down.51cto.com/data/2349248</a>

     本文轉自nathanxu 51CTO部落格,原文連結:http://blog.51cto.com/nathanxu/59334,如需轉載請自行聯系原作者

繼續閱讀