龍順宇,王連明,趙廣宇,胥勛偉
(1.海南熱帶海洋學院 海洋信息工程學院,海南三亞,572022;2.成都為開微電子有限公司,四川成都,610093)
針對串口擴展的實際需求,各集成電路廠商推出了多種專用芯片[1],市面上常見的串口擴展芯片就有CH438Q、GM812x 系列、ST16C554D、SP2538 等[2~4]。此類芯片通常只支持一種主接口類型[5],各自的功能差異較大[6],有的不能支持寬電壓供電[7],有的不支持子串口參數的差異化配置[8~9],有的不具備RS485 自動收發控制[10],有的不支持自動流量控制,還有的讀寫過程僅支持小數據量的寄存器方式,不支持連續數據量的FIFO 方式[11~12],故而設計人員在芯片選型時會產生困擾。本文選用WK2168 芯片設計的串口擴展器就可以對接這些需求,支持多種主接口類型,可按需應用于不同的設計場景之中。
因為WK2168 芯片支持4 種模式的主接口[13],故而在對接實際主控制器時應事先確定接口類型,用戶可通過擴展器的MD0 和MD1 引腳進行模式選擇[14],改變這兩個引腳上的電平組合即可調整接口引腳的復用功能,最終改變芯片內部主接口的轉換邏輯,本文設計的串口擴展器組成框架如圖1 所示。

圖1 WK2168 串口擴展器組成框架圖
圖中虛線框內部分即為WK2168芯片的內部組成單元,主接口轉換邏輯單元負責解析來自外部設備主控制器下達的命令,在內部總線的連接下將數據、地址及控制信號傳送至各單元,每個子通道串口都具備一套獨立的寄存器,包含了收發FIFO 暫存器、收發流量控制寄存器、波特率發生器和收發移位寄存器,這些寄存器和端口電路的工作狀態及配置都受控于子通道控制寄存器。若子串口內部產生特定事件,將觸發中斷請求(實際表現為IRQ 引腳上的電平變化),外部設備主控制器可響應中斷執行特定動作。擴展得到的TX1 至TX4 為串行數據發送引腳,RX1 至RX4 為串行數據接收引腳,RTS1 至RTS4 為請求發送信號引腳,CTS1 至CTS4 為清除發送信號引腳。
串口擴展器的電路原理如圖2 所示,U1 即為WK2168芯片,芯片32 腳MD0 和33 腳MD1 的4 種電平組合決定了MP0至MP3引腳的具體功能。若MD0、MD1取值為“00”,則MP0 至MP3 用作SPI 接口;取值為“01”則用作I2C 接口,取值為“10”則用作8 位并口總線接口,取值為“11”則用作UART 接口。根據芯片數據手冊可知,MD0 和MD1引腳內建了上拉電路,懸空時默認為“11”狀態,MP0 至MP3 引腳則需要外加上拉電阻。

圖2 WK2168 核心電路原理圖
DAT0 至DAT7 為并口數據總線引腳,若主接口不用做并口時可將其當作GPIO 使用。D1 和R10 構成了供電指示電路,系統供電支持2.5V~5.0V 寬電壓范圍,C2 和C3 為電源進行濾波和去耦(在PCB 布局時應盡量靠近電源類引腳),R11 為中斷引腳IRQ 的外部上拉電阻(以確保IRQ引腳在未產生中斷信號時保持為高電平狀態)。
R12和C5為WK2168提供上電復位信號(低電平有效)。R5、Y1、C1 和C4 構成了外部石英晶體振蕩電路(在PCB布局時應盡量靠近時鐘引腳,若有地網絡的覆銅層還應增加過孔減少寄生參數影響)。
WK2168 芯片擴展的4 路子串口均遵循正邏輯TTL/COMS 電平標準,若需要將其對接DB9 接口的外部設備則需要添加額外的電平轉換單元,將TTL/COMS 電平標準適配到RS232 標準(可基于MAX3232 芯片搭建相關電路單元)。
除此之外,實際場景中還有很多傳感器設備、執行器設備是RS485 接口,對接此類接口時可以添加RS485 收發電路(可基于MAX3485 芯片搭建相關電路單元),合理利用子串口的RTS 引腳實現RS485 電路的自動收發功能。RTS引腳的默認電平狀態可通過程序配置,當啟動數據發送時,RTS 引腳控制RS485 收發器芯片的DE 和RE 引腳實現數據發送,啟動數據接收時,RTS 就會反向控制RS485 收發器芯片進入接收模式。值得一提的是WK2168 芯片的每個子串口通道都支持9 位網絡地址的自動識別,每個子串口都有一個唯一地址,還具備網絡地址寄存器和網絡地址使能控制位,所以比較適用于工業/自動化現場RS485 總線下的控制場景。
硬件搭建完畢后即可選定一種主接口形式進行程序編寫,以測試擴展器數據的收發功能。
若選擇8 位并口作為主接口,則需先將主接口模式配置引腳MD0 和MD1取值為“10”,此時MP0 用作數據地址AD 選擇引腳,MP1 用作讀信號RD控制引腳,MP2 用作寫信號WR 控制引腳,MP3 用作片選CS 控制引腳,DAT0至DAT7 為8 位數據總線,將其連到主控制器的一組I/O 端口即可,操作時序上兼容傳統的MCS-51 單片機并行讀寫時序(P0 端口組做數據總線,P3.6/P3.7 為讀寫控制線)。
若選擇三線異步UART作為主接口,則需先將主接口模式配置引腳MD0 和MD1 取值為“11”,此時MP0 和MP3 引腳不用,MP1 用作主接口串行數據發送MTX 引腳,MP2 用作主接口串行數據接收MRX 引腳,操作時序上與WK21xx 系列芯片中的WK2114 芯片一致[15]。
若選擇四線SPI 作為主接口,則需先將主接口模式配置引腳MD0 和MD1 取值為“00”,此時MP0 用作主設備輸入/從設備輸出MISO 引腳,MP1 用作主設備輸出/從設備輸入MOSI 引腳,MP2 用SPI 串行時鐘SCLK 引腳,MP3用作SPI 片選SSEL 引腳,操作時序上與WK21xx 系列芯片中的WK2124 芯片一致[16]。
若選擇兩線I2C 作為主接口,則需先將主接口模式配置引腳MD0 和MD1 取值為“01”,此時MP0 用作串行數據SDA 引腳,MP1 用作I2C 器件低位地址IA0 引腳,MP2 用串行時鐘SCL 引腳,MP3 用作I2C 器件高位地址IA1 引腳,操作上與標準的I2C 時序類似。
主控制器可操作WK2168 芯片內部寄存器或FIFO 暫存器去控制子串口實現數據收發。本文以I2C 主接口為例,通過I2C 主接口寫FIFO 暫存器的操作時序如圖3 所示。

