您好,我在使用
STM32G0B1RE的SPI1作为从设备,数据收发采用DMA方式,通过STM32CubeIDE配置工程,SPI与DMA均配置为Byte字节传输模式。
与主SPI的交互方式如下:
1、SPI-Master--->发送第一条命令---->SPI-Slave
2、SPI-Master判断SPI-Slave返回的第二、第三个字节,如果符合要求,则读取命令的应答(执行步骤3)
3、SPI-Master<---读取第一条命令应答<----SPI-Slave
在配置好工程后,数据能够正常收发,但步骤3返回给SPI-Master的数据的前3个字节总是上次的数据的结尾3个字节。我的实现逻辑是SPI-Slave端通过CS引脚判断数据传输开始与结束,数据传输的长度不定:
/**
* @brief SPI启动,CS变低时产生EX
ti中断,在中断中开启SPI+DMA传输
*/
__inline void bsp_spi_start(void)
{
uint32_t length;
//
length = nss_low();
// SPI DMA 通讯使能
HAL_SPI_TransmitReceive_DMA( hspi2, txbuffer, rxbuffer, TTU_RECV_BUFF_SIZE);
// 软件设置SSI
hspi2.Instance->CR1 = 0xFEFF;
}
/**
* @brief SPI停止,在CS拉高时产生EXTI中断,停止SPI+DMA的数据传输
*/
__inline void bsp_spi_stop(void)
{
// 软件设置SSI
hspi2.Instance->CR1 |= 0x0100;
// 停止SPI DMA通讯
HAL_SPI_DMAStop( hspi2);
// 获取SPI未传输数据长度,并处理为已传输长度
nss_high(hspi2.hdmarx->Instance->CNDTR);
}
问题现象:

上图为逻辑分析仪监控的数据,通道4的高电平为上面的bsp_spi_start()函数的执行时间。通过MISO引脚可以看到前3个字节为0xF1,这3个字节实际上为上一个SPI通讯的末尾3字节,后面的"0x01 0x03"为这一次的数据的开始,通过监控txbuffer,数据是正确的。
求教,如何解决该问题?
思考:怀疑是不是手册中,34.5.9 数据发送与接收过程,图366 主器件全双工通讯 后面说明的如果使用DMA,由DMA处理的TX、RX帧的数量设置为3的原因?未看到相关清空数据等操作