完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
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_Handlern", 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, "HFn", 3); HAL_SPI_Abort_IT(&hspi1);// HAL_UART_Transmit_IT(&huart1, "Hfn", 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然后清空队列,但是我不知道该如何实现。 |
|
相关推荐
2个回答
|
|
|
确实作为从模式不容易,所有动作都是被主控制,要发送的数据都要提前准备好。
这里需要MASTER 充分考虑从设备的处理速度。 如果事先有协议约定最好(哪怕固定主取8个,用几个主来定都好)。 楼主量测一下,主停止时,CSS上升沿是否在合适的位置上。 如果时间来得及,可以尝试复位一下SPI 外设看看能否从新同步通讯。 |
|
|
|
|
|
在STM32C031C6微控制器中,SPI从模式(Slave Mode)通常用于与主设备进行通信。你提到的配置是针对SPI从设备的,并且你希望配置为“Transmit Only”模式。以下是对你的配置的一些解释和可能的疑问解答。 1. SPI 配置解析
2. Transmit Only 模式在SPI从模式下,即使你配置为双线模式(SPI_DIRECTION_2LINES),你也可以实现“Transmit Only”模式。具体实现方式如下:
3. 可能的疑问
4. 示例代码以下是一个简单的示例代码,展示了如何在SPI从模式下只发送数据: 5. 总结在STM32C031C6的SPI从模式下,即使配置为双线模式,你也可以通过只关注发送数据来实现“Transmit Only”模式。你不需要强制使用单线模式,但可以根据实际需求选择适合的配置。希望这些解释和示例代码能帮助你解决问题。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写?
1465 浏览 0 评论
stm32f103用freertos对一个采样率为1kHz的传感器,进行采样,数据出差
1518 浏览 0 评论
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
3664 浏览 1 评论
3856 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
2475 浏览 1 评论
STM32H7打开DCache后,出现了串口接收信息为空的现象,是哪里出了问题?
745浏览 5评论
用NANO STM32F103RBT6的开发板烧录不了是哪里出了问题?
674浏览 5评论
722浏览 5评论
外部中断触发类型为双边沿触发,进入中断回调后有什么办法判断该边沿是上升沿还是下降沿?
962浏览 5评论
STM32L071CBT6低温环境下无法正常工作是什么原因引起的?
762浏览 5评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-9 02:27 , Processed in 0.632013 second(s), Total 47, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
563