根据DATASHEET中的要求,把PINMUX3进行了配置,即TX和RX,并把流控屏蔽。
系统启动信息中,显示修改成功,并且TTYS0的中断号都正常,但是仍然无法读写数据,用示波器测试UART0管脚无波形,,read的perror显示 Resource temporarily unavailable。但用DSP程序测试UART0一切都正常,请高手帮帮忙,这是什么原因?
内核启动信息如下:
MUX: Setting register UART0_RXD
PINMUX3 (0x0000000c) = 0x00000000 -> 0x00020000
MUX: initialized UART0_TXD
MUX: Setting register UART0_TXD
PINMUX3 (0x0000000c) = 0x00020000 -> 0x00220000
Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
console [ttyS1] enabled
serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
DSP测试程序初始化串口如下:
uint32_t divisor;
// enable the psc and config pinmux for the given uart port.
switch ((uint32_t)uart)
{
case UART0_REG_BASE:
EVMOMAPL138_lpscTransition(PSC0, DOMAIN0, LPSC_UART0, PSC_ENABLE);
EVMOMAPL138_pinmuxConfig(PINMUX_UART0_REG, PINMUX_UART0_MASK, PINMUX_UART0_VAL);
break;
case UART1_REG_BASE:
EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_UART1, PSC_ENABLE);
EVMOMAPL138_pinmuxConfig(PINMUX_UART1_REG_0, PINMUX_UART1_MASK_0, PINMUX_UART1_VAL_0);
EVMOMAPL138_pinmuxConfig(PINMUX_UART1_REG_1, PINMUX_UART1_MASK_1, PINMUX_UART1_VAL_1);
break;
case UART2_REG_BASE:
EVMOMAPL138_lpscTransition(PSC1, DOMAIN0, LPSC_UART2, PSC_ENABLE);
EVMOMAPL138_pinmuxConfig(PINMUX_UART2_REG_0, PINMUX_UART2_MASK_0, PINMUX_UART2_VAL_0);
EVMOMAPL138_pinmuxConfig(PINMUX_UART2_REG_1, PINMUX_UART2_MASK_1, PINMUX_UART2_VAL_1);
break;
default:
return (ERR_INIT_FAIL);
}
// put xmtr/rcvr in reset.
uart->PWREMU_MGMT = 0;
// set baud rate...assumes default 16x oversampling.
divisor = SYSCLOCK2_HZ / (baud_rate * 16);
uart->DLH = (divisor & 0x0000FF00) >> 8;
uart->DLL = divisor & 0x000000FF;
// enable xmtr/rcvr fifos.
uart->FCR = 0;
SETBIT(uart->FCR, FIFOEN);
SETBIT(uart->FCR, RXCLR | TXCLR | DMAMODE1);
// disable interrupts, flow control, and loop back.
uart->IER = 0;
uart->MCR = 0;
uart->MDR = 0;
// config LCR for no parity, one stop bit, 8 data bits, no flow control.
uart->LCR = 0;
SETBIT(uart->LCR, WLS_8);
// take xmtr/rcvr out of reset.
SETBIT(uart->PWREMU_MGMT, UTRST | URRST | FREE);
return (ERR_NO_ERROR);
}
LINUX测试读写程序如下:
fd1=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);//防止任何终端输入影响程序,不关心DCD信号线电平
printf("fd1=%d\n",fd1);
tcgetattr(fd1,&opt);
cfmakeraw(&opt);
cfsetispeed(&opt,BAUDRATE1);
cfsetospeed(&opt,BAUDRATE1);
if(tcsetattr(fd1,TCSANOW,&opt)!=0)
{
perror("tcsetattr error");
return -1;
}
opt.c_cflag&=~CRTSCTS;
opt.c_cflag|=CS8;
opt.c_cflag&=~CSTOPB;
opt.c_cflag|=(CLOCAL|CREAD);//确保程序不被其他端口控制和信号干扰,同时串口驱动将读取进入的数据
opt.c_iflag|=IGNPAR;//忽略真错误和校验错误
opt.c_oflag=0;
opt.c_lflag=0;
// tcflush(fd1,TCIOFLUSH);
while(1)
{
sprintf(buf,"AT\r");
n=write(fd1,buf,strlen(buf));
printf("write %d\n",n);
sleep(3);
memset(buf,0,10);
if(read(fd1,buf,5)<0)
perror("read failed");
// while(read(fd1,buf,10)<0);
printf("read ---%s\n",buf);
// sleep(2);
}