国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

嵌入式系統(tǒng)應(yīng)用中實(shí)現(xiàn)RS485的方向切換

發(fā)布時(shí)間:2014-12-25 10:40    發(fā)布者:designapp

        RS485接口具有良好的抗噪聲干擾性能、長傳輸距離和多站能力等特點(diǎn),使其成為工業(yè)控制的首選串行接口。嵌入式系統(tǒng)中也廣泛采用RS485接口作為設(shè)備控制的串行接口。RS485采用兩線差分的接線方式進(jìn)行串口數(shù)據(jù)的傳輸。由于發(fā)送和接收都是采用這兩根差分線進(jìn)行,因此它是半雙工工作模式。基于RS485的特點(diǎn),分別講述了通過硬件方式和軟件方式來實(shí)現(xiàn)RS485發(fā)送和接收方向的切換,重點(diǎn)解決了DM8168嵌入式平臺(tái)上軟件實(shí)現(xiàn)RS485方向切換的功能。
RS485總線是工業(yè)應(yīng)用中非常成熟的技術(shù),是現(xiàn)代通信技術(shù)的工業(yè)標(biāo)準(zhǔn)之一。RS485總線用于多站互連十分方便,用一對雙絞線即可實(shí)現(xiàn),采用平衡發(fā)送和差分接收,即在發(fā)送端驅(qū)動(dòng)器將TTL電平信號(hào)轉(zhuǎn)換成差分信號(hào)輸出,在接收端接收器將差分信號(hào)變成TTL電平,因此具有抗共模干擾的能力。根據(jù)RS485標(biāo)準(zhǔn),傳送數(shù)據(jù)速率達(dá)100 kb/s時(shí)通信距離可達(dá)1200 m。
RS485在嵌入式系統(tǒng)中的應(yīng)用非常廣泛。嵌入式系統(tǒng)可以通過RS485接口來控制終端設(shè)備。由于RS485是半雙工模式,因此發(fā)送和接收的方向切換需要我們的關(guān)注和研究。如果方向切換方式選擇不好可能會(huì)導(dǎo)致RS485驅(qū)動(dòng)能力下降、軟件執(zhí)行效率下降,甚至導(dǎo)致系統(tǒng)異常等問題。
本文分別給出硬件實(shí)現(xiàn)RS485方向切換和軟件實(shí)現(xiàn)RS485方向切換兩種方式。兩種方式各有優(yōu)點(diǎn),硬件方式控制起來比較簡單。軟件方式的驅(qū)動(dòng)能力更好,但是和嵌入式平臺(tái)關(guān)系比較密切,不同的平臺(tái)都需要調(diào)試和驗(yàn)證。
1 硬件方式控制RS485方向
圖1所示為硬件控制RS485的電路圖電路中使用2N7002LT1G MOS場效晶體管把UART_TXD_485這個(gè)MCU輸出的RS485發(fā)送信號(hào)邏輯取反后送給RS485芯片的RE/DE PIN腳。控制的原理是,當(dāng)UART_TXD_485輸出低電平時(shí)RS485芯片的DE使能;輸出高電平時(shí)RE使能。默認(rèn)情況下UART_TXD_485是高電平,RS485芯片處于接收狀態(tài)。發(fā)送數(shù)據(jù)時(shí),UART_TXD_485上面有高低電平信號(hào)變化,低電平信號(hào)通過RS485芯片SP3072EENL/TR直接輸出,高電平信號(hào)通過外部上下拉電阻來控制。
這種方法的優(yōu)點(diǎn)是控制簡單,軟件不需要做額外的工作,控制RS485像控制RS232一樣。但是這種方法的缺點(diǎn)是驅(qū)動(dòng)能力可能不足,由于這種控制方法沒有完全發(fā)揮出RS485驅(qū)動(dòng)芯片自身的驅(qū)動(dòng)能力,輸出信號(hào)依賴于外部上下拉電阻,因此在復(fù)雜環(huán)境下,譬如很多負(fù)載需要控制時(shí),就會(huì)存在驅(qū)動(dòng)能力不足的問題。但是在一些簡單的環(huán)境或者軟件實(shí)現(xiàn)較復(fù)雜的平臺(tái)下,使用這種方法還是切實(shí)可行的。


