使用ch432t进行串口通信时候,串口0配置为19200,8,n,2的串口信息,串口1设置为115200,8,n,1。
我们在嵌入式linux板子上加载你们提供的ch432t驱动后,使用linux串口编程的方式,接收串口助手发送的数据。当我慢点发送数据时,ch432t能够正常进入中断,linux串口编程中也能正常打印数据,但当我快速发送数据时,ch432t就会一直在接收函数里面不断接收,但并没有及时串口应用层上,导致出现FIFO溢出。如何解决?
使用ch432t进行串口通信时候,串口0配置为19200,8,n,2的串口信息,串口1设置为115200,8,n,1。
我们在嵌入式linux板子上加载你们提供的ch432t驱动后,使用linux串口编程的方式,接收串口助手发送的数据。当我慢点发送数据时,ch432t能够正常进入中断,linux串口编程中也能正常打印数据,但当我快速发送数据时,ch432t就会一直在接收函数里面不断接收,但并没有及时串口应用层上,导致出现FIFO溢出。如何解决?
Linux系统下SPI传输使用系统自带的API接口,受限于系统调度,效率一般不高,即硬件时序字节间有较大无效间隔;另外CH432芯片缓冲区较小,且每次SPI通信仅能处理1个字节串口数据,多平台压力测试(不开硬件流控)连续传输最高到9600bps;如果实际需求高于9600bps,建议使用CH9434A(SPI转4串口)芯片,收发FIFO较大,且SPI支持连续传输,实测4个串口全双工连续通信可到115200bps。
按照你的说法, ch432t的驱动中应该如何改进呢?目前我们两个串口都有使用,为何出现使用串口调试助手,连续发送数据时,为何接收中断处理函数ch43x_handle_rx中的while ((lsr & CH43X_LSR_DR_BIT))一直有效,并且也没有根据fifo设置的阈值及时把数据,使用tty_flip_buffer_push上传到linux应用层?
应用软件只要打开了串口,芯片就会不断接收并缓存数据到FIFO,然后驱动通过SPI读出传递到应用层,while ((lsr & CH43X_LSR_DR_BIT))一直有效:是因为FIFO中一直有数据进来,Linux内核的其他串口驱动基本都是这种实现方法;
溢出的根本原因是主机端SPI处理效率不够高。SPI设备驱动层面的改进方法参考:(1)不使用Linux内核原生API,咨询SOC厂商看是否有更高效的API;(2)通过直接读写SOC寄存器,不经过系统调度来提高效率。