Serial port 串行SC16IS752延迟/超时30秒后传输字节中的位移位错误

Serial port 串行SC16IS752延迟/超时30秒后传输字节中的位移位错误,serial-port,embedded-linux,Serial Port,Embedded Linux,我正在嵌入式Linux设计中使用SC16IS752芯片。在串行活动的正常条件下,该芯片在两个COM端口上都工作良好。然而,我们发现,在串行会话中,当您在大约30秒内不发送或接收数据时,在TX线路上传输的下一个字节在所有波特率38400及以上的情况下进行位移。有趣的是,在19k波特或更低的波特率(更低的波特率)下,这个问题不会发生 波特率越高,问题就越严重。在38k波特时,传输的字节移位1位(尝试发送0x66,发送0xB3)。在115k波特时,传输的字节移位4位(尝试发送0x66,发送0xF6)

我正在嵌入式Linux设计中使用SC16IS752芯片。在串行活动的正常条件下,该芯片在两个COM端口上都工作良好。然而,我们发现,在串行会话中,当您在大约30秒内不发送或接收数据时,在TX线路上传输的下一个字节在所有波特率38400及以上的情况下进行位移。有趣的是,在19k波特或更低的波特率(更低的波特率)下,这个问题不会发生

波特率越高,问题就越严重。在38k波特时,传输的字节移位1位(尝试发送0x66,发送0xB3)。在115k波特时,传输的字节移位4位(尝试发送0x66,发送0xF6)

此问题仅在现有串行会话处于非活动状态30秒后发生。这意味着新串行会话的第一个字节始终正确传输

如果您等待30秒,而不是在NXP芯片上接收一个字节,这会使NXP芯片处于良好的状态,从而正确传输后续传输的字节(只要它发生的时间比接收到的字节晚30秒)

我已经翻遍了SC16IS752数据表、应用说明和勘误表,但都没有用。我调查了睡眠模式、接收超时和所有状态寄存器。我还尝试在传输数据之前清除传输FIFO。我已经没有东西可以尝试和调试了。我知道,通过Linux驱动程序中的调试,我正在通过SPI将正确的字节发送到NXP串行芯片

顺便说一句,我正在使用的Linux驱动程序是由Manuel Stahl编写的,他在Linux内核邮件列表中发布了该驱动程序,试图将其放入Linux内核,但没有成功

后来的调查显示:

我们已经连接了一个内联RS-232设备,该设备使用LED显示所有管脚的状态。我注意到,我们的SC16串行芯片(配置为DTE)在发送或接收事务后,其“TD”和“RTS”指示灯将激活32秒,此时TD和RTS指示灯均熄灭

这意味着SC16芯片有一个32秒的超时时间,在该时间点它将停用这些引脚。此时,Tx事务(具有SC16芯片发送数据)将导致位移位问题(与之前一样,只有第一个字节发生位移位)

这里有一个有趣的部分:使用一台带有Windows和“RealTerm”作为CTE连接的调试笔记本电脑(在SC16串行连接的另一端),它允许我们切换“CTS”引脚。当我切换此pin(打开或关闭)时,它会从SC16芯片“唤醒”TD和RTS灯,此时Tx事务(让SC16芯片发送数据)将成功

因此,总结如下:

  • 当SC16芯片的TD和RTS指示灯亮起时,后续的Tx事务成功
  • SC16 TD和RTS指示灯在32秒后超时(关闭)。后续的Tx事务有位移位问题
  • 当我通过切换CTE的RTS引脚来触动SC16芯片时,它会“唤醒”SC16芯片的TD和RTS灯,随后的Tx交易成功

我在SC16数据表中没有看到提到这种类型的超时。唯一提到的是我禁用的“睡眠模式”。

我发现了问题。问题是,我们使用的是ISL4270E RS232电平转换器(而不是SC16IS752演示板中使用的SP3243E),它支持自动断电功能,在30秒不活动后关闭芯片电源。当它检测到数据并通电时,问题就出现了,它的速度不够快,无法以115k波特发送所有位。这就是为什么比特移位问题在波特率较高时更严重的原因