新聞中心

        SPI總線初體驗

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



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

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

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

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


        關鍵詞: SPI總線硬件總

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 青冈县| 保山市| 乌恰县| 文安县| 四川省| 乌兰县| 孟津县| 电白县| 衡水市| 平乡县| 湖州市| 洪泽县| 九江市| 会昌县| 满洲里市| 永修县| 新绛县| 吕梁市| 大名县| 乌什县| 平乐县| 克什克腾旗| 台中县| 德保县| 秀山| 安阳市| 陆良县| 吉林省| 永兴县| 雷山县| 鸡西市| 团风县| 万荣县| 朝阳县| 桃江县| 榆林市| 综艺| 股票| 咸阳市| 安西县| 伊吾县|