新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機軟件模擬SPI接口

        單片機軟件模擬SPI接口

        作者: 時間:2016-11-28 來源:網絡 收藏
        SPI(Serial Peripheral Interfacer 串行外設接口)是摩托羅拉公司推出的一種同步串行通訊接口,用于微處理器臌控制器和外圍擴展芯片之間的串行連接,現已發展成為一種工業標準,目前,各半導體公司推出了大量的帶有SPI接口的具有各種各樣功能的芯片,如RAM,EEPROM,FlashROM,A/D轉換器、D/A轉換器、LED/LED顯示驅動器、I/O接口芯片、實時時鐘、UART收發器等等,為用戶的外圍擴展提供了極其靈活而價廉的選擇。由于SPI總線接口只占用微處理器四個I/O口線,采用SPI總線接口可以簡化電路沒計,節省很多常規電路中的接口器件和I/O口線,提高設計的可靠性。

        現以 AT89C205l單片機模擬SPI總線操作串行EEPROM 93CA6為例,如圖1所示,介紹利用單片機的I/O口通過軟件模擬SPI總線的實現方法。在這里,僅介紹讀命令的時序和應用子程序。

        93C46存儲器SPI總線的工作原理

        93CA6作為從設備,其SPI接口使用4條I/O口線:串行時鐘線(SK)、輸出數據線DO、輸入數據線DI和高電平有效的從機選擇線CS。其數據的傳輸格式是高位(MSB)在前,低位(LsB)在后。93C46的SPI總線接口讀命令時序如圖2所示。

        軟件模擬SPI接口的實現方法

        對于不帶SPI串行總線接口的AT89C2051單片 機來說,可以使用軟件來模擬SPI的操作,圖1所示 為AT89C2051單片機與串行EEPROM 93C46的硬件 連接圖,其中,P1.0模擬SPI主設備的數據輸出端 SDO,P1.2模擬SPI的時鐘輸出端SCK,P1.3模擬 SPI的從機選擇端SCS,P1.1模擬SPI的數據輸入 SDI。
        上電復位后首先先將P1.2(SCK)的初始狀態設置為0(空閑狀態)。
        讀操作:AT89C2051首先通過P1.0口發送1位起始位(1),2位操作碼(10),6位被讀的數據地址(A5A4A3A2A1A0),然后通過P1.1口讀1位空位(0),之后再讀l6位數據(高位在前)。
        寫操作:AT89C2051首先通過P1.0口發送1位起始位(1),2位操作碼(01),6位被寫的數據地址(A5A4A3A2A1A0),之后通過P1.0口發送被寫的l6位數據(高位在前),寫操作之前要發送寫允許命令,寫之后要發送寫禁止命令。
        寫允許操作(WEN)):寫操作首先發送1位起始位(1),2位操作碼(00),6位數據(11XXXX)。
        寫禁止操作(WDS)):寫操作首先發送1位起始位(1),2位操作碼(00),6位數據(00XXXX)。
        下面介紹用C51模擬SPI的子程序。
        [cpp]view plaincopyprint?
        1. //首先定義好I/O口
        2. sbitSDO=P1^0;
        3. sbitSDI=P1^1;
        4. sbitSCK=P1^2;
        5. sbitSCS=P1^3;
        6. sbitACC_7=ACC^7;
        7. unsignedintSpiRead(unsignedcharadd)
        8. {
        9. unsignedchari;
        10. unsignedintdatal6;
        11. add&=0x3f;
        12. add|=0x80;
        13. SDO=1;
        14. SCK=0;
        15. SCK=1;
        16. for(i=0;<8;i++)
        17. {
        18. if(add&0x80==1)
        19. SDO=1;
        20. else
        21. SDO=0;
        22. SCK=0;
        23. SCK=1;
        24. add<<=1;
        25. }
        26. SCK=1;
        27. SCK=0;
        28. datal6<<=1;
        29. for(i=0;<16;i++)
        30. {
        31. SCK=1;
        32. _nop_();
        33. if(SDI==1)
        34. datal6|=0x01;
        35. SCK=0;
        36. datal6<<=1;
        37. }
        38. returndatal6;
        39. }
        對于不同的串行接口外圍芯片,它們的時鐘時序是不同的。上述子程序是針對在SCK的上升沿輸入(接收)數據和在下降沿輸出(發送)數據的器件。這些子程序也適用于在串行時鐘)的上升沿輸入和下降沿輸出的其它各種串行外圍接口芯片,只要在程序中改變P1.2(SCK)的輸出電平順序進行相應調整即可。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 基隆市| 河南省| 九龙县| 额尔古纳市| 四会市| 高密市| 和顺县| 仁怀市| 仪征市| 浦城县| 眉山市| 中卫市| 南投市| 林甸县| 将乐县| 福海县| 宾川县| 佛学| 库尔勒市| 兴隆县| 大荔县| 九寨沟县| 汉阴县| 蓝田县| 花垣县| 方山县| 阜平县| 石河子市| 临城县| 綦江县| 上饶县| 阳原县| 远安县| 双江| 莱芜市| 宁强县| 西城区| 盘山县| 安福县| 平陆县| 阿巴嘎旗|