TI中文支持网
TI专业的中文技术问题搜集分享网站

TL16C554接收数据错误

控制板使用TL16C554进行串口扩展,采用查询方式。通过与PC串口连接调试,发现能够收发数据,但从PC发送"3F"、“7F”、“FF”等数据时,控制板接收数据不正确。另外这些数据在连续发送16次后,控制板能接收到此相应的数据。请帮忙查看一下是什么原因。谢谢!

初始化程序及查询程序如下:

void uart_init()
{
 uchar i,tmp_char,j;//,j,tmp;
 //所有的串口设置均相同
 for ( i = 0; i < SCIEX_CHANNEL_NUM; i++){
  uart_write(i,SCIEX_LCR,0x80);//enable baudrate set
  uart_write(i,SCIEX_DLL,BAUD_DIVIDOR);
  uart_write(i,SCIEX_DLM,BAUD_DIVIDOR >> 8);
  uart_write(i,SCIEX_LCR,0x03);//8,1,0
  uart_write(i,SCIEX_FCR,0x87);//enable fifo
  uart_write(i,SCIEX_IER,0x00);//interrupt enable
   for ( j = 0; j < 16; j++){
    tmp_char = uart_read_byte(i);//clear recieve buffer
      }
  tmp_char = uart_read(i,SCIEX_IIR);
  
  uart_write(i,SCIEX_MCR,0x08);//enable sci interrupt*/
  sci_txd_seek[i] = 0;
  sci_rxd_seek[i] = 0;
  sci_txd_buff[i][0] = 0;
  sci_txd_buff[i][1] = 0;
  sci_txd_buff[i][2] = 0;
  sci_txd_buff[i][3] = 0;
  sci_txd_buff[i][4] = 0;
  sci_rxd_buff[i][0] = 0;
  sci_rxd_buff[i][1] = 0;
  sci_rxd_buff[i][2] = 0;
  sci_rxd_buff[i][3] = 0;
  sci_rxd_buff[i][4] = 0;
 }

 
 //串口标志位初始
 flag_sci_busy = 0x00;

}
void uart_chaxun()
{
 uchar i,tmp,channel;
  for (channel=0;channel<4;channel++)
 {
 tmp = uart_read(channel,SCIEX_LSR);
 if(tmp & 0x01)
 {
  switch(channel)  {
   case SCIEX_CH0:
    ACTIVE_FLAG_SCI_RXD_CH0_BUSY();
    break;
   case SCIEX_CH1:
    ACTIVE_FLAG_SCI_RXD_CH1_BUSY();   
    break;
   case SCIEX_CH2:
    ACTIVE_FLAG_SCI_RXD_CH2_BUSY();   
    break;
   case SCIEX_CH3:
    ACTIVE_FLAG_SCI_RXD_CH3_BUSY();   
    break;
   default:
    break;
  } 
  for ( i = 0; i < SCI_LEN; i++)
  {
   sci_rxd_buff[channel][i] = uart_read_byte(channel);
  }
 }
}

}

Robin Feng:

"3F"、“7F”、“FF“刚好都是全1的数据看是否数据编码上有什么问题

Robin Feng:

"3F"、“7F”、“FF“刚好都是全1的数据看是否数据编码上有什么问题

guohui wu:

回复 Robin Feng:

确实是1多的数据出问题的概率大。但是我不明白您所说的数据编码是什么意思?TL16C554除了LCR中设置数据格式外还有什么地方用到数据编码了吗?我在PC上串口扩展程序和TL16C554的设置中都是采用的8位数据、1位停止、无校验位的数据格式。其他地方均未涉及到数据编码。

jiang xiang:

回复 Robin Feng:

我也出现了上述问题,我的发送没有问题,但是在接收 77 BB  DD EE  FF 时 会出现接收错误的现象,不知道是什么原因

jiang xiang:

回复 guohui wu:

楼主这个问题解决了吗?我也遇到了相同的问题

huijie wang:

我在使用TL16C554时出现了如下问题

1、波特率设置与资料不符

  在使用晶振为1.8432MHz时,波特率配置为9600bps,资料上显示除数应配置为12(0x0d),但配置为12时发出的是乱码。经过我们使用示波器测试发现分频不对,将除数配置为33(0x21)时,波形与标准波形相近。

2、有几个字符接收不了

 在使用晶振1.8432MHz,波特率9600bps,除数配置为33(0x21)时,发现有几个字符接收不了(0xfd、0xfe、0xff),当上位机发送这些字符时,现象为:芯片中断清不掉,始终处于中断状态,重新初始化也无效。

测量发现中断脚的电压也不正常,在2.1~2.5V之间。并且是四个扩展串口都处于故障状态,我只向其中的一个口发了数据(1个字符),没有超过其fifo。

注:其他字符都能正常接收,只有给他发送0xff、0xfe和0xfd中的任一字符时就死掉了。

以下为程序的初始化代码

void intial_ser_a(void)                                    

{

//串口A

  SERA_LCR = 0x83; //8数据位、1停止位、无奇偶校验

                      //除数锁存访问位 LCR.7=1时可对DLL、DLM进行操作

  SERA_DLM = 0x00;

  SERA_DLL = 0x21;//加载波特率除数

  SERA_FCR = 0x01; //FCR.1 使能FIFO的发送和接收

                                 //FCR.7 FCR.6        接收器FIFO触发层级

                                 //   0     0               1字节

                                 //   0     1               4字节

                                 //   1     0               8字节

                                 //   1     1               14字节

  SERA_MCR = 0x08; //MCR.3=1  外部串行通道中断被使能              

  SERA_LCR &= 0x7f; //除数锁存访问位 LCR.7=0时可对 IER 进行操作                                                  

  SERA_IER = 0x07; //使能中断

}

赞(0)
未经允许不得转载:TI中文支持网 » TL16C554接收数据错误
分享到: 更多 (0)