打印

GD32F303的SPI使用DMA发送问题

[复制链接]
1102|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
为你神|  楼主 | 2023-12-13 12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Dma_SPI0_Transmit(u16 *pdata,u16 size)
{
    dma_parameter_struct dma_init_struct;
   
    dma_deinit(DMA0, DMA_CH2);
    dma_init_struct.periph_addr  = (uint32_t)(&SPI_DATA(SPI0));
    dma_init_struct.memory_addr  = (uint32_t)pdata;
    dma_init_struct.direction    = DMA_MEMORY_TO_PERIPHERAL;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    dma_init_struct.priority     = DMA_PRIORITY_MEDIUM;
    dma_init_struct.number       = size;
    dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;

    dma_init(DMA0, DMA_CH2, &dma_init_struct);

    dma_circulation_disable(DMA0, DMA_CH2);
    dma_memory_to_memory_disable(DMA0, DMA_CH2);
    BL_CS0_OFF;
    dma_channel_enable(DMA0, DMA_CH2);
    spi_dma_enable(SPI0, SPI_DMA_TRANSMIT);
    while(!dma_flag_get(DMA0,DMA_CH2, DMA_FLAG_FTF)){};
    BL_CS0_ON;
}
项目使用GD32F303RCT6的SPI使用DMA发送数据,发送数据函数如代码,在打开通道之前CS脚手动拉低,等到检测发送完成标记之后CS脚手动拉高。实际测的波形是在数据没有发送完就检测到完成标记,CS就拉高了。最终导致从机接触不到完整数据。请问各位大神有碰到这种情况吗?试了先清楚标记的方法也不行,不知道为啥数据没有发送完,可是完成标记提前置1了。

使用特权

评论回复
沙发
为你神|  楼主 | 2023-12-13 17:29 | 只看该作者
自己回答一下吧  困扰了好长时间突然有灵感了, 即使不用DMA接收 也要加上DMA接收,在while判断发送标记之后在用while判断接收标记之后在把CS拉高,问题就没有了

使用特权

评论回复
板凳
qintian0303| | 2023-12-14 10:01 | 只看该作者
实际测的波形是在数据没有发送完就检测到完成标记,问题应该还是出在这里了,完成标记是检测的什么?用DMA接收实际上也是进行了延时

使用特权

评论回复
地板
储小勇_526| | 2023-12-14 11:45 | 只看该作者
这个问题是这样子的,你用DMA传输数据,这句话执行完其实没软件啥事了,你后面要添加函数来判断SPI的状态,传输完才能将使能关闭。其实我就纳闷了,既然要判断SPI的状态,那干嘛要用DMA传输,难不成DMA执行完做其他事的时候再去判断SPI是否传输完成?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