圖1 硬件控制RS485電路圖





       
2 軟件方式控制RS485方向
2.1 驅(qū)動(dòng)能力分析
在復(fù)雜的RS485控制環(huán)境下,用上面介紹的硬件方式來控制RS485的方向會(huì)存在比較突出的驅(qū)動(dòng)能力不足的問題。修改上述控制方法,將TTL這一側(cè)的2線控制改為3線控制,就是將收發(fā)控制信號(hào)不用當(dāng)前的/TXD來控制,而從主控分出一根GPIO線來控制收發(fā)。
按照輸出電流計(jì)算,3線控制方式相對用2線控制的總線上下拉作為輸出的方式,其驅(qū)動(dòng)能力提高了25~50倍(不同廠家不同型號(hào)有差異),如果輔以終端電阻靈活配置的措施,RS485的驅(qū)動(dòng)能力將完全不是問題。表1是兩種控制方式驅(qū)動(dòng)能力的對比。
2.2 軟硬件環(huán)境


圖2 軟件控制方法中的硬件設(shè)計(jì)


軟件控制方法采用圖2的硬件設(shè)計(jì),圖中很突出的修改是使用MCU的GPIO來控制RE和DE。RS485芯片的供電采用5 V供電,提高驅(qū)動(dòng)能力。RS485芯片的RE和DE控制使用MCU的GPIO輸出高低電平來控制。簡單來說就是,在RS485進(jìn)行數(shù)據(jù)傳輸時(shí),通過GPIO來控制傳輸方向。這里采用的MCU是TI公司的DM8168處理器來實(shí)現(xiàn)軟件的RS485切換功能。軟件版本使用UBoot2010.06和linux2.6.37。用軟件來實(shí)現(xiàn)RS485的收發(fā),盡量要保證執(zhí)行效率;要達(dá)到上面的目的就需要對串口驅(qū)動(dòng)進(jìn)行調(diào)試,使用串口驅(qū)動(dòng)用到的軟件資源和串口控制器本身的硬件資源來實(shí)現(xiàn)RS485的控制。


表1 軟件和硬件控制方式驅(qū)動(dòng)能力的對比


2.3 UBoot代碼修改
需要修改的文件:
① board/ti/ti8168/evm.c
② drivers/serial/ns16550.c
③ include/configs/ti8168_evm.h
ti8168_evm.h文件中增加切換宏定義:
#define CONFIG_RS485_DIR_SW 1
evm.c文件中增加切換函數(shù):
void rs485_dir_sw(int rs485_dir){
if (rs485_dir ==0)
_raw_writel(RS485_DIR_MASK, TI81XX_GPIO1_CLEARDATAOUT);
else
_raw_writel(RS485_DIR_MASK, TI81XX_GPIO1_SETDATAOUT);
}
s16550.c串口驅(qū)動(dòng)文件中增加RS485方向控制:
void NS16550_putc(NS16550_t com_port, char c){
#ifdef CONFIG_RS485_DIR_SW
rs485_dir_sw(1);
#endif
……//此處代碼省略
#ifdef CONFIG_RS485_DIR_SW
while((serial_in(&com_port->lsr) & UART_LSR_TEMT) == 0)
rs485_dir_sw(0);
#endif
}
  其中UART_LSR_TEMT表示發(fā)送BUF和移位寄存器為空。默認(rèn)情況下RS485是接收狀態(tài),一旦要發(fā)送數(shù)據(jù),就把RS485切換為發(fā)送狀態(tài)。發(fā)送完數(shù)據(jù)后,等待發(fā)送BUF和移位寄存器為空,然后切換回接收狀態(tài),這里無需使用timeout。




       
