[STM32F0] stm32f030c8t6 spi上使用DMA

[复制链接]
3313|4
手机看帖
扫描二维码
随时随地手机跟帖
z32437089|  楼主 | 2015-11-28 13:41 | 显示全部楼层 |阅读模式
本帖最后由 z32437089 于 2015-11-28 13:44 编辑

久久未能解决
<div class="blockcode"><blockquote>char Buffer[5]={0x55,0xff,0xee,0x44,0x33};
DMA_InitTypeDef  DMA_InitStructure;

void dmainit()
{

          /* DMA1 channel1 configuration ---------------------------------------------*/
          /* Enable DMA1 clock --------------------------------------------------------*/

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

          DMA_DeInit(DMA1_Channel1);
          DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1->DR;    //spi1 dr
          DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Buffer;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;   //m to spi
          DMA_InitStructure.DMA_BufferSize = 5;//sizeof();
          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_Circular;//DMA_Mode_Normal;
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;
          DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
          DMA_Init(DMA1_Channel1, &DMA_InitStructure);

          /* Enable DMA1 Channel1 transfer */
          DMA_Cmd(DMA1_Channel1, ENABLE);

}
void spiinit()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef SPI_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_0);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_0);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_0);

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

        SPI_Init(SPI1, &SPI_InitStructure);

        SPI_Cmd(SPI1, ENABLE);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);

        }
int main()
{
        SystemInit();
        dmainit();
        spiinit();
        while(1);
}

各初始化代码如上图所示,查阅好几个例程,改无可改。现在的情况是没有监测到任何数据从MOSI发出。如果手动SPI发送数据是可以的发送的,只能说明SPI能工作,DMA无法工作,求指导。
z32437089|  楼主 | 2015-11-28 14:48 | 显示全部楼层
结贴
加个&()就好了
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);    //spi1 dr

使用特权

评论回复
gmm2015| | 2015-11-28 15:24 | 显示全部楼层
#define SPI1_DR_ADDRESS      0x4001300C

DMA_InitStructure.DMA_PeripheralBaseAddr = ((uint32)SPI1_DR_ADDRESS);

使用特权

评论回复
mmuuss586| | 2015-11-28 17:14 | 显示全部楼层

解决了就好;

使用特权

评论回复
UBC-Jason| | 2016-1-13 16:16 | 显示全部楼层

使用特权

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

本版积分规则