SPI總線初體驗(yàn)
SPI的典型應(yīng)用中,通信的雙方一個(gè)是主(Master),一個(gè)是從(slave)。區(qū)別是由主設(shè)備提供通信時(shí)鐘信號(hào)SCK給從設(shè)備,此外主設(shè)備還需要提供一個(gè)引腳來(lái)驅(qū)動(dòng)Slave的片選信號(hào)CS。主從設(shè)備的SO和SI是交叉連接的, 主的SO是數(shù)據(jù)輸出口要接在從設(shè)備的SI上,反之依然。根據(jù)這樣的設(shè)計(jì),能做SPI的設(shè)備往往是單片機(jī), ARM芯片或者更強(qiáng)一些的CPU什么,而flash, 網(wǎng)絡(luò)芯片或者聲音A/D 和D/A轉(zhuǎn)換芯片就扮演從設(shè)備的角色。主設(shè)備提供片選信號(hào)來(lái)選中從設(shè)備和連續(xù)時(shí)鐘信號(hào)來(lái)驅(qū)動(dòng)雙方設(shè)備的讀寫過(guò)程。
由于從設(shè)備往往都是廠家設(shè)計(jì)好的, 主要的用戶工作是如何在主設(shè)備上把從設(shè)備驅(qū)動(dòng)起來(lái)。這是把我搞的灰頭土臉的地方。以我要驅(qū)動(dòng)Flash為例,根據(jù)看的文檔,我直覺上知道應(yīng)該把片選信號(hào)先拉低(選中flash),然后在SO上發(fā)出控制指令,最后等數(shù)據(jù)到來(lái)。結(jié)果我的程序是這樣寫的:
1、初始化SPI控制器,包括波特率設(shè)置
2、驅(qū)動(dòng)CS為低電平選中flash
3、發(fā)送控制命令
4、接受數(shù)據(jù)
結(jié)果我收到的數(shù)據(jù)只有一個(gè)字節(jié),內(nèi)容為0. 忙了一個(gè)早上還是這個(gè)結(jié)果,搞的我極其郁悶,嚴(yán)重懷疑自己的RP,然后開始懷疑單片機(jī)是不是壞的,flash是不是壞的。一圈下來(lái)繼續(xù)懷疑RP。最后實(shí)在郁悶,就扛來(lái)示波器測(cè)波形。因?yàn)檫@個(gè)玩也不熟悉,因此不敢輕易動(dòng),弄壞了把自己賣了才賠的起了(10G的哦)。結(jié)果發(fā)現(xiàn)430單片機(jī)的片選CS信號(hào)正常,在數(shù)據(jù)發(fā)送的時(shí)候SO口的確有波形輸出,說(shuō)明輸出是對(duì)的。但是。。。。為什么SCK沒(méi)有連續(xù)時(shí)鐘信號(hào)輸出 ???? 我立刻理直氣壯認(rèn)為 單片機(jī)燒了,告訴師兄, 結(jié)果師兄暴汗.... :SPI主設(shè)備如果不連續(xù)輸出數(shù)據(jù),就不維護(hù)時(shí)鐘了。頓時(shí)覺得自己長(zhǎng)的好白阿。 正確的做法應(yīng)該在主設(shè)備上送完指令后不停的送無(wú)用數(shù)據(jù)讓spi控制器繼續(xù)輸出時(shí)鐘并且讀取發(fā)回來(lái)的數(shù)據(jù)。由于SPI控制器是同步讀取數(shù)據(jù)的,因此我在發(fā)送的同時(shí)也讀取數(shù)據(jù),因此我送出去一個(gè)字節(jié)的數(shù)據(jù),所以讀回來(lái)一個(gè)數(shù)據(jù),當(dāng)然這個(gè)數(shù)據(jù)是無(wú)用的。
知道問(wèn)題了,午飯后我把程序改成中斷模式的, 所有的數(shù)據(jù)發(fā)送和接受全部采用中斷。 發(fā)送寄存器一空 430就會(huì)發(fā)一個(gè)發(fā)送就緒中斷,我在中斷程序中把數(shù)組中的命令字發(fā)出去,等發(fā)完之后就一直發(fā)0x00,維護(hù)時(shí)鐘,直到發(fā)送出去的字節(jié)數(shù)等于期望收到的數(shù)據(jù)量。另外一方面當(dāng)數(shù)據(jù)收到后430就觸發(fā)接收中斷得到數(shù)據(jù)。中斷程序把數(shù)據(jù)讀出來(lái)扔到接收數(shù)組里面。 等發(fā)送完后要檢查是不是移位寄存器為空,防止還有數(shù)據(jù)沒(méi)出去,等空了就拉高片選信號(hào)斷開flash. 完成這些后,檢查接收數(shù)組,可以看到如果發(fā)送命令為n字節(jié),則前面n字節(jié)的數(shù)據(jù)都是廢的,所以要從n+1的位置來(lái)找收到的數(shù)據(jù)。圓滿大結(jié)局。(其實(shí)后面還碰到了波特率不對(duì),結(jié)果丟數(shù)據(jù)的問(wèn)題,但是很快解決了加上現(xiàn)在寫的手酸,就略過(guò)拉)
評(píng)論