英創(chuàng)EM9x60系列工控主板均板載高速全雙工物理串口,其中除了ttyS3引出方式為232電平以外,其余串口均以TTL電平引出,客戶可以在應(yīng)用底板上將這些串口擴(kuò)展為標(biāo)準(zhǔn)RS232或RS485串口使用,也可以連接自己的串口外設(shè)。
EM9x60的TTL串口除了ttyS1以外,都是三線串口,提供RXD、TXD、GND這3路信號(hào)。為了提高電路的抗干擾能力,實(shí)際RS485串口應(yīng)用中,客戶可能需要使用GRTS#硬件方向控制。英創(chuàng)為此提供的方案是:使用板載GPIO作為RTS#信號(hào)線,并在內(nèi)核串口驅(qū)動(dòng)中增加相關(guān)的控制操作,客戶只需在使用串口之前使能RTS#功能,就可以啟動(dòng)RTS#硬件方向控制功能。
EM9x60支持這一功能的有ttyS3、ttyS4、ttyS5、ttyS6這4路串口,相應(yīng)的用于模擬RTS#信號(hào)線的GPIO為GPIO6、GPIO8、GPIO9、GPIO10,具體對(duì)應(yīng)關(guān)系如下:
串口名稱 | RTS#使用的GPIO |
ttyS3 | GPIO6 |
ttyS4 | GPIO8 |
ttyS5 | GPIO9 |
ttyS6 | GPIO10 |
須注意的是,上述4路GPIO一旦被用作RTS#信號(hào)線,則無法同時(shí)作為GPIO使用。
要使用這一功能,在應(yīng)用底板制作的時(shí)候,除了引出TXD、RXD,并將串口信號(hào)轉(zhuǎn)換為差分信號(hào)以外,還需要進(jìn)行一些電路擴(kuò)展,如下圖。
從圖中可以看出,方向控制信號(hào)COM2_RTSn(即RTS#信號(hào))是低電平有效的,有效時(shí)(低電平)串口處于發(fā)送狀態(tài),無效時(shí)(高電平)處于接收狀態(tài)。 用戶需要特別注意RTS#信號(hào)是低電平有效的控制信號(hào),這是因?yàn)椋海?)在主板上電復(fù)位時(shí),所有管腳均處于帶上拉的輸入狀態(tài),這時(shí)管腳的電平為高。采用低電平輸出有效,防止了在上電復(fù)位過程中,RS485總線被無效信號(hào)干擾的問題;(2)若由于某種原因RTS#信號(hào)與RS485驅(qū)動(dòng)斷開,因?yàn)閼铱展苣_在數(shù)字電路中是作高電平狀態(tài)的,因此也避免了電路內(nèi)部的故障影響RS485總線的情況發(fā)生。
EM9x60內(nèi)核中已經(jīng)增加了RTS#控制部分,在串口測(cè)試?yán)讨幸苍黾恿讼鄳?yīng)結(jié)構(gòu)定義和函數(shù)如下:
#define EM9x60_RTS_CONTROL_TOGGLE (1 << 15)
int enable_rts_toggle(pport_info p_info)
{
struct termios cur_opt;
int status;
tcgetattr(p_info->port_fd,&cur_opt);
// 修改模式,進(jìn)入rts toggle操作
cur_opt.c_cflag |= EM9x60_RTS_CONTROL_TOGGLE;
status = tcsetattr(p_info->port_fd,TCSANOW,&cur_opt);
if(status != 0)
{
perror('Cannot set the serial port parameters');
return -1;
}
return status;
}
在提供的應(yīng)用例程step2_serialtest中,可在初始化串口函數(shù)OpenPort()中加上使能RTS的代碼,如:
// 使能 RTS
if( enable_rts_toggle( &info )!=0 )
{
printf( 'enable rts toggle fail\n');
}
之后對(duì)于串口的讀寫操作和標(biāo)準(zhǔn)的RS232串口操作完全一致。
由于RTS#的控制由驅(qū)動(dòng)程序自動(dòng)進(jìn)行,因此無論是否打開這一功能,客戶的應(yīng)用程序開發(fā)是完全一樣的,可參考英創(chuàng)光盤的Step2_SerialTest進(jìn)行開發(fā)。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35415
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論