OpenEdv-开源电子网

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

SPI 用DMA功能读取外部W25Q256 FLASH数据

[复制链接]

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2016-8-19
在线时间
30 小时
发表于 2016-8-24 09:02:40 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 lymcu 于 2016-8-24 09:37 编辑

SPI 用DMA功能读取外部W25Q256 FLASH数据
谁有这个例子吗,我把图片数据放到外面W25Q256中了,现在刷图片的时候要把图片数据读进来,想用DMA总线去自动搬数据,不知道能否这样弄,这个是不是配置外设到存储器,但是ram没有那么大怎么办呢,能否外设FLASH直接到SDRAM呢??

最佳答案

查看完整内容[请看2#楼]

看精英版的综合实验,就是直接SPI DMA读取W25Q128的数据,然后DMA到LCD的。参考综合实验!!SPB效果实现就是这么做的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-24 09:02:41 | 显示全部楼层
看精英版的综合实验,就是直接SPI DMA读取W25Q128的数据,然后DMA到LCD的。参考综合实验!!SPB效果实现就是这么做的
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-8-24 11:11:07 | 显示全部楼层

刚看了下手册,应当没问题,
只要先发出命令字和数据地址,后面就可以用DMA来读数据、存储。

回复

使用道具 举报

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2016-8-19
在线时间
30 小时
 楼主| 发表于 2016-8-24 13:45:26 | 显示全部楼层
xuande 发表于 2016-8-24 11:11
刚看了下手册,应当没问题,
只要先发出命令字和数据地址,后面就可以用DMA来读数据、存储。

有W25Q256 FLASH用DMA搬数据到SDRAM的TFT显存的参考程序吗 谢谢!
回复

使用道具 举报

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2016-8-19
在线时间
30 小时
 楼主| 发表于 2016-8-24 13:49:38 | 显示全部楼层
因为FLASH搬过来的数据时8位的,但是TFT显存是16位的RGB数据,图片数据时2字节才能拼成RGB的数据
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2015-3-19
在线时间
10 小时
发表于 2016-11-25 20:53:13 | 显示全部楼层
lymcu 发表于 2016-8-24 13:45
有W25Q256 FLASH用DMA搬数据到SDRAM的TFT显存的参考程序吗 谢谢!

请问W25Q256怎么能读写高16M的数据的?我一直没有成功
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-9-4
在线时间
5 小时
发表于 2017-9-4 13:45:40 | 显示全部楼层
正点原子 发表于 2016-8-24 09:02
看精英版的综合实验,就是直接SPI DMA读取W25Q128的数据,然后DMA到LCD的。参考综合实验!!SPB效果实现就 ...

原子哥,在精英版下面没有看到 综合实验之一个实验啊?

请问精英版对应的就是 正点原子精英STM32F103ZET6开发板资料  是吗?
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2018-5-5
在线时间
29 小时
发表于 2018-5-7 14:47:31 | 显示全部楼层
请问楼主搞定没?有没有例子参考一下
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2018-5-17
在线时间
2 小时
发表于 2018-5-17 10:00:26 | 显示全部楼层
我是用 W25Q16 2M flash 存储的,使用spi1 dma 直接写屏 LCD端口。需要注意,DMA 外设 为spi ,内存为lcd 端口。外设到内存模式。我lcd 是16bit模式,所以 外设spi设定为16bit 模式,内存也设定为16bit 模式,这是第一,第二 spi 也要设定为16bit模式,8bit 模式无法显示。

void dma_spi1_to_lcd(u32 addr,u16 xs,u16 ys,u16 len,u16 height)
{
    u16  tt=0xFFFF;
    LOCK_SPI();
    spi_cs_flash();
    block_spi_send(0x0b);
    block_spi_send((addr&0xFF0000)>>16);  // ADR1
    block_spi_send((addr&0xFF00)>>8);  //  ADR2
    block_spi_send(addr&0xFF);  //  ADR3
    block_spi_send(0xFF);

    SPI1->CR1&= (~SPI_CR1_SPE);
    SPI1->CR1|=((1<<11)|(0<<7));// DFF 位 16bit 模式 SPI 调整为16bit 模式应对lcd ·16bit; 高位先
    SPI1->CR2 |=((SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx));  // dma open RX TX
    // SPI TX DMA

    DMA1_Channel3->CCR&= (uint16_t)(~DMA_CCR1_EN); //关闭DMA
    DMA1_Channel3->CCR&=~(DMA_MemoryInc_Enable); // MeM 地址 不增加 读取时 TX 随便发送
    DMA1_Channel3->CMAR=(u32) &tt; // 内存地址  随便个内容
    DMA1_Channel3->CCR=(DMA1_Channel3->CCR&(u32)(~(0b1111<<8)))|(0b0101<<8);
    // SPI RX
    DMA1_Channel2->CCR&= (uint16_t)(~DMA_CCR1_EN); //关闭DMA
    DMA1_Channel2->CCR&=~(DMA_MemoryInc_Enable); // MeM 地址 不动
    DMA1_Channel2->CCR=(DMA1_Channel2->CCR& (u32)(~(15<<8)))|(0b0101<<8); // MeM 16bit  直接写入 LCD 时 为16bit;
    DMA1_Channel2->CMAR=(u32) &LCD_RAM; // 内存地址
    SPI1->SR&=~(SPI_I2S_FLAG_RXNE|SPI_I2S_FLAG_TXE);
    lock_lcd();
    LCD_SET_WINDOW(xs,ys,xs+len-1,ys+height-1);
    LCD_ENTER_RAM();
    u32 igm_size=len *height;
    while (len)
    {
        //
        if(len<65535)
        {
            DMA1_Channel3->CNDTR=igm_size;
            DMA1_Channel2->CNDTR=igm_size;
            len=0;
        }
        else
        {
            DMA1_Channel3->CNDTR=65535;
            DMA1_Channel2->CNDTR=65535;
            igm_size-=65535;
        }

        DMA1_Channel2->CCR|= (uint16_t)(DMA_CCR1_EN); //open DMA
        DMA1_Channel3->CCR|= (uint16_t)(DMA_CCR1_EN); //open DMA
        SPI1->CR1|= (SPI_CR1_SPE); //开启spi
        CoPendSem(DMA1_TC2_EVENT,0); //等待spi 完成,无os 可以死等。
        SPI1->CR1&= ~(SPI_CR1_SPE); //close spi
        DMA1_Channel2->CCR&= (uint16_t)~(DMA_CCR1_EN); //open DMA
        DMA1_Channel3->CCR&= (uint16_t)~(DMA_CCR1_EN); //open DMA
        DMA1_Channel2->CMAR+=65535; // 内存地址
    };

    spi_dcs_flash();
    DMA1_Channel2->CCR&= (uint16_t)(~DMA_CCR1_EN); //关闭DMA
    DMA1_Channel2->CCR=(DMA1_Channel2->CCR&   (u32)(~(15<<8)))|(0b0000<<8);
    DMA1_Channel3->CCR&= (uint16_t)(~DMA_CCR1_EN); //关闭DMA
    DMA1_Channel3->CCR=(DMA1_Channel3->CCR&   (u32)(~(15<<8)))|(0b0000<<8);

    SPI1->CR1&= (~SPI_CR1_SPE);
    SPI1->CR1&=(~((1<<11)|(1<<7)));
    LCD_DESET_WINDOW();
    unlock_lcd();
    UNLOCK_SPI();

}
void DMA1_Channel2_IRQHandler(void)
{
    CoEnterISR();
   // if(DMA_GetITStatus(DMA1_IT_TC2)==SET)
      if (DMA1->ISR&DMA1_IT_TC2)
    {
        //DMA_ClearITPendingBit(DMA1_IT_TC2);
        DMA1->IFCR=DMA1_IT_TC2;
        isr_PostSem(DMA1_TC2_EVENT);// 传输完成
       // SPI_STATE=SPI_IN_IDLE;
    }
    CoExitISR();
}
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-7-29
在线时间
2 小时
发表于 2021-8-2 19:40:33 | 显示全部楼层
继续关注
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 19:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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