各位ti专家你们好,我在调试板子的时候遇到了如下问题。
1.目标:将socket数据转换为485(uart1外面接了个ADM3485)数据。
2.问题:当socket往485或者485往socket发送数据时,没有问题115200波特率可以达到10000(byte)/s比较正常。但是当两边同时发送时数据传输流量很低的时候也会出现乱码。uart0没有加485转换一切正常。
3.乱码如下:56789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890u?77熛12345678901234561234567890123456901234567890901234567890w靠货12345678901234567890123456901234567890901234567890w靠货1234567890慰飡塾篦123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890抖召?5=靠邠12345678901234567890凤u=齄123456789012345678901234567890?7?箕12345678901234567890123456789093窟]?123456789
485发送的是:1234567890 socket发送的是 http://www.cmsoft.cn QQ:10865600
4.源码:
485初始化部分:
//MAP_uDMAChannelAssign(UDMA_CH11_UARTA1_TX);
uart_init(UART485_PER, &uartconfig_485);
//HWREG(UARTA1_BASE + UART_O_IFLS) = UART_FIFO_RX2_8 | UART_FIFO_TX4_8;
//HWREG(UARTA1_BASE + UART_O_LCRH) |= UART_LCRH_FEN; //FIFI enalbe
MAP_UARTFIFODisable(UARTA1_BASE);
MAP_IntRegister(INT_UARTA1, UART1IntHandler);
MAP_IntPrioritySet(INT_UARTA1, INT_PRIORITY_LVL_0);
//MAP_UARTDMAEnable(UARTA1_BASE,UART_DMA_TX);
if((uartconfig_485.des & dataFlowToSocket) || (uartconfig_485.des & dataFlowTo232))
HWREG(UARTA1_BASE + UART_O_IM) = (UART_INT_RX | UART_INT_RT);
if(!(uartconfig_485.des & dataFlowToSocket))
HWREG(UARTA1_BASE + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE) ; // enable the uart
else
HWREG(UARTA1_BASE + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE | UART_CTL_RXE); // enable the uart
HWREG(UARTA0_BASE + UART_O_ICR) |= HWREG(UARTA0_BASE + UART_O_RIS);
HWREG(UARTA1_BASE + UART_O_ICR) |= HWREG(UARTA1_BASE + UART_O_RIS);
MAP_IntEnable(INT_UARTA0);
MAP_IntEnable(INT_UARTA1);
HWREG(UARTA0_BASE + UART_O_ECR) = 0;
HWREG(UARTA1_BASE + UART_O_ECR) = 0;
中断1:
void UART1IntHandler(void)
{
uint32_t intFlg;
uint8_t readTmp;
intFlg = (HWREG(UARTA1_BASE + UART_O_MIS));
LED_ON_OFF(LED_TXD, LED_ON);
if(intFlg & ( UART_INT_RT | UART_INT_RX) ) // rx ing
{
if(!uart_timer_cnt)
uart_timer_cnt = timer_cnt;
while(!(HWREG(UARTA1_BASE + UART_O_FR) & 0x10))
{
if((HWREG(UARTA1_BASE + UART_O_FR) &UART_FR_TXFE) && (!(HWREG(UARTA1_BASE + UART_O_FR) & UART_FR_BUSY)))
{
readTmp = HWREG(UARTA1_BASE); // the data register offset 0;
if((uartconfig_485.des & dataFlowToSocket)&&stateMachine == SOCKETCOMMUNICATION)
*tmpPtr_end++ = readTmp;
if((uartconfig_485.des & dataFlowTo232))
{
while(HWREG(UARTA0_BASE + UART_O_FR) & UART_FR_TXFF)
{
}
HWREG(UARTA0_BASE + UART_O_DR) = readTmp;
}
}
}
HWREG(UARTA1_BASE + UART_O_ICR) |= (UART_INT_RT | UART_INT_RX); //clear the interrupt flag
}
LED_ON_OFF(LED_TXD, LED_OFF);
}
串口发送代码:
void uart_send(unsigned char base,const char *str,unsigned int len)
{
unsigned long bas;
char *ptr=(char *)str;
if(base==0)bas=UARTA0_BASE;
else if(base==1) bas=UARTA1_BASE;
else return;
if(ptr != NULL)
{
while(len)
{
if(base==0)
{
while(HWREG(bas + UART_O_FR) & UART_FR_TXFF)
{
}
HWREG(bas + UART_O_DR) = *ptr++;
len--;
}
else if(base==1)
{
while(HWREG(bas + UART_O_MIS) & (UART_INT_RX))osi_Sleep(2);
while((HWREG(bas + UART_O_FR) & UART_FR_TXFF)&&(HWREG(bas + UART_O_FR) &UART_FR_RXFE))
{
}
HWREG(bas + UART_O_DR) = *ptr++;
len--;
}
else return ;
}
}
}