DSP是可以出波形的,但是在ARM下 linux中就是发送无波形
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);
}
根据上面的DATASHEET我做的配置就是把PINMUX3的RX和TX使能了 内核启动信息显示了 还有就是因为流控制线没接,所以就把CTS和RTS也屏蔽了。
但是发送就是没波形,read的perror显示 Resource temporarily unavailable
而用DSP测试显示有波形,且收发正常。
测试程序如下:
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)