Estoy usando la placa Zybo. Tengo un diseño como el siguiente:
EnelSDK,tengouncódigocomoelsiguienteparamanejarelintercambiodedatosentrePSUart0(dondelasseñalesSEMestánconectadas,monitor_rxymonitor_tx)yeldispositivoUART1(queesresponsabledelatransmisiónestándar,latransmisiónestándar),accesoaICAPparainicializacióndeSEM,etc.:
intmain(){XUartPsxuartps0;XUartPs_Config*xuartps_config0;XUartPsxuartps1;XUartPs_Config*xuartps_config1;intstatus;intstatus1=2;/*SETUP*/init_platform();Delay(200);init_GPIO();//init_TIMER();Delay(200);init_Dcfg();//Delay(200);XUartPsFormatxuartps0_format;XUartPsFormatxuartps1_format;xuartps_config0=XUartPs_LookupConfig(XPAR_XUARTPS_0_DEVICE_ID);if(xuartps_config0==NULL){returnXST_FAILURE;}XUartPs_ResetHw(xuartps_config0->BaseAddress);status=XUartPs_CfgInitialize(&xuartps0,xuartps_config0,xuartps_config0->BaseAddress);if(status!=XST_SUCCESS){returnXST_FAILURE;}xuartps0_format.BaudRate=9600u;xuartps0_format.DataBits=XUARTPS_FORMAT_8_BITS;xuartps0_format.Parity=XUARTPS_FORMAT_NO_PARITY;xuartps0_format.StopBits=XUARTPS_FORMAT_1_STOP_BIT;XUartPs_SetDataFormat(&xuartps0,&xuartps0_format);XUartPs_SetFifoThreshold(&xuartps0,63u);/*Receivethreshold*/XUartPs_SetOperMode(&xuartps0,XUARTPS_OPER_MODE_NORMAL);XUartPs_SetRecvTimeout(&xuartps0,4u);XUartPs_EnableUart(&xuartps0);xuartps_config1=XUartPs_LookupConfig(XPAR_XUARTPS_1_DEVICE_ID);if(xuartps_config1==NULL){returnXST_FAILURE;}XUartPs_ResetHw(xuartps_config1->BaseAddress);status1=XUartPs_CfgInitialize(&xuartps1,xuartps_config1,xuartps_config1->BaseAddress);if(status1!=XST_SUCCESS){returnXST_FAILURE;}xuartps1_format.BaudRate=9600u;xuartps1_format.DataBits=XUARTPS_FORMAT_8_BITS;xuartps1_format.Parity=XUARTPS_FORMAT_NO_PARITY;xuartps1_format.StopBits=XUARTPS_FORMAT_1_STOP_BIT;XUartPs_SetDataFormat(&xuartps1,&xuartps1_format);XUartPs_SetFifoThreshold(&xuartps1,63u);/*Receivethreshold*/XUartPs_SetOperMode(&xuartps1,XUARTPS_OPER_MODE_NORMAL);XUartPs_SetRecvTimeout(&xuartps1,4u);XUartPs_EnableUart(&xuartps1);for(;;){if(XUartPs_IsReceiveData(((&xuartps0)->Config.BaseAddress))){XUartPs_SendByte(((&xuartps1)->Config.BaseAddress),XUartPs_RecvByte(((&xuartps0)->Config.BaseAddress)));//XUartPs_ReadReg(xuartps0,XUARTPS_FIFO_OFFSET);//XUartPs_Send(&xuartps1,XUartPs_RecvByte(((&xuartps0)->Config.BaseAddress)),32);}if(XUartPs_IsReceiveData(((&xuartps1)->Config.BaseAddress))){//XUartPs_ReadReg(xuartps1,XUARTPS_FIFO_OFFSET);//XUartPs_Send(&xuartps1,XUartPs_RecvByte(((&xuartps0)->Config.BaseAddress)),32);XUartPs_SendByte(((&xuartps0)->Config.BaseAddress),XUartPs_RecvByte(((&xuartps1)->Config.BaseAddress)));}}cleanup_platform();return0;}
Configuréelterminalconunavelocidadde9600baudios,8bitsdedatos,1bitdeparada,sinparidadocontroldeflujo.Además,SEMtieneunavelocidadde9600baudarateeigual(comosepuedeverenelcódigo)paraUART0yUART1.
DespuésdeprogramarelFPGAyejecutarelcódigo,obtengoalgocomoesto:
Mientrasesperabaalgocomoesto:
X7_SEM_V4_1SC01FS{2-digithexvalue}ICAPOKRDBKOKINITOKSC02
Comopuedever,laúltimapartesevebien,perolaprimeraparteno.Lasdiferentescombinacionesdevelocidadenbaudiosdeloscuatrocomponentes(SEM,UART0,UART1,Terminal)muestranresultadosligeramentediferentes(aunquenomejores)peroaúnnosoncorrectos.Unaversiónanteriordemicódigo,esavezconSEM&Elterminalen9600ylosUARTen115200(loquerealmentenotienesentido)medieronunasalidaquefuecorrectaalprincipioperofalsaalfinal:
Z7_SeM_V6_9MSS"29MfS"2RMISIR"OKMRfRK"OKMINIV"OKMSS"22MO>"
Algunas notas importantes son:
- SEM usa un reloj de 100MHz
- UART 1 se configura a través de las Configuraciones del Sistema de Procesamiento Zynq en Vivado con LVCMOS 2.5V al igual que la IP SEM.
- Estoy usando Vivado 2014.4
- El sistema se implementa en modo de sondeo
- La Terminal responde a los comandos (por ejemplo, el comando "S" para un informe de estado) pero la salida sigue siendo incorrecta.
¿Alguna idea sobre este tema? Gracias.