注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
r16721853的个人空间 https://home.eeworld.com.cn/space-uid-364671.html [收藏] [复制] [分享] [RSS]
日志

OMAPL138平台串口uart0的问题,请大侠帮忙

已有 4302 次阅读2011-10-8 11:57

根据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);

}




评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章