SPI rx dma的设置

又忘了!!!

当spi做rx时,正常情况下是需要先写个dummy byte(多数可能是0xff)过去,spi才能收到一个数据。所以我竟然只配置了dma的receive,死都出不来。。。忘了上次做spidma是哪一年了,又被教训一次。

spi 的rx dma应用,必须同时将tx dma设置好!!比如gd303的spi0 :

void spi0_dma_config(void)//void spi0_dma_start_wait(void)
{
    dma_parameter_struct dma_init_struct;
    /* enable DMA0 */
    rcu_periph_clock_enable(RCU_DMA0);
     rcu_periph_clock_enable(RCU_AF);
    /* spi0 RX */
    dma_deinit(DMA0, DMA_CH1);
    dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
    dma_init_struct.memory_addr = (uint32_t)spi0_buffer;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dma_init_struct.number = RF_FIFO_LEN;//12;//ARRAYNUM(spi0_buffer);
    dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
    dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
    dma_init(DMA0, DMA_CH1, &dma_init_struct);
    /* configure DMA mode */
    dma_circulation_disable(DMA0, DMA_CH1);
    dma_memory_to_memory_disable(DMA0, DMA_CH1);
    //dma_interrupt_enable(DMA0,DMA_CH1, DMA_FLAG_FTF);
    
        //SPI0 TX
        dma_deinit(DMA0, DMA_CH2);
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
    dma_init_struct.memory_addr = (uint32_t)tdata_buffer;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_DISABLE;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
    dma_init_struct.number = RF_FIFO_LEN;//12;//ARRAYNUM(spi0_buffer);
    dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0);
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
    dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
    dma_init(DMA0, DMA_CH2, &dma_init_struct);
    /* configure DMA mode */
    dma_circulation_disable(DMA0, DMA_CH2);
    dma_memory_to_memory_disable(DMA0, DMA_CH2);
    //dma_interrupt_enable(DMA0,DMA_CH1, DMA_FLAG_FTF);
         
}

然后发动接收时,先disable spi,然后调用这个设置函数,然后enable  spi,开dma receive,开dma transmit,然后判断FTF,接收完毕。。

感觉spi dma性价比有点低,首先设置命令寄存器,说好你要干啥,然后开始dma,只收不发还不行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值