搜索
bottom↓
回复: 9

linux下485软件使能IO发送求助,AT91SAM9260

[复制链接]

出0入54汤圆

发表于 2011-9-21 20:30:25 | 显示全部楼层 |阅读模式
内核linux2.6.30
因为串口的RTS用做其他用了,所以只能用软件控制IO的方法来使能485发送了。
看了AT91SAM9260的资料,应该是TXEMPTY表示发送完成,可是在内核的代码中并没有使能该中断,只有TXBUFE和ENDTX中断,发送是使用DMA方式的
TXBUFE和ENDTX只是表示DMA发送计数为0,但此时还有数据在串口移位寄存器以及发送寄存器中,如果这时候拉高的话会丢失二个字节。。

看了二天代码,没整明白啊。
启动发送是该函数
static void atmel_start_tx(struct uart_port *port)
{
        if (atmel_use_dma_tx(port)) {
                if (UART_GET_PTSR(port) & ATMEL_PDC_TXTEN)
                        /* The transmitter is already running.  Yes, we
                           really need this.*/
                        return;

                UART_PUT_IER(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE);
                /* re-enable PDC transmit */
                UART_PUT_PTCR(port, ATMEL_PDC_TXTEN);
        } else
                UART_PUT_IER(port, ATMEL_US_TXRDY);
}
当检测到DMA已经启动时,直接返回,否则启动发送。但我发现在数据未发出去时就会先产生中断,我在该位置加上TXEMPTY中断,可以产生TXEMPTY中断,但是和TXEND和TXBUFE一起产生的,而且只产生一次。。
有谁做过这个
因为这段时间一直在忙其他事情,没有太多精力在这方面,郁闷啊!。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-9-21 20:34:39 | 显示全部楼层
波特率不高的话,整个自动换向的电路就行了,还省个光耦。

出0入54汤圆

 楼主| 发表于 2011-9-21 20:40:52 | 显示全部楼层
不考虑投机取巧的方式啊。。

出0入0汤圆

发表于 2011-9-21 20:49:54 | 显示全部楼层
以前弄过9200的,明天去看下代码再发上来。不过最好还是用片子自带的RTS脚,自己使能会有些问题。

出0入54汤圆

 楼主| 发表于 2011-9-21 21:02:04 | 显示全部楼层
好,先谢过了
硬件还要改,如果的确会有问题就改成硬件使能形式。。

出0入0汤圆

发表于 2011-9-22 11:25:40 | 显示全部楼层
点击此处下载 ourdev_678544QXS509.rar(文件大小:9K) (原文件名:at91_serial.rar)

出0入0汤圆

发表于 2011-9-22 11:29:05 | 显示全部楼层
上面是我以前做的AT91RM9200的485驱动,支持PDC模式,其中AT91C_VA_BASE_US0,这个口子是用普通IO口模式来控制接受与发送的,有一点要注意:
static void at91_stop_tx(struct uart_port *port, u_int from_tty)
{
        struct at91_uart_port *at91_port = (struct at91_uart_port *)port;
       
        /****RTS0 is not connect,Just use for RS485 Mode ******/
        if (port->mapbase == AT91C_VA_BASE_US0)
        {
                /*waiting for tx over*/
                udelay(2000);
                udelay(2000);
        AT91_SYS->PIOA_CODR = AT91C_PA21_RTS0;
        }

       
        if(at91_port->use_dma_tx) {
                UART_PUT_PTCR(port,AT91C_PDC_TXTDIS);
                UART_PUT_IDR (port,AT91C_US_ENDTX | AT91C_US_TXBUFE);
                port->read_status_mask &= ~( AT91C_US_ENDTX | AT91C_US_TXBUFE);
        }
        else {
                UART_PUT_IDR(port, AT91C_US_TXRDY);
                port->read_status_mask &= ~AT91C_US_TXRDY;
        }
}
此函数中的延时部分是必须要的,要等待数据传输完毕,再启动接受模式,否则数据发送不完,对于不同波特率时间不好控制,所以没有用自带的RTS脚来控制好

出0入54汤圆

 楼主| 发表于 2011-9-22 20:04:48 | 显示全部楼层
这样啊,还需要软件延时啊,那我还是叫硬件的改一下吧。谢了

我其实也看到DMA的ENDTX和TXBUFE中断,但这时候还有2个字节正在发送中。。。

出0入54汤圆

 楼主| 发表于 2011-9-23 16:08:49 | 显示全部楼层
使用硬件方式可以了,RTS发送时是高电平。在注_册UART设置时需要设置RTS使能。
另外我的系统是linux2.6.30   at91sam9260
在termios.h->termbits.h中并没有设置485模式的选项,只有正常模式和硬件流模式设定,需要更改几个地方
1.在源码树目录下arch/arm/match-at91/include/asm/termbits.h增加RS485选项,添加在CRTSCTS下面即行
2.在drivers/serial/atmel_serial.c的set_termios中对于模式的设置需要增加该选项
重新编绎内核
3.在交叉编绎目录下的arm/usr/include/bits/termios.h增加RS485选项,设置掩码值需要跟前面相同,这样在设置c_cflag时设置成485模式即可
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 17:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表