天天看點

STM32與RS232的序列槽通信失敗了

今天在驗證RS232與STM32的序列槽通訊。闆子上引出了TX/RX兩個腳,與RS232的RX/TX對接,序列槽通訊失敗!

 開始以為是順序的問題,反複檢查了順序,确認沒有問題,後來查閱了一些資料,發現問題的原因可能是STM32的TX/RX用的是TTL電平,RS232則用的是EIA電平,用正負電壓來表示邏輯狀态,這兩個接口直接連是不能正常通訊的。

EIA RS-232C 與TTL轉換:EIA RS-232C 是用正負電壓來表示邏輯狀态,與TTL以高低電平表示邏輯狀态的規定不同。是以,為了能夠同計算機接口或終端的TTL器件連接配接,必須在EIA RS-232C 與TTL電路之間進行電平和邏輯關系的變換。實作這種變換的方法可用分立元件,也可用內建電路晶片。目前較為廣泛地使用內建電路轉換器件,如MC1488、SN75150晶片可完成TTL電平到EIA電平的轉換,而MC1489、SN75154可實作EIA電平到TTL電平的轉換。MAX232晶片可完成TTL←→EIA雙向電平轉換。

解決方案如下:

簡單的RS232C/TTL電平轉換和序列槽取電
STM32與RS232的序列槽通信失敗了
作者:溫正偉 原載:無線電雜志

  在許多單片機的應用中都會使用到串行口與電腦的串行口相連接配接,進行資料的傳輸或控制指令的發送與接收。單片機的序列槽有很大一部分是使用TTL電平标準的(PIC的可以直接連接配接在電腦序列槽),它的邏輯1電平是5V,邏輯0電平是0V,而電腦串行口所使用的是RS232C的電平标準,它的邏輯1電平是-3V--12V,邏輯0電平是+3V-+12V。兩者的電平範圍相差很遠,是以連接配接時需要用到電平轉換電路。這樣電路有好多種,一般來說商業化的成品會用到MAX232,DS275等專用的RS232、TTL電平轉換內建電路,對于普通電子愛好者來說使用這樣的器件一來不太好購買,二來使制作的費用提高,那用什麼樣的電路去代替它們呢?這也是我初初制作單片機結合電腦的應用中所遇到的問題之一,後來找到了一些相關的電路資料,解決了這些問題。以下我就結合自己在實際設計應用的經驗來介紹一下這些電路資料,同時也介紹一些自己對序列槽取電電路設計應用的經驗。

STM32與RS232的序列槽通信失敗了
圖1:NPN和PNP組成的RS232電平轉換電路(點選放大)

  圖一是使用小功率三極管搭建的電平轉換電路,分别用了一個NPN管和PNP管,NPN可以使用常用的9014或BC547,PNP則可以使用常用的9012或BC557。電路分為傳送和接收兩部分,圖一中已用虛線分開了。它們可以分開使用也可以合在一起使用。傳送電路使用PNP管。當單片機的TxD信号是邏輯高電平時,Q1截止,RS232C的TxD(PIN3)提供-9V左右(實際電壓根據電腦主機闆上使用的串行接口晶片有所不同)給RS232C的RxD(PIN2)。當單片機TxD信号變為邏輯低電平時,Q1導通,約+5V傳給了RS232C的RxD(PIN2)。用這種辦法傳送資料時,RS232C的TxD(PIN3)必須穩定在-9V左右 。

  虛線以下的接收電路,它把RS232C電平轉換成TTL邏輯電平。當PC發送資料給RS232C的TxD(PIN3)時,邏輯1電平時是-9V,Q2截止,此時單片機的RxD約為+5V。當RS232C的TxD為邏輯低電平是+9V,Q2導通,單片機RxD此時約為0V。

  圖一的電路我在自己的單片機應用中也經常用它來代替MAX232,DS275這樣的晶片,它不單可以單獨使用傳送或接收部份,在部分要求雙向傳輸的項目中也可以很好的工作。我通常是使用9600波特率的,但實際也可以工作中更高一點的波特率。也可以把它焊到一個小的8腳IC插座或PCB上直接代換DS275(DS275引腳功能說明請看圖二)。

STM32與RS232的序列槽通信失敗了
圖2:DS275引腳圖
STM32與RS232的序列槽通信失敗了
圖3:兩個NPN組成的RS232電平轉換電路(點選放大)

  圖三是另一種RS232/TTL電平轉換電路,對于接收電路,它是和圖一的電路是一樣的。該電路用2個NPN小功率半導體,轉送電路不需要從RS232C的TxD引用負的電壓,而這樣做的話,當單片機TxD為高電平時RS232C的RxD為0V(不是如圖一的-9V左右),為低電平時RS232C的RxD為+5V,顯然這和RS232C的标準不同,但多數PC機序列槽可以接受這樣的電平範圍。這個電路可以像圖一那樣用來代換直接代換DS275晶片。

  這兩個電路中的半導體可以使用大部分常用的小功率半導體去替換,我自己常用9012,9014,BC547,BC557,它們都可以很好的工作。要注意的是它們所産生的電平範圍不是标準的RS232電平,是以也不能達到RS232的标稱傳輸距離。

  在一些小的應用中通常隻要用到一塊2051或PIC晶片和少許的小元件,它們的耗電量是很小的,一般有十幾毫安就足夠了。在我自己的PC遙控器項目中用到一塊AT89C2051,一個一體化紅外接收頭和一個小LED,少許阻容器件和上面所說到的電路的傳送部分,總的耗電量隻有十毫安多點。我用圖四的電路從PC序列槽直接竊電,效果很好,可以提供5V,二十多毫安的電流。也可以用圖五的電路。但要注意的是這兩種電路都要求上位軟體使序列槽的7和4引腳變為高電平才可以正常取電,否則無法從序列槽竊取所需的電壓。

STM32與RS232的序列槽通信失敗了
圖4:簡單實用的序列槽竊電電路(點選放大)
STM32與RS232的序列槽通信失敗了
圖5:用到7805的序列槽取電電路

繼續閱讀