STM32
直播中

向日葵的花季

9年用户 1333经验值
擅长:电源/新能源
私信 关注
[问答]

STM32G0B1RE 从SPI+DMA返回数据时开始3个字节错误的原因?怎么解决?

您好,我在使用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变低时产生EXti中断,在中断中开启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的原因?未看到相关清空数据等操作

回帖(1)

赵媛

2024-4-7 15:48:33
楼主您好。查询方式在SPI传输数据后,需要执行一次读取数据。正常SPI通讯的过程是只要发送数据,SPI就会有数据的响应。所以前两个字节是你前面操作的写SPI的两个命令产生的。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分