lusson 发表于 2011-9-21 20:30:25

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

内核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一起产生的,而且只产生一次。。
有谁做过这个
因为这段时间一直在忙其他事情,没有太多精力在这方面,郁闷啊!。。。

akin 发表于 2011-9-21 20:34:39

波特率不高的话,整个自动换向的电路就行了,还省个光耦。

lusson 发表于 2011-9-21 20:40:52

不考虑投机取巧的方式啊。。

quzegang 发表于 2011-9-21 20:49:54

以前弄过9200的,明天去看下代码再发上来。不过最好还是用片子自带的RTS脚,自己使能会有些问题。

lusson 发表于 2011-9-21 21:02:04

好,先谢过了
硬件还要改,如果的确会有问题就改成硬件使能形式。。

quzegang 发表于 2011-9-22 11:25:40

点击此处下载 ourdev_678544QXS509.rar(文件大小:9K) (原文件名:at91_serial.rar)

quzegang 发表于 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脚来控制好

lusson 发表于 2011-9-22 20:04:48

这样啊,还需要软件延时啊,那我还是叫硬件的改一下吧。谢了

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

lusson 发表于 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模式即可
页: [1]
查看完整版本: linux下485软件使能IO发送求助,AT91SAM9260