linux串口驱动支持485,修改2410的linux串口驅動,使其支持RS485

2410自帶有三個串口,但mizi linux中自帶的驅動均為RS232的,因為485是半雙工的,比232多了一個方向控制信號,所以linux的自帶驅動並不適合485,需要進行一定的修改,步驟如下。

1. 首先硬件方面肯定要改動,假設我們要改的串口為串口2,電路原理圖如下:

有圖可知,485與232相比多了一個方向控制信號nRTS0,當其為低電平時,MAX485處於接收狀態,反正為發送狀態。因此我們在修改驅動時主要就是要讓串口2發送時,nRTS0必須為低電平,接收時必須為高電平。

2. 我們要修改的linux串口驅動主要為driver/serial/serial_s3c2410.c文件. 涉及到的函數主要有s3c2410uart_startup,s3c2410uart_start_tx和s3c2410uart_stop_tx,他們的作用分別為啟動串口,開始串口接收,停止串口接收。

3.首先修改s3c2410uart_startup函數,在其初始化的最后即return 0之前添加如下代碼:

if( port!=&s3c2410_ports[2] ) { //如果初始化的是串口2

GPHCON = (GPHCON&0xfffffff3)+0x04; //將GPH1,即nRTS0設為輸出功能

GPHDAT &= 0xfffd; //將nRTS0設為低電平,使串口啟動時處於接收數據狀態。

}

4. 修改s3c2410uart_start_tx,在enable_irq語句前添加如下代碼:

if( port!=&s3c2410_ports[2] ) { //如果啟動發送的是的是串口2

GPHCON = (GPHCON&0xfffffff3)+0x04; //將GPH1,即nRTS0設為輸出功能

GPHDAT = 0x02; //將nRTS0設為高電平,使串口進入發送數據狀態。

}

5.修改s3c2410uart_stop_tx,在disable_irq語句前添加如下代碼:

if( port!=&s3c2410_ports[2] ) { //如果停止發送的是的是串口2

while( !(UART_UTRSTAT(port)&0x04) ) ; //等待串口發送完成 ,這句千萬不能少

GPHCON = (GPHCON&0xfffffff3)+0x04; //將GPH1,即nRTS0設為輸出功能

GPHDAT = 0x02; //將nRTS0設為低電平,使串口重新進入接收數據狀態。

}

其中特別需要注意的是第二行的while語句千萬不能少,否則可能導致發送的數據丟失,因為在串口沒發送完畢時就將nRTS0設為低電平會使MAX485芯片退出發送狀態,導致發送數據的丟失。

至此驅動修改完成,重新編譯內核即可。其中用於控制485發送接收狀態的信號可以是任意的空閑CPU引腳,修改原理與使用nRTS0是相同的。

6. 關於linux串口編程的文章推薦下面兩篇,注意485編程時務必將串口設為RAW MODE.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值