从机端读取采样数据

本周工作

  • 纠正上周数据无法在STM32端无法读取的错误,原因不是因为信号质量太差导致,而是SPI外设使用方法错误导致。第一次测试时使用HAL_SPI_Recieve函数来读取SPI接收数据,而不使用DMA,后续对SPI写入发送数据后可以接收数据。后续改成使用HAL_SPI_Recieve_DMA函数,可以直接通过DMA读取SPI接收数据。

  • 实测在SPI数据速率为50M/s下可以收到正确的数据。采用示波器观察SPI数据信号,采集端一次发送八个16bits数据,分别为:0x000A - 0x001B - 0x030C - 0xB1F - 0x301D - 0x04D1 - 0xFF09 - 0x0E18
    SPI DATA

  • STM32接收端开辟一个二维数组ad7606_data,列数为8,每一列对应一个接收数据通道。行数则为传输的采样数,当下行数为4。将二维数组每一列元素取出放入一维数组中,如ad7606_data_ch1,即代表本次传输过程中该通道接收到的数据。实测结果发现接收端的每个通道数组内的数据并不是固定的,而是处于变化中,并且呈现循环变化,且循环并无规律。 RX DATA

  • 推测原因:DMA设定工作模式为循环接收模式,在接收完指定数据后内部相关寄存器会清零,重载寄存器内的设定值需要一定的时间,重载时间可能不固定,处于随机值,加上接收端CPU还需要完成一些任务,导致DMA开始进行下一轮传输的时间是随机的,导致该现象的发生。

  • 解决方法:加入数据同步信号,即SPI主机端生成一个数据开始传输信号脉冲,用该信号触发主机端SPI数据发送和从机端SPI数据接收。从机端也就STM32端在该信号边沿处生成中断,在中断函数中完成SPI、DMA的开启。该方法需要脉冲位于数据传输空闲时期,但考虑到从机端CPU处理速度,可能会丢失一个采样包。


本文章使用limfx的vscode插件快速发布