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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 實現單片機與FPGA的雙向并口通信

          實現單片機與FPGA的雙向并口通信

          作者: 時間:2016-11-26 來源:網絡 收藏
          現在一般流行的做法都是用串行通信的,那樣能夠節(jié)省I/O口的。但是有的時候在端口不緊缺的時候可以考慮用并行的方法來進行設置。

          這個暑假我在進行電子競賽的培訓,對于這個問題找到了一些相關的資料,可以提供一些幫助。

          本文引用地址:http://www.ex-cimer.com/article/201611/321958.htm

          如果是這方面的高手的話,其實會發(fā)現這個原理很簡單,只要理解一些I/O口的設置就能完成了。但是如果對于單片機或者FPGA的I/O口的電路不理解的話可能就會走許多的歪路了。

          閑話少說,進入正題。

          首先,還是要理解所謂的推挽輸出與漏極輸出兩者的區(qū)別。先說說漏極開路(OD),它與集電極開路(OC)是一致的,就是把下圖的三極管改成CMOS管就是了。

          集電極開路(OC)輸出的結構如圖1所示,右邊的那個三極管集電極什么都不接,所以叫做集電極開路(左邊的三極管為反相之用,使輸入為“0”時,輸出也為“0”)。對于圖1,當左端的輸入為“0”時,前面的三極管截止(即集電極C跟發(fā)射極E之間相當于斷開),所以5V電源通過1K電阻加到右邊的三極管上,右邊的三極管導通(即相當于一個開關閉合);當左端的輸入為“1”時,前面的三極管導通,而后面的三極管截止(相當于開關斷開)。

          為了方便理解,我們把上面的圖1改寫成圖2的樣子。

          圖2中的開關受軟件控制,“1”時斷開,“0”時閉合。很明顯可以看出,當開關閉合時,輸出直接接地,所以輸出電平為0。而當開關斷開時,則輸出端懸空了,即高阻態(tài)。這時電平狀態(tài)未知,如果后面一個電阻負載(即使很輕的負載)到地,那么輸出端的電平就被這個負載拉到低電平了,所以這個電路是不能輸出高電平的。也就是說這個輸出端的電平是受負載的影響的。這樣是很不穩(wěn)定的,要避免這種情況。最多的就是使用上拉電阻。

          再看圖三。圖三中那個1K的電阻即是上拉電阻。如果開關閉合,則有電流從1K電阻及開關上流過,但由于開關閉和時電阻為0(方便我們的討論,實際情況中開關電阻不為0,另外對于三極管還存在飽和壓降),所以在開關上的電壓為0,即輸出電平為0。如果開關斷開,則由于開關電阻為無窮大(同上,不考慮實際中的漏電流),所以流過的電流為0,因此在1K電阻上的壓降也為0,所以輸出端的電壓就是5V了,這樣就能輸出高電平了。但是這個輸出的內阻是比較大的(即1KΩ),如果接一個電阻為R的負載,通過分壓計算,就可以算得最后的輸出電壓為5*R/(R+1000)伏,即5/(1+1000/R)伏。所以,如果要達到一定的電壓的話,R就不能太小。如果R真的太小,而導致輸出電壓不夠的話,那我們只有通過減小那個1K的上拉電阻來增加驅動能力(所謂的驅動力,往往與電流有關的)。但是,上拉電阻又不能取得太小,因為當開關閉合時,將產生電流,由于開關能流過的電流是有限的,因此限制了上拉電阻的取值,另外還需要考慮到,當輸出低電平時,負載可能還會給提供一部分電流從開關流過,因此要綜合這些電流考慮來選擇合適的上拉電阻。

          P.S:說到OC門的話,大家都能想到三態(tài)門,那么就不得不提起它的“線與”功能了,這個功能是很方便的。操作上面也很簡單。如下附圖:

          另一種輸出結構是推挽輸出。推挽輸出的結構就是把上面的上拉電阻也換成一個開關,當要輸出高電平時,上面的開關通,下面的開關斷;而要輸出低電平時,則剛好相反。比起OC或者OD來說,這樣的推挽結構高、低電平驅動能力都很強。如果兩個輸出不同電平的輸出口接在一起的話,就會產生很大的電流,有可能將輸出口燒壞。而上面說的OC或OD輸出則不會有這樣的情況,因為上拉電阻提供的電流比較小。如果是推挽輸出的要設置為高阻態(tài)時,則兩個開關必須同時斷開(或者在輸出口上使用一個傳輸門),這樣可作為輸入狀態(tài),有些單片機的一些IO口就是這種結構。

          總結:從上面也可以知道了,I/0輸出有兩種方式。那么現在的難點就是如何讓I/0口輸入數據。其實上面已經講過了,就是只需要把輸出設置為高阻狀態(tài)就可以了。那么有些新人就會問了,都設成高阻狀態(tài)了,數據還怎么輸入啊?這其實是一個誤區(qū),其根本是沒有理解I/O口的結構。

          如果我們將一個讀數據用的輸入端接在輸出端(這就是上面疑惑的答案了),這樣就是一個IO口了(51的IO口就是這樣的結構,其中P0口內部不帶上拉,而其它三個口帶內部上拉),如圖4所示。當我們要使用輸入功能時,只要將輸出口設置為1即可,也就是要把下面的z=1,這樣就相當于那個開關斷開,而對于P0口來說,就是高阻態(tài)了。

          到現在為止,已經把輸入輸出端口原理已經講明了了。如果理解了上面所講的,那么寫程序也就是的把對應的端口進行設置就OK了,比較簡單的。如果不明白,可以問我,QQ或者郵件都可以,最后我會留下聯系方式的。


          上一頁 1 2 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁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); })();