5 spi dma 中断接收的问题

发布于 2021-02-07 16:50:39

采用cs中断的方式接收spi的数据,第一次能成功接收,后面一直都是spi busy

image.png

这是我的代码

#include <stm32f4xx_hal.h>
#include <rtthread.h>
#include <rtdevice.h>

extern SPI_HandleTypeDef hspi1;

#define CS_PIN 4 //__STM32_PIN(4 ,  A, 4 ),

#define LEN 16
uint8_t rx_data[LEN] = {0};
uint8_t tx_data[LEN] = {'1', '2', '3', '4', '5', '6', '7', '8', '1', '2', '3', '4', '5', 'e', 'n', 'd'};

void on_cs_falling(void *args)
{
    //rt_thread_mdelay(5);
    while (HAL_SPI_GetState(&hspi1)!=HAL_SPI_STATE_READY);    
    HAL_StatusTypeDef ret = HAL_SPI_TransmitReceive_DMA(&hspi1, tx_data, rx_data, LEN);
    rt_kprintf("on_cs_falling. HAL_SPI_TransmitReceive_DMA ret=%d recv=%s!\n", ret, rx_data);
}

void cs_pin_init()
{
    rt_pin_mode(CS_PIN, PIN_MODE_INPUT_PULLUP);
    rt_pin_attach_irq(CS_PIN, PIN_IRQ_MODE_FALLING, on_cs_falling, RT_NULL);
    rt_pin_irq_enable(CS_PIN, PIN_IRQ_ENABLE);
}

/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(cs_pin_init);

请问怎么解决

查看更多

关注者
0
被浏览
267
aozima
aozima 2021-02-07
拒绝白嫖,拒绝键盘侠!

做SPI从机时,应该让从机和DMA一直处于READY状态,这样有数据过来,可以实现0延迟接收。
然后检测CS的上升沿中断看接收了多少数据,处理后再重置DMA。

看你的意图是检测CS的下降沿中断,然后才配置DMA,此时数据早丢了。

2 个回答
winfeng
winfeng 2021-02-09

简单说就是用IO作为Ready信号输出,你启动DMA slave接收 后,再输出READY信号,让主spi再发送

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览