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一起产生的,而且只产生一次。。
有谁做过这个
因为这段时间一直在忙其他事情,没有太多精力在这方面,郁闷啊!。。。 波特率不高的话,整个自动换向的电路就行了,还省个光耦。 不考虑投机取巧的方式啊。。 以前弄过9200的,明天去看下代码再发上来。不过最好还是用片子自带的RTS脚,自己使能会有些问题。 好,先谢过了
硬件还要改,如果的确会有问题就改成硬件使能形式。。 点击此处下载 ourdev_678544QXS509.rar(文件大小:9K) (原文件名:at91_serial.rar) 上面是我以前做的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脚来控制好 这样啊,还需要软件延时啊,那我还是叫硬件的改一下吧。谢了
我其实也看到DMA的ENDTX和TXBUFE中断,但这时候还有2个字节正在发送中。。。 使用硬件方式可以了,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]