You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python时SPI接收数据不连续的问题求助

SPI通信数据接收异常排查与修复方案

问题现象

使用mraa/spidev作为SPI主设备,与自定义从设备通信时,无法稳定接收连续数据。例如预期接收[1,2,3,4,5,6,7,8,9],实际得到[1,1,2,4,5,6,8,8,9]这类存在重复/丢字节的结果,且每次输出不一致。

从设备代码(SPI从机逻辑)

int bytecount = 0;

SPI1->DR = tx_buff[0];

while(cs == 0) {
    if(SPI1->SR&0x1) {
        rx_buff[bytecount] = SPI1->DR;
        bytecount++;
        if(bytecount<TX_LEN) {
            SPI1->DR = tx_buff[bytecount];
        }
    }
}

主设备代码(mraa示例)

import mraa
s=mraa.Spi(0)
s.frequency(5000000)
tx=bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00')
print(tx)

核心问题分析与修复建议

1. 从设备SPI轮询逻辑缺陷

当前从设备的轮询逻辑存在两个关键问题:

  • 未等待TXE标志就发送下一字节:SPI是全双工通信,发送下一字节必须等待TXE(发送缓冲区空)标志置位,直接写入DR寄存器会覆盖未发送的数据,导致同步错误。
  • CS引脚检测时机滞后:while(cs == 0)的循环判断放在开头,但内部处理时未实时检查CS状态,可能导致CS拉高后仍继续处理,引发数据异常。

修复后的从设备代码示例:

int bytecount = 0;
// 等待发送缓冲区空后写入第一个字节
while(!(SPI1->SR & (1<<1)));
SPI1->DR = tx_buff[0];

while(cs == 0) {
    // 实时检查CS状态,避免无效处理
    if(cs != 0) break;
    
    // 接收就绪时读取数据
    if(SPI1->SR & (1<<0)) {
        rx_buff[bytecount] = SPI1->DR;
        bytecount++;
        // 发送下一字节(如果还有)
        if(bytecount < TX_LEN) {
            while(!(SPI1->SR & (1<<1)));
            SPI1->DR = tx_buff[bytecount];
        }
    }
}

2. 主设备SPI操作不完整

当前主设备代码仅完成了SPI初始化和发送缓冲区定义,未执行实际的读写操作。mraa的SPI需要调用write()或transfer()方法触发通信,否则不会产生SPI时钟和数据传输。

修复后的mraa主设备代码:

import mraa

s = mraa.Spi(0)
s.frequency(5000000)
# 必须与从设备匹配SPI模式,示例为模式0(CPOL=0, CPHA=0)
s.mode(mraa.SPI_MODE0)
tx = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00')
# 执行全双工传输,获取接收数据
rx = s.write(tx)
print("Received:", list(rx))

3. 硬件与时序匹配问题

  • SPI模式一致:主从设备必须使用相同的CPOL和CPHA配置,比如均设置为模式0,否则会出现数据采样错位。
  • 降低时钟频率测试:5MHz时钟可能超出部分从设备的处理能力,可先降至1MHz验证通信稳定性,再逐步调整。
  • CS引脚稳定性:确保CS引脚硬件电路无干扰,配置合适的上拉/下拉电阻,避免通信过程中电平波动。

4. spidev库使用注意事项

如果使用spidev,需确保正确初始化总线和模式,示例代码如下:

import spidev

spi = spidev.SpiDev()
spi.open(0, 0) # 总线0,设备0
spi.max_speed_hz = 5000000
spi.mode = 0 # 与从设备匹配的模式

tx = [0x00]*9
rx = spi.xfer(tx)
print("Received:", rx)

内容的提问来源于stack exchange,提问作者muronglindong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:02:36