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

关于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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版