2.4 Linux代碼修改
需要修改的文件:
① arch/arm/machomap2/bordti8168evm.c
② drivers/serial/omapserial.c
③ include/linux/serial_core.h
serial_core.h文件,uart_port結(jié)構(gòu)體中增加set_rs485_direction函數(shù)指針,用于執(zhí)行RS485的方向切換void (*set_rs485_direction)(int rs485_dir);原本考慮在uart_ops結(jié)構(gòu)體中增加的,但是這個(gè)結(jié)構(gòu)體是常量類型,對它不作改動(dòng),因此加到了uart_port結(jié)構(gòu)體中。在該文件中添加相關(guān)宏定義和函數(shù)指針類型用于函數(shù)注冊:
#define SET_RS485_RX0
#define SET_RS485_TX1
typedef void (*set_rs485_direction_t)(int rs485_dir);//用于函數(shù)注冊
omapserial.c文件主要做了如下幾點(diǎn)改動(dòng):
① 添加omap_rs485_dir_fun全局的函數(shù)指針。
static set_rs485_direction_t omap_rs485_dir_fun[OMAP_MAX_HSUART_PORTS]={NULL, NULL, NULL, NULL, NULL, NULL}
② 外部驅(qū)動(dòng)利用omap_rs485_dir_fun_reg注冊函數(shù)對omap_rs485_dir_fun進(jìn)行賦值。
void omap_rs485_dir_fun_reg(int port_num, set_rs485_direction_t rs485_dir_fun){
if (port_num>=OMAP_MAX_HSUART_PORTS)
printk(KERN_ERR “%s, port_num error max is %d, but %d \\n”, __FUNCTION__, OMAP_MAX_HSUART_PORTS-1, port_num);
omap_rs485_dir_fun[port_num]= rs485_dir_fun;
}
EXPORT_SYMBOL(omap_rs485_dir_fun_reg);
③ serial_omap_probe函數(shù)中對控制程序中用到的up->port.set_rs485_direction進(jìn)行賦值。
up->port.set_rs485_direction= omap_rs485_dir_fun[pdev->id];
④ 默認(rèn)情況下RS485處于接收狀態(tài)。
⑤ serial_omap_enable_ier_thri函數(shù)中把RS485切換為發(fā)送狀態(tài)。
static incline void serial_omap_enable_ier_thri(struct uart_omap_port *up){
if (!(up->ier & UART_IER_THRI)) {
/* rs485 dir change to tx */
if (up->port.set_rs485_direction != NULL)
up->port.set_rs485_direction(SET_RS485_TX);
……//此處代碼省略
}
}
⑥ serial_omap_stop_tx函數(shù)中把RS485切換為接收狀態(tài)。
static void serial_omap_stop_tx(struct uart_omap_port *port){
……//此處代碼省略
if (up->ier & UART_IER_THRI) {
up->ier &= ~UART_IER_THRI;
serial_out(up, UART_IER, up->ier);
/* rs485 dir change to rx */
if (port->set_rs485_direction != NULL)
port->set_rs485_direction(SET_RS485_RX);
}
}
⑦ transmit_chars更改一下,原先的代碼是當(dāng)沒有更多的字符要發(fā)送(環(huán)形緩沖為空)時(shí)需要關(guān)閉發(fā)送中斷,這時(shí)串口控制器發(fā)送BUF和移位寄存器中還是有數(shù)據(jù)的,這些數(shù)據(jù)串口控制器自動(dòng)發(fā)送完成后才算結(jié)束,由于已經(jīng)關(guān)閉了發(fā)送中斷,因此發(fā)送結(jié)束后就沒有中斷產(chǎn)生了。但是RS485切換方向需要等到完全發(fā)送完成后才能進(jìn)行。因此對transmit_chars函數(shù)做了修改。調(diào)用serial_omap_stop_tx函數(shù)前判斷發(fā)送BUF和移位寄存器是否為空,如果為空就可以切換方向了。簡而言之,延后了發(fā)送中斷的關(guān)閉時(shí)間。
static void transmit_chars(struct uart_omap_port *up){
……//此處代碼省略
if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
if (up->port.ops->tx_empty(&up->port)==0)
return;//added for last transmit
serial_omap_stop_tx(&up->port);
return;
}
……//此處代碼省略
if (uart_circ_empty(xmit)) {
if (up->port.ops->tx_empty(&up->port)==0)
return;//added for last transmit
serial_omap_stop_tx(&up->port);
}
}
⑧ arch/arm/machomap2/boardti8168evm.c文件在ti8168_evm_init函數(shù)中調(diào)用omap_rs485_dir_fun_reg函數(shù)注冊RS485切換函數(shù)。



       
2.5 實(shí)驗(yàn)結(jié)果分析
上述軟件修改有如下幾個(gè)優(yōu)點(diǎn):不增加硬件開銷;不增加和使用任何硬件資源;不增加軟件開銷;不影響軟件執(zhí)行效率;硬件控制是電信號(hào)控制,方向切換和TX綁定;軟件控制是整個(gè)發(fā)送緩沖區(qū)完成發(fā)送后再進(jìn)行方向切換,控制實(shí)現(xiàn)上更加合理。
對軟件切換RS485做了基本的測試,情況如下:
① 控制臺(tái)操作。整個(gè)啟動(dòng)打印信息正常。UBoot和Kernel下控制效果和硬件控制一樣,可以很流暢地進(jìn)行命令的輸入和回顯,串口終端增加輸入字符間的延時(shí)后可以進(jìn)行配置的粘貼。內(nèi)核在115 200和38 400下分別進(jìn)行測試OK。
② 內(nèi)核下加大負(fù)責(zé)進(jìn)行大數(shù)據(jù)量的發(fā)送。增加負(fù)載,開多個(gè)ping包進(jìn)程(產(chǎn)生大量中斷)、Nand Flash的操作、CPU占有率接近100%條件下,通過RS485輸出大量數(shù)據(jù),沒有亂碼,校驗(yàn)OK。
③ 極高的實(shí)時(shí)性。
由于本文給出的軟件實(shí)現(xiàn)方式是基于Linux內(nèi)核實(shí)現(xiàn)的,因此很好地保證了方向控制的實(shí)時(shí)性。實(shí)際結(jié)果顯示,DM8168數(shù)據(jù)發(fā)送完成到產(chǎn)生方向控制信號(hào)之間的時(shí)間在25 μs左右,幾乎可以忽略不計(jì)。而有些設(shè)計(jì)在用戶空間使用應(yīng)用程序進(jìn)行方向切換的方法會(huì)導(dǎo)致20 ms以上的延時(shí),導(dǎo)致了一系列異常問題的產(chǎn)生。
結(jié)語
本文詳細(xì)描述了RS485方向控制的硬件和軟件兩種實(shí)現(xiàn)方式。兩種控制方式各有特點(diǎn),硬件控制方式實(shí)現(xiàn)簡單,不需要軟件干預(yù),對軟件而言RS485串口收發(fā)就像RS232一樣簡單。軟件控制方式可以極大地提高整個(gè)RS485線路的驅(qū)動(dòng)能力,本文給出的基于Linux內(nèi)核的控制方法又很好地保證了RS485方向切換的實(shí)時(shí)性,滿足了實(shí)用性要求。這兩種方式在很多場合已經(jīng)得到了很好的應(yīng)用和驗(yàn)證。特別是軟件實(shí)現(xiàn)方式,可以擴(kuò)展到更多的應(yīng)用場合,譬如復(fù)雜的多主、多從的RS485使用環(huán)境,軟件控制可以根據(jù)自己的需求來實(shí)現(xiàn)整個(gè)RS485線路不同的數(shù)據(jù)流向,可以規(guī)避某個(gè)設(shè)備對RS485鏈路上異常信號(hào)的干擾,給實(shí)際應(yīng)用帶來了很多的便利性。