圖3 I2C 接口寫數據到FIFO 時序
在寫入時序中,當串行時鐘SCL 線路為高,串行數據SDA 線路出現下降沿時便產生了I2C 通信時序的起始信號START。此時主控制器需要向擴展器寫入一個命令字節Command(具體取值等于I2C 從機地址、子串口通道號和“0x22”三者進行按位或運算的結果),明確本次操作為寫入FIFO,隨后寫入FIFO 寄存器地址,最后寫入數據內容,數據字節寄存器的地址會隨著寫入字節數量而自增,且每次寫入操作后都會收到來自擴展器的從機應答ACK 信號,寫入數據完畢后再由主控制器產生終止信號STOP 即可(即在串行時鐘SCL 線路為高時,讓串行數據SDA 線路出現上升沿)。
編程時可用C51 語言將該時序進行描述,將具體操作封裝為WK2XXX_Write_FIFO(u8 num,u8 count,u8 *fifo_buff)函數,形參“num”為子串口通道號,形參“count”為欲寫入的字節數量,形參“*fifo_buff”指針用于指向寫入數組首地址,具體的源碼實現如下:
在寫時序的命令字節中,C1 和C0 位代表子串口的通道號,A0 至A3 位表示子串口寄存器的地址。因為主接口選定了I2C,所以P0 和P1 就代表擴展器的從機地址,具體的取值由MP1 和MP3 引腳上的電平決定,時序中的ACK是來自從機的應答信號。與寫時序類似,通過I2C 主接口從FIFO 暫存器中讀取數據的操作時序如圖4 所示。

圖4 I2C 接口從FIF O 讀數據時序
讀取數據與寫時序類似,先由主控制器在I2C 總線上產生起始信號START,然后向擴展器寫入一個命令字節Command(具體取值等于I2C 從機地址、子串口通道號和“0x23”三者進行按位或運算的結果),明確本次操作為讀取FIFO,如果收到了來自擴展器的ACK 應答,則可以連續讀取n 個字節,在讀取過程中FIFO 寄存器的地址會自動增加,若主控制器不再需要讀取數據,只需發送一個主機無應答NACK 信號到SDA 線路上,接著產生終止信號STOP即可。
編程時可用C51 語言將該時序進行描述,將具體操作封裝為WK2XXX_Read_FIFO(u8 num,u8 count,u8 *fifo_buff)函數,形參“num”為子串口通道號,形參“count”為欲讀取的字節數量,形參“*fifo_buff”指針用于指向接收數組首地址。
實現FIFO 暫存器的讀寫操作之后就可以測試各路子串口的收發功能,可在程序主函數內初始化相關引腳模式,隨后配置子串口波特率、數據幀格式,使能子串口通信功能,然后進入FIFO 收發測試,可以向外輸出預設字符串信息,也可以建立多個數組,實現子串口自收自發功能。
按照硬件電路設計并制作的串口擴展器實物如圖5(a)所示,擴展器具備主接口和功能接口,擴展器板載了WK2168 核心和電平轉換電路,若撥動開關打到“R”一側則說明該路子串口遵循RS232 電平標準,打到“T”一側則說明該路子串口遵循TTL/CMOS 電平標準,用戶還可以在子串口后級連接RS485 轉換電路或者其他通信轉換單元以適配更多的場景需求。

圖5 WK2168 擴展器實物與測試圖
擴展器選定主接口后可連接到主控制器,在程序控制下即可進行數據收發測試,實際測試過程如圖5(b)所示,用USB 轉串口單元連接擴展器實物的某個子串口通道,然后做自收自發測試,實際發送“WK2168 CH1 TX-RX Test!”字符串,在啟用時間戳功能后看到了返回的字符串與發送一致,由此驗證了擴展器功能正常。
本文設計的串口擴展器支持4 種類型的主接口輸入,兼容了市面上大部分串口擴展專用芯片的主接口類型,所能適配的應用場景較為豐富。擴展器支持2.5V~5V 寬電壓范圍供電,能夠較好地對接常規低壓微控制器系統。可按需連接各類串口傳感器、串口屏、執行器、通信模塊或單元板卡,適合作為積木模塊嵌入到實際系統應用中。
所擴展的4 路子串口支持差異化參數配置,數據收發方式和工作模式多樣,靈活性較好。但在具體應用時還需妥善處理FIFO 計數器狀態、FIFO 觸點配置、中斷控制、超時處理、數據流控制、網絡號識別等環節。綜上所述,該款串口擴展器具備一定的實用價值,可結合實際需求進行運用。