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

STM32c031c6 SPI Slave Transmit Only模式的疑问

[复制链接]
Full of ghost 提问时间:2025-2-22 16:58 / 未解决

STM32c031c6 SPI Slave Transmit Only模式的疑问。

SPI配置如下。

hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_SLAVE;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;

业务场景:

我希望用MCU将自己模拟成一个32位的移位寄存器,我配置了DMA,CS引脚使用的是外部EXTI。

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {
    if (GPIO_Pin == CS_Pin) {
//        cs = true;
//        if (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY)
//            HAL_SPI_Abort(&hspi1);


        if (HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_READY) {
            if (HAL_OK != HAL_SPI_Transmit_DMA(&hspi1, gpio_value, 8)) {
//                Error_Handler();
//                HAL_UART_Transmit(&huart1, "Error_Handler\n", 14, 10);
            }
        }

    }
}
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin) {
    if (GPIO_Pin == CS_Pin) {
//        CLEAR_BIT(hspi1.Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);
//        __HAL_SPI_DISABLE(&hspi1); // 禁用 SPI 外设
        for (int i = 0; i < 30; i++) {
            int j = i + 1;

            if (HAL_GPIO_ReadPin(portmap[i], pinmap[i]) == GPIO_PIN_RESET) {
                SET_BIT(gpio_value[j / 8], 1 << (j % 8));
            } else {
                CLEAR_BIT(gpio_value[j / 8], 1 << (j % 8));
            }
        }



        if (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_BUSY) {
//            HAL_UART_Transmit_IT(&huart1, "HF\n", 3);
            HAL_SPI_Abort_IT(&hspi1);
//            HAL_UART_Transmit_IT(&huart1, "Hf\n", 3);
//
        }

    }

}

目前这样会遇到问题,就是我并不知道SPI MASTER到底需要几个字节的内容。如果双方商量好要4个字节,那么没问题。

业务场景下这个小模块面对的master 可能要3个字节 可能要5个字节,这不是我能决定的,也不是可以预知的。

在slave发送8字节的情况下,master如果只请求了3字节,cs就拉高了,这时候spi外设的FIDO还是被DMA填满了3字节。虽然我使用了Abort,但是FIFO好像并不会被清除,而且会等待发送完成,但是这时候没有CLK了,就会导致Abort 在SPI_DMATxAbortCallback函数当中卡住。此时会错过下一次Master的数据请求。

请问有什么可以解决的方案吗?最优解决策略应该就是在CS上升沿中断当中取消SPI然后清空队列,但是我不知道该如何实现。

收藏 评论0 发布时间:2025-2-22 16:58

举报

0个回答

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版