控制板使用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; //使能中断
}