请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G0B1RE 从SPI+DMA返回数据时开始3个字节错误

[复制链接]
ZPKL 提问时间:2021-5-7 16:45 / 未解决
您好,我在使用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的原因?未看到相关清空数据等操作
收藏 评论6 发布时间:2021-5-7 16:45

举报

6个回答
ZPKL 回答时间:2021-5-7 17:14:28
您好,我在使用STM32G0B1RE的SPI1作为从设备,数据收发采用DMA方式,通过STM32CubeIDE配置工程,与主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的原因?未看到相关清空数据等操作


ZPKL 回答时间:2021-5-7 17:26:54
ZPKL 发表于 2021-5-7 17:14
您好,我在使用STM32G0B1RE的SPI1作为从设备,数据收发采用DMA方式,通过STM32CubeIDE配置工程,与主SPI的 ...

第一次发,问题发评论区了,没找到怎么删除...
废鱼 回答时间:2021-5-8 15:56:04
楼主您好。查询方式在SPI传输数据后,需要执行一次读取数据。正常SPI通讯的过程是只要发送数据,SPI就会有数据的响应。所以前两个字节是你前面操作的写SPI的两个命令产生的。
ZPKL 回答时间:2021-5-8 18:26:23
    1.1 已经确认问题出现在STM32G0B1SPI tx/rx FIFO,根据手册,如果使用DMA进行SPI通讯,SPITXRX FIFO将扩展到3个字节(手册 1039 367. 从器件全双工通信),根据SPI的时序,数据由DMA先从存储器写入TxFIFO,再由TxFIFO写入移位寄存器,当发送数据大于3字节时,DMA为提高效率可能一次写入3个字节;

   1.2 根据手册,1034页的“关闭SPI的步骤”,在关闭SPI时需要确保TXFIFO/RXFIFO的数据为空(通过SPI状态寄存器FTLVLFRLVL两个寄存器位判断),这样在再次启动SPI时,才不会影响下一次数据传输,而实际在操作时,由于我在数据未接收到TTU_RECV_BUFF_SIZE长度,就调用HAL_SPI_DMAStop()函数关闭SPI-DMA操作,在该函数中调用HAL_DMA_Abort(),该函数仅检查DMABSY状态,未检查FTLVLFRLVL,在未处于BSY状态时关闭了DMASPI,这样,导致TXFIFO中有数据未传输。
1.3 解决办法

    暂时采用控制外设RCC_SPBRSTR1寄存器以软件复位SPI2的方式来初始化SPI寄存器,清除FIFO的处理,但复位后,需要重新配置SPIDMA
// 停止SPI DMA传输
HAL_SPI_DMAStop(&hspi2);
// 复位SPI
__HAL_RCC_SPI2_FORCE_RESET();
// 延时3ms
rt_thread_mdelay(3);
// 清除复位标志---该步骤为必须操作,否则将无法初始化SPI
__HAL_RCC_SPI2_RELEASE_RESET()
MX_DMA_Init();
MX_SPI2_Init();

ZPKL 回答时间:2021-5-8 18:30:04
飞羽一条 发表于 2021-5-8 15:56
楼主您好。查询方式在SPI传输数据后,需要执行一次读取数据。正常SPI通讯的过程是只要发送数据,SPI就会有 ...

就是说我在CS已经拉高之后,还需要再次读取SPI->DR寄存器,去清除TXFIFO的数据吗?然后再调用HAL_SPI_DMAStop()关闭SPI?我去试一下

ZPKL 回答时间:2021-5-8 18:56:32
ZPKL 发表于 2021-5-8 18:30
就是说我在CS已经拉高之后,还需要再次读取SPI->DR寄存器,去清除TXFIFO的数据吗?然后再调用HAL_SPI_DMA ...

您好,我试了一下,没有解决问题,我想是因为现在调试的是从SPI,在CS被主SPI拉高后,操作SPI->DR寄存器已经没有效果,读取出的数据也是RxFIFO中未被清除的数据。
现在已经通过RCC_APBRSTR1寄存器的SPI2RST位复位SPI解决,但感觉这个方法比较差。
谢谢帮助。


关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版