在 linux 中使用spi发现,传输过程中,会引发linux命令行卡顿。
查看中断计数发现,传输一次1600字节数据(1MHz),cpu 居然收到了1680多次中断。然后在驱动中,每个中断类型中加一个计数,传输前清零,传输完成后打印,发现 1600字节数据,RX_RDY 中断触发了1570多次,其余两个中断正常:TC 1次, TX_READY 约为 1600 / TX_TRIG_LEVEL 次。
最后我直接使用 devmem 手动写寄存器进行测试,发现 RX_RDY 中断始终在 RF_CNT >= 1 就触发,已配置 RX_TRIG_LEVEL = 0x30。
手动测试流程:
写 Bus Clock Gating Register 0、Bus Software Reset Register 0 打开时钟、解复位。
配置 SPI FIFO Control Register 中 RF_TEST、RX_TRIG_LEVEL
清除中断 SPI Interrupt Status Register
手动写 SPI RX Data Register,1字节数据
查看中断状态 SPI Interrupt Status Register,发现 RF_CNT 被触发,读 SPI FIFO Status Register 能看到 RF_CNT 为1。
最近编辑记录 dancells (昨天 09:52:06)
离线
f1c200s新kernel spi是可以直接开DMA的,靠本身spi fifo那几个字节中断肯定次数多了.
离线
zzm24 说:
f1c200s新kernel spi是可以直接开DMA的,靠本身spi fifo那几个字节中断肯定次数多了.
理论上中断次数是:发送字节数 / Watermark_level,但是目前的现象是约为1字节1中断。那我把主线的合入我现在的内核用dma吧,感谢。
或者我可以试试只用TX的同时处理RX
离线
补充一句:先用正常回环排除 RF_TEST 误判,再读回 FCR 确认水位。若仍一字节一中断,才考虑硅片/驱动兼容问题;工程上优先 DMA,或只开 TX 中断顺手 drain RX。
离线
陆苹果 说:
补充一句:先用正常回环排除 RF_TEST 误判,再读回 FCR 确认水位。若仍一字节一中断,才考虑硅片/驱动兼容问题;工程上优先 DMA,或只开 TX 中断顺手 drain RX。
纯写寄存器的方式测了一遍,也是一字节一中断。我先只开 TX 中断顺手 drain RX了,目前命令行卡顿缓解了。正在把主线的dma代码搬进来。感谢解答 ![]()
离线
关键别看RF_TEST,抓正常回环:读回FCR、关RX_RDY只看TC/TF、统计RF_CNT。若仍1字节1中断,再判驱动兼容或硅片问题,量产优先DMA。
离线