IMX7D Debian11下MAX14830串口TX FIFO不刷新、发送无输出问题问询
问题描述
经过一天调试,我已在运行5.4.129内核的IMX7D平台Debian11系统上成功识别MAX14830芯片,可通过MAX310X驱动与芯片正常通信。但执行echo a > /dev/ttyMAX0发送数据时,串口无任何物理输出,仅系统侧的TX计数出现增长。
查看SPI通信流量可见交互流程完全正常,芯片返回的响应符合预期:发送3个字符时TX FIFO计数返回3,但缓冲区数据始终未被硬件处理,驱动持续查询芯片状态时FIFO计数一直保持为3。推测驱动触发超时后会发送0x81 0x00清空IRQen寄存器,随后发送0x9B 0x40设置波特率寄存器,目前该异常现象暂未定位到根因。
目前我已核查所有stty配置,添加-ixon参数禁用XON/XOFF流控后问题仍未改善。请问是否有存储驱动配置的路径或文件?是否存在遗漏的配置项?另外RX功能也无法正常工作,暂不确定是MAX14830未接收到数据还是未向驱动上报事件。
相关DTS配置
&ecspi3 { max14830: max14830@3 { compatible = "maxim,max14830"; spi-max-frequency = <15000000>; reg = <0>; // SPI片选编号 clocks = <&clk16m0>; clock-names = "osc"; interrupt-parent = <&gpio5>; interrupts = <7 IRQ_TYPE_EDGE_FALLING>; gpio-controller; // 标记该设备节点为GPIO控制器 #gpio-cells = <2>; clk16m0: clk16m0 { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <3686400>; // 外部晶振频率 clock-accuracy = <100>; }; }; };
启动阶段SPI通信日志
OUT IN 含义 0x9F 0xCE -> 写入globalCmd寄存器 = 启用扩展寄存器映射访问 0x05 0x00 -> 0x0F 0xB4 -> 清除SpclChrIntEn寄存器 = 芯片版本ID为B4 0x9F 0xCD -> 写入globalCmd寄存器 = 禁用扩展寄存器映射访问 0x8A 0x01 -> 写入UART0 Mode2寄存器 = 触发复位 0x8A 0x00 -> 写入UART0 Mode2寄存器 = 清除复位状态 0x1C 0x00 -> 0x0F 0x01 -> 读取UART0 DivLSB寄存器 = 分频值0已设置 0x89 0x80 -> 设置UART0 MODE1寄存器 = ~RTS0引脚设为三态 0xAA 0x01 -> 写入UART1 Mode2寄存器 = 触发复位 0xAA 0x00 -> 写入UART1 Mode2寄存器 = 清除复位状态 0x3C 0x00 -> 0x0F 0x01 -> 读取UART1 DivLSB寄存器 = 分频值0已设置 0xA9 0x80 -> 设置UART1 MODE1寄存器 = ~RTS1引脚设为三态 0xCA 0x01 -> 写入UART2 Mode2寄存器 = 触发复位 0xCA 0x00 -> 写入UART2 Mode2寄存器 = 清除复位状态 0x5C 0x00 -> 0xF 0x01 -> 读取UART2 DivLSB寄存器 = 分频值0已设置 0xC9 0x80 -> 设置UART2 MODE1寄存器 = ~RTS2引脚设为三态 0xEA 0x01 -> 写入UART3 Mode2寄存器 = 触发复位 0xEA 0x00 -> 写入UART3 Mode2寄存器 = 清除复位状态 0x7C 0x00 -> 0x0F 0x01 -> 读取UART3 DivLSB寄存器 = 分频值0已设置 0xE9 0x80 -> 设置UART3 MODE1寄存器 = ~RTS3引脚设为三态 0x9A 0x44 -> 写入PLLConfig寄存器 = 设置PreDiv5和PreDiv2参数 0x9E 0x14 -> 写入ClockSource寄存器 = 0001 0100 -> 最高位为保留位,第二位为PLL使能位 0x81 0x00 -> 清除UART0的IRQen寄存器 0x02 0x00 -> 0x0F 0x60 -> 读取UART0的ISR寄存器 = 收发FIFO均为空 0x1B 0x00 -> 0x0F 0x00 -> 读取UART0的BRConfig寄存器 = 所有位均未设置 0x9B 0x40 -> 写入UART0的BRConfig寄存器 = 设置FRACT2位 0xA1 0x00 -> 清除UART1的IRQen寄存器 0x22 0x00 -> 0x0F 0x60 -> 读取UART1的ISR寄存器 = 收发FIFO均为空 0x3B 0x00 -> 0x0F 0x00 -> 读取UART1的BRConfig寄存器 = 所有位均未设置 0xBB 0x40 -> 写入UART1的BRConfig寄存器 = 设置FRACT2位 0xC1 0x00 -> 清除UART2的IRQen寄存器 0x42 0x00 -> 0x0F 0x60 -> 读取UART2的ISR寄存器 = 收发FIFO均为空 0x58 0x00 -> 0x0F 0x00 -> 读取UART2的BRConfig寄存器 = 所有位均未设置 0xDB 0x40 -> 写入UART2的BRConfig寄存器 = 设置FRACT2位 0xE1 0x00 -> 清除UART3的IRQen寄存器 0x62 0x00 -> 0x0F 0x60 -> 读取UART3的ISR寄存器 = 收发FIFO均为空 0x7B 0x00 -> 0x0F 0x00 -> 读取UART3的BRConfig寄存器 = 所有位均未设置 0xFB 0x40 -> 写入UART3的BRConfig寄存器 = 设置FRACT2位
ttyMAX0端口stty配置
执行stty -F /dev/ttyMAX0查询到的配置如下:
-parenb -> 不生成奇偶校验位 -parodd -> 偶校验(默认无校验时该位不生效) -cmspar -> 不使用粘滞奇偶校验 cs8 -> 字符长度为8位 hupcl -> 不发送挂断信号 -cstopb -> 每个字符使用1个停止位 cread -> 允许接收输入 clocal -> 禁用调制解调器控制信号 -crtscts -> 不启用RTS/CTS硬件流控 -ignbr -> 不忽略Break字符 -brkint -> Break字符不会触发中断信号 -ignpar -> 不忽略存在奇偶校验错误的字符 -parmrk -> 不标记奇偶校验错误 -inpck -> 不启用奇偶校验检查 -istrip -> 不清除输入字符的最高位(第8位) -inlcr -> 不将换行符转换为回车符 -igncr -> 不忽略回车符 icrnl -> 不将回车符转换为换行符 -ixon -> 禁用XON/XOFF软件流控 -ixoff -> 禁用启停字符自动发送 -iuclc -> 不将大写字符转换为小写 -ixany -> 不允许任意字符重启输出 -imaxbel -> 缓冲区满时不响铃也不刷新 -iutf8 -> 不假设输入字符为UTF-8编码 # 输出设置 opost -> 启用输出后处理 -olcuc -> 不将小写字符转换为大写 -ocrnl -> 不将回车符转换为换行符 onlcr -> 将换行符转换为回车+换行 -onocr -> 在第一列输出回车符 -onlret -> 换行符不执行回车操作 -ofill -> 延迟时不使用填充字符代替时序等待 -ofdel -> 填充字符不使用删除符,使用空字符 nl0 cr0 tab0 -> 水平制表符延迟样式0 bs0 vt0 ff0 -> 换页符延迟样式0 isig -> 启用中断信号 icanon -> 启用特殊字符处理:擦除、删除行、单词擦除、重显行 iexten -> 启用非POSIX标准特殊字符 echo -> 回显输入字符 echoe -> 将擦除字符回显为退格+空格+退格 echok -> 删除行后回显一个换行符 -echonl -noflsh -> 收到中断和退出特殊字符后不禁止刷新缓冲区 -xcase -tostop -echoprt echoctl -> 将控制字符以尖号格式回显(如^C) echoke -> 删除整行时遵循echoprt和echoe的设置 -flusho -extproc
内容的提问来源于stack exchange,提问作者Craio
相关产品推荐
相关产品推荐

