打印
[STM32F4]

SPI DMA模式求助

[复制链接]
1585|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcx0324|  楼主 | 2015-2-4 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用的是407,现用SPI操作mp3芯片(spi通信),单独用SPI通信能正常通信工作,但是用DMA模式要么就是数据发不出去,要么就是数据乱发的,配置如下:
void bsp_CfgSPIForVS1053B(void)
{
        SPI_InitTypeDef  SPI_InitStructure;

        /* 打开SPI时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
       
                /* 使能  DMA clock */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

        /* SPI1 配置 */
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;        /* 选择2线全双工模式 */
        SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;                /* CPU的SPI作为主设备 */
        SPI_InitStructure.SPI_DataSize  = SPI_DataSize_8b;        /* 8个数据 */
        SPI_InitStructure.SPI_CPOL      = SPI_CPOL_Low;                        /* CLK引脚空闲状态电平 = 0 */
        SPI_InitStructure.SPI_CPHA      = SPI_CPHA_1Edge;                /* 数据采样在第1个边沿(上升沿) */
        SPI_InitStructure.SPI_NSS       = SPI_NSS_Soft;                          /* 软件控制片选 */

        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;//SPI_BaudRatePrescaler_64;

        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        /* 最高位先传输 */
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1,&SPI_InitStructure);

        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
       
       
//        SPI1_DMA_TxConfig((uint32_t *)SPI_TX_Buf, 32);
       
        SPI_Cmd(SPI1, DISABLE);                        /* 先禁止SPI  */

        SPI_Cmd(SPI1, ENABLE);                        /* 使能SPI  */
       
}


void SPI1_DMA_TxConfig(uint32_t *BufferDST, uint32_t BufferSize)
{
        DMA_InitTypeDef DMA_InitStructure;
       
        DMA_ClearFlag(SPI_SDIO_DMA_STREAM, SPI_SDIO_DMA_FLAG_FEIF | SPI_SDIO_DMA_FLAG_DMEIF
                                                                         | SPI_SDIO_DMA_FLAG_TEIF | SPI_SDIO_DMA_FLAG_HTIF | SPI_SDIO_DMA_FLAG_TCIF);
       
        /* DMA2 Stream3  or Stream6 disable */
        DMA_Cmd(SPI_SDIO_DMA_STREAM, DISABLE);
       
        while (DMA_GetCmdStatus(SPI_SDIO_DMA_STREAM) != DISABLE)
        {
        }
       

        DMA_InitStructure.DMA_BufferSize = BufferSize;/* 配置DMA大小 */
       
        DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;                  /* 在这个程序里面使能或者禁止都可以的 */
       
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;          /* 设置阀值 */
       
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ;           /* 设置内存为单字节突发模式 */
       
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;        /* 设置内存数据的位宽是字节 */
       
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                /* 使能地址自增 */
       
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                          /* 设置DMA是正常模式 */
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = SPI1_DR_Addr ; /* 设置外设地址 */
       
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;    /* 设置外设为单字节突发模式 */
       
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /* 设置外设数据的位宽是字节 */
       
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/* 禁止外设地址自增 */
       
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;             /* 设置优先级 */
       
        /* 配置 TX DMA */
        DMA_InitStructure.DMA_Channel = SPI_SDIO_DMA_CHANNEL ;      /* 配置发送通道 */
        DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ;     /* 设置从内存到外设 */
        DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)BufferDST ; /* 设置内存地址 */
        DMA_Init(SPI_SDIO_DMA_STREAM,&DMA_InitStructure);

        /* DMA2 Stream3 enable */
        DMA_Cmd(SPI_SDIO_DMA_STREAM, ENABLE);
       
}


操作部分:
        SPI1->DR ;
                SPI1_DMA_TxConfig((uint32_t *)buf, 32);
                while (DMA_GetFlagStatus(SPI_SDIO_DMA_STREAM,SPI_SDIO_DMA_FLAG_TCIF)==RESET);
                /* 清除DMA传输完成标志 */
                DMA_ClearFlag(SPI_SDIO_DMA_STREAM,SPI_SDIO_DMA_FLAG_TCIF);


一直没找出问题,请高手帮忙
沙发
yang4469| | 2015-2-4 15:56 | 只看该作者
1、先确定硬件上有没有问题,比如线有没有连接错误,旁边有无干扰源
2.使用官网例子测试,对比程序的不同,特别是初始化部分,发现问题的原因

使用特权

评论回复
板凳
jcx0324|  楼主 | 2015-2-5 08:52 | 只看该作者
硬件没问题的,不用DMA操作,SPI通信很正常

使用特权

评论回复
地板
icecut| | 2015-2-5 09:44 | 只看该作者
把没用的内存全部初始化成不随机的数.然后看spi发出来的是什么就知道dma跑哪去了.

使用特权

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

本版积分规则

5

主题

133

帖子

1

粉丝