<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)軟件模擬SPI接口

          單片機(jī)軟件模擬SPI接口

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

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

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

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

          軟件模擬SPI接口的實(shí)現(xiàn)方法

          對于不帶SPI串行總線接口的AT89C2051單片 機(jī)來說,可以使用軟件來模擬SPI的操作,圖1所示 為AT89C2051單片機(jī)與串行EEPROM 93C46的硬件 連接圖,其中,P1.0模擬SPI主設(shè)備的數(shù)據(jù)輸出端 SDO,P1.2模擬SPI的時(shí)鐘輸出端SCK,P1.3模擬 SPI的從機(jī)選擇端SCS,P1.1模擬SPI的數(shù)據(jù)輸入 SDI。
          上電復(fù)位后首先先將P1.2(SCK)的初始狀態(tài)設(shè)置為0(空閑狀態(tài))。
          讀操作:AT89C2051首先通過P1.0口發(fā)送1位起始位(1),2位操作碼(10),6位被讀的數(shù)據(jù)地址(A5A4A3A2A1A0),然后通過P1.1口讀1位空位(0),之后再讀l6位數(shù)據(jù)(高位在前)。
          寫操作:AT89C2051首先通過P1.0口發(fā)送1位起始位(1),2位操作碼(01),6位被寫的數(shù)據(jù)地址(A5A4A3A2A1A0),之后通過P1.0口發(fā)送被寫的l6位數(shù)據(jù)(高位在前),寫操作之前要發(fā)送寫允許命令,寫之后要發(fā)送寫禁止命令。
          寫允許操作(WEN)):寫操作首先發(fā)送1位起始位(1),2位操作碼(00),6位數(shù)據(jù)(11XXXX)。
          寫禁止操作(WDS)):寫操作首先發(fā)送1位起始位(1),2位操作碼(00),6位數(shù)據(jù)(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. }
          對于不同的串行接口外圍芯片,它們的時(shí)鐘時(shí)序是不同的。上述子程序是針對在SCK的上升沿輸入(接收)數(shù)據(jù)和在下降沿輸出(發(fā)送)數(shù)據(jù)的器件。這些子程序也適用于在串行時(shí)鐘)的上升沿輸入和下降沿輸出的其它各種串行外圍接口芯片,只要在程序中改變P1.2(SCK)的輸出電平順序進(jìn)行相應(yīng)調(diào)整即可。



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();