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

关于stm32 SPI DMA传输的请教

[复制链接]
sinc_mark 提问时间:2014-6-26 10:18 /
 程序要使用spi dma,由于以前没有用到过,有些疑惑,主要使用的是spi2,我主要是想用其接收一帧数据,主要的配置如下:

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        //SPI2 RX DMA  将数据从外设读取到内部存储器中
        DMA_DeInit(DMA1_Channel4);                //
        DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
        DMA_InitStructure.DMA_MemoryBaseAddr     = (uint32_t)RfBuf;
        DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralSRC;//外设为源地址
        DMA_InitStructure.DMA_BufferSize         = 64;
        DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;        //传输时外设地址不自增
        DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;                //内存自增
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设传输长度为8 bit
        DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;                //内存传输长度为8 bit
        DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;                                //非循环采集
        DMA_InitStructure.DMA_Priority           = DMA_Priority_High;                        //优先级为中
        DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;                                //非存储器到存储器模式
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);

        
        DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE); 
        DMA_Cmd(DMA1_Channel4, DISABLE);


        // Tx DMA Config
        DMA_DeInit(DMA1_Channel5);
        DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
        DMA_InitStructure.DMA_MemoryBaseAddr     = 0;
        DMA_InitStructure.DMA_DIR                = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize         = 0;
        DMA_InitStructure.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc          = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode               = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority           = DMA_Priority_Low;
        DMA_InitStructure.DMA_M2M                = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); 
        DMA_Cmd(DMA1_Channel5, DISABLE);


        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

由于程序主要是想要使用SPI2的DMA 接收,所以我的接收函数如下:
        A7130_CS_LOW();                //拉低总线
        ByteSend(0x45);                        //spi 发送地址


            DMA_Cmd(DMA1_Channel4,ENABLE);        //使能spi2 DMA 接收
         while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));        //等待接收完成
            
            DMA_ClearFlag(DMA1_FLAG_TC4);         //清除接收完成标志

        DMA_Cmd(DMA1_Channel4, DISABLE);        //关闭中断
            A7130_CS_HIGH();                                //拉高总线


现在的情况是这样的,调试程序的时候,总是在 while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));这一步,这表明没有接收完成,
我的疑问如下:
1:如要使用spi dma rx,是不是需要使能spi dma的TX的?
2:spi dma 中收发时的时钟改如何给,不需要时钟的吗?
其实,归结起来就是由于使用一般的spi读我的某个器件数据的时候,是需要先使用spi发送一个地址,然后再发送一些空时钟给器件,在发送空时钟的过程中,器件会将数据发送到spi总线上,DMA这个读的过程该如何操作,谢谢!
 
收藏 评论8 发布时间:2014-6-26 10:18

举报

8个回答
stm32神舟开发板 回答时间:2014-6-26 11:43:47

RE:关于stm32 SPI DMA传输的请教

您下载一下:https://www.stmcu.org.cn/bbs/article_244_589952.html

STM32神舟IV号光盘资料的摄像头模块代码就是DMA做的,可以参考一下
有缘于你 回答时间:2014-6-26 16:47:57

RE:关于stm32 SPI DMA传输的请教

做主机时不TX能RX?时钟是由主机发出的
废鱼 回答时间:2014-6-27 09:26:46

RE:关于stm32 SPI DMA传输的请教

时序由模块自己控制,接收DMA在收到数据以后会自动存放到对应的缓冲数组中。
深秋独影 回答时间:2014-6-27 22:31:46

RE:关于stm32 SPI DMA传输的请教

stm32做主机,只有发出tx才能rx, 开启一个发送的dma就能tx
feel-376797 回答时间:2014-6-28 08:21:33

RE:关于stm32 SPI DMA传输的请教

先搞清楚SPI,再学DMA.
feiante-155820 回答时间:2014-6-28 22:15:09

RE:关于stm32 SPI DMA传输的请教

这个网上有很多例程,可以参考一下,我忘记了ST的库例程有没有了。
wjandsq 回答时间:2014-6-28 23:15:25

RE:关于stm32 SPI DMA传输的请教

有分就回复,否则不说。
aaa999kk 回答时间:2014-6-30 15:33:39

RE:关于stm32 SPI DMA传输的请教

一般主要是多看点参考例子

所属标签

相似问题

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