OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3007|回复: 7

SPI DMA接收问题求助

[复制链接]

18

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2016-8-2
在线时间
79 小时
发表于 2016-8-30 21:13:19 | 显示全部楼层 |阅读模式
我目前在做SPI FLASH的DMA方式,数据的发送是正常的,但是一旦启用DMA方式来接收数据就无法接收数据,
while (!DMA_GetFlagStatus(DMA1_FLAG_TC2));一直死在这句,急急急啊源码如下:

void SPI_DMA_TXD(void* buf, u32 DataLen)
{
        /* SPI_SLAVE_Rx_DMA_Channel configuration ---------------------------------------------*/
        DMA_InitTypeDef  DMA_InitStructure;
        DMA_DeInit(DMA1_Channel3);//spi_tx dma channel
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1->DR;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buf;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize = DataLen;
        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_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);

        // Enable USART1 DMA TX request
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);

        // Enable DMA
        DMA_Cmd(DMA1_Channel3,ENABLE);
}


void SPI_DMA_RXD(void* buf, u32 DataLen)
{       
        u8 temp = 0xff;
        /* SPI_SLAVE_Rx_DMA_Channel configuration ---------------------------------------------*/
        DMA_InitTypeDef  DMA_InitStructure;
        DMA_DeInit(DMA1_Channel2);//spi_tx dma channel
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI1->DR;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buf;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = DataLen;
        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_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel2, &DMA_InitStructure);

        DMA_Cmd(DMA1_Channel3,DISABLE);//发送数据前先关闭SPI1 DMA发送通道3
        SPI1->DR;
       
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&temp;//发送0xff用于产生时钟
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
        DMA_Cmd(DMA1_Channel2,ENABLE);// Enable DMA
        DMA_Cmd(DMA1_Channel3,ENABLE);// Enable DMA
        while (!DMA_GetFlagStatus(DMA1_FLAG_TC2));//
        DMA_ClearFlag(DMA1_FLAG_TC2);
        DMA_ClearFlag(DMA1_FLAG_TC3);
}


void SPI_FLASH_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable SPI1 and GPIO clocks */
  /*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
       SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
       and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);

  /*!< SPI_FLASH_SPI Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);


  /*!< Configure SPI_FLASH_SPI pins: SCK */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI pins: MISO */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI pins: MOSI */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /*!< Configure SPI_FLASH_SPI_CS_PIN pin: SPI_FLASH Card CS pin */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* SPI1 configuration */
  // W25X16: data input on the DIO pin is sampled on the rising edge of the CLK.
  // Data on the DO and DIO pins are clocked out on the falling edge of CLK.
  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_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);

  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-8-31 09:30:34 | 显示全部楼层

这调试有难度,我自己做过而且成功,
但一时也找不出问题。

观察下各个寄存器尤其是状态寄存器,也许能得到一些线索。


回复 支持 1 反对 0

使用道具 举报

18

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2016-8-2
在线时间
79 小时
 楼主| 发表于 2016-8-31 09:11:59 | 显示全部楼层
没人帮助,只有自己顶起来了
回复 支持 反对

使用道具 举报

18

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2016-8-2
在线时间
79 小时
 楼主| 发表于 2016-8-31 10:01:58 | 显示全部楼层
xuande 发表于 2016-8-31 09:30
这调试有难度,我自己做过而且成功,
但一时也找不出问题。

你的代码也是跟我一样配置的吗,很多大神都是要在接收时候讲SPI模式改成仅接收方式,也尝试过了,始终不成功!你的源码能否分享下呢,我用的是F103的
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-8-31 10:22:26 | 显示全部楼层
ajianyes 发表于 2016-8-31 10:01
你的代码也是跟我一样配置的吗,很多大神都是要在接收时候讲SPI模式改成仅接收方式,也尝试过了,始终不 ...


我是F4,操作寄存器。



回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-8-31 10:22:30 | 显示全部楼层
ajianyes 发表于 2016-8-31 10:01
你的代码也是跟我一样配置的吗,很多大神都是要在接收时候讲SPI模式改成仅接收方式,也尝试过了,始终不 ...


我是F4,操作寄存器。



回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11539
金钱
11539
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-8-31 10:22:31 | 显示全部楼层
ajianyes 发表于 2016-8-31 10:01
你的代码也是跟我一样配置的吗,很多大神都是要在接收时候讲SPI模式改成仅接收方式,也尝试过了,始终不 ...


我是F4,操作寄存器。



回复 支持 反对

使用道具 举报

18

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2016-8-2
在线时间
79 小时
 楼主| 发表于 2016-8-31 10:31:05 | 显示全部楼层
哦哦,应该也是一样的啊,尝试了很多地方始终还是不对,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 06:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表