本文地址:http://m.qingdxww.cn/thread-136658-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點(diǎn)宏來節(jié)省時(shí)間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項(xiàng)目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進(jìn)行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 男女视频在线观看免费 | 成人黄色一级毛片 | 久久视精品 | 26uuu天天夜夜综合 | 激动网色视频 | 国产有码视频 | 一区二区三区中文 | 欧美日韩一日韩一线不卡 | 国产三级日本三级美三级 | 午夜在线观看视频在线播放版 | 久久久久久久久久毛片精品美女 | 在线观看毛片视频 | 欧美成人久久久免费播放 | 日本成片免费高清 | 91久久精品国产一区二区 | 51久久| 四虎影院在线免费 | 天使萌一区二区三区免费观看 | 成人午夜在线 | 国产野花视频天堂视频免费 | 成人亚洲欧美日韩在线观看 | 日本护士69xxxxx高清hd | 野外做受三级视频 | 色狠狠一区二区三区香蕉蜜桃 | 亚洲一二三四 | 成人精品一区久久久久 | 日韩久久精品视频 | 精品视频在线观看一区二区三区 | 国产成人精品免费久久久久 | jizz99| 香蕉视频h| 欧美成人一区亚洲一区 | 青青草在视线频久久 | 91国在线国内在线播放 | 国产手机在线视频 | 精品无人区乱码在线观看 | 精品无人区乱码在线观看 | 黄色亚洲视频 | 国产 另类 在线 欧美日韩 | 久久青青国产 | 黄网站色视频免费观看 |