OpenEdv-开源电子网

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

STM32外加了flash芯片(AT45DB321D) 直接用CPU太慢了 于是用DMA方式 但是读写都不行,求大神帮忙看下呀~~急啊~~

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-12-11
在线时间
0 小时
发表于 2013-12-11 10:13:17 | 显示全部楼层 |阅读模式

配置:


    // Configures the DMA1 Channel0 for SPI3 Rx request.
void SPI_LowLevel_DMA_RxConfig(uint32_t *SPI3_Buffer_Rx, uint32_t BufferSize){

     DMA_InitTypeDef DFDMA_InitStructure;
     DMA_ClearFlag(DataFlash_SPI_DMA_STREAM_RX, DataFlash_SPI_DMA_FLAG_FEIF0 | DataFlash_SPI_DMA_FLAG_DMEIF0 |      DataFlash_SPI_DMA_FLAG_TEIF0 | DataFlash_SPI_DMA_FLAG_HTIF0 | DataFlash_SPI_DMA_FLAG_TCIF0);
    // DMA2 Stream3 disable
    DMA_Cmd(DataFlash_SPI_DMA_STREAM_RX, DISABLE);

    // DMA2 Stream3 Config
    DMA_DeInit(DataFlash_SPI_DMA_STREAM_RX);
    DFDMA_InitStructure.DMA_Channel = DataFlash_SPI_DMA_CHANNEL;
    DFDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI3_DR_ADDR;
    DFDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)SPI3_Buffer_Rx;
    DFDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DFDMA_InitStructure.DMA_BufferSize = BufferSize;
    DFDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DFDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DFDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DFDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DFDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DFDMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DFDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
    DFDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DFDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DFDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DataFlash_SPI_DMA_STREAM_RX, &DFDMA_InitStructure);

    DMA_ITConfig(DataFlash_SPI_DMA_STREAM_RX, DMA_IT_TC, ENABLE);
    DMA_FlowControllerConfig(DataFlash_SPI_DMA_STREAM_RX, DMA_FlowCtrl_Peripheral);

    // DMA2 Stream3 enable
    DMA_Cmd(DataFlash_SPI_DMA_STREAM_RX, ENABLE);
}

// Configures the DMA1 Channel0 for SPI3 Tx request.
void SPI_LowLevel_DMA_TxConfig(uint32_t *SPI3_Buffer_Tx, uint32_t BufferSize) {

    DMA_InitTypeDef DFDMA_InitStructure;

    DMA_ClearFlag(DataFlash_SPI_DMA_STREAM_TX, DataFlash_SPI_DMA_FLAG_FEIF5 | DataFlash_SPI_DMA_FLAG_DMEIF5 |               DataFlash_SPI_DMA_FLAG_TEIF5 | DataFlash_SPI_DMA_FLAG_HTIF5 | DataFlash_SPI_DMA_FLAG_TCIF5);

    // DMA2 Stream3 disable
    DMA_Cmd(DataFlash_SPI_DMA_STREAM_TX, DISABLE);
    // DMA2 Stream3 Config
    DMA_DeInit(DataFlash_SPI_DMA_STREAM_TX);
    DFDMA_InitStructure.DMA_Channel = DataFlash_SPI_DMA_CHANNEL;
    DFDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SPI3_DR_ADDR;
    DFDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)SPI3_Buffer_Tx;
    DFDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DFDMA_InitStructure.DMA_BufferSize = BufferSize;
    DFDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DFDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DFDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DFDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DFDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DFDMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DFDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
    DFDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DFDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DFDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DataFlash_SPI_DMA_STREAM_TX, &DFDMA_InitStructure);

    DMA_FlowControllerConfig(DataFlash_SPI_DMA_STREAM_TX, DMA_FlowCtrl_Peripheral);
    DMA_Cmd(DataFlash_SPI_DMA_STREAM_TX, ENABLE);
}

调用:
读:

TestStatus dataflash_read_flash(unsigned int PageAddr,unsigned int ByteAddr,
                           unsigned char *DataBuffer,unsigned long ByteNum)
{
  unsigned long i;
  if(ByteNum<=4325376)//欲读取的数据在片内 ,范围:8192*528 Bytes
  {
    while(!(StatusRegisterRead()&0x80));// Busy or not
    Select_Flash();
    SPI_Flash_WriteByte(Continuous_Array_Read_Cmd);
    SPI_Flash_WriteByte((unsigned char)(PageAddr>>6));
    SPI_Flash_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
    SPI_Flash_WriteByte((unsigned char)ByteAddr);
    SPI_Flash_WriteByte(0x00); //使用命令03H时,不用再输入无用的数剧,但命令为E8H(加4个)或0BH(加1个)需加无用数据以完成读操作的初始化
    SPI_Flash_WriteByte(0x00);
SPI_Flash_WriteByte(0x00);
SPI_Flash_WriteByte(0x00);

SPI_LowLevel_DMA_RxConfig((uint32_t *)DataBuffer,ByteNum);
SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE);

    NotSelect_Flash(); 
    return  ASSED;
  }
  return FAILED;
}

写:

TestStatus  DataToPage_ViaBuffer_WithErase_SecWay(unsigned char BufferNumber,unsigned int PageAddr,unsigned int ByteAddr,
                                                   unsigned char *Data,unsigned int ByteNum)
 {
   unsigned int i;
   if((ByteNum<=(528-ByteAddr))&&(ByteNum>0))
   {
      while(!(StatusRegisterRead()&0x80));
      Select_Flash();
      switch(BufferNumber)
      {
      case 1: SPI_Flash_WriteByte(0x82);break;
      case 2: SPI_Flash_WriteByte(0x85);break;
      }
      SPI_Flash_WriteByte((unsigned char)(PageAddr>>6));
      SPI_Flash_WriteByte((unsigned char)((PageAddr<<2)|(ByteAddr>>8)));
      SPI_Flash_WriteByte((unsigned char)ByteAddr);

 SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx, DISABLE);
 SPI_LowLevel_DMA_TxConfig((uint32_t *)Data,ByteNum);  
 if( SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) ) 
            {
          SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Tx, ENABLE);
            }


      NotSelect_Flash();
      return PASSED;
  }
  return FAILED;
}

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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2013-12-11
在线时间
0 小时
 楼主| 发表于 2013-12-11 13:38:37 | 显示全部楼层
没有人吗????自己顶啊~~~~
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-4-20
在线时间
4 小时
发表于 2013-12-11 15:07:55 | 显示全部楼层
即使你用DMA,虽然你可以释放CPU,但是SPI Flash的读写速度是一个瓶颈啊,硬件摆在那儿了,用DMA也没办法的!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-11 15:15:24 | 显示全部楼层
回复【楼主位】 摩羯草 :
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 03:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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