读取设备ID 厂家ID和读写状态寄存器代码段
TW8825_WritePage(TW8825_PAGE4_SPI); SpiFlashDmaDestType(DMA_DEST_CHIPREG, 0);
SpiFlashDmaBuffAddr(DMA_BUFF_REG_ADDR);
SpiFlashDmaReadLen(0);  /*Clear high & middle bytes*/SpiFlashCmd(FLASH_CMD_RDID, 1); SpiFlashDmaReadLenByte(3);
SpiFlashDmaStart(SPIDMA_READ, 0, __LINE__);ManufacturerID = TW8825_Read(REG4D0);
MemoryType     = TW8825_Read(REG4D1);
MemoryDensity  = TW8825_Read(REG4D2);printf("\r\nSPI Flash JEDEC ID : 0x%bx, 0x%bx, 0x%bx", ManufacturerID, MemoryType, MemoryDensity);/*Read Status Register*/
if(ManufacturerID == 0x1C ||   /*EON*/ManufacturerID == 0x9D ||   /*ISSI*/ManufacturerID == 0xC2      /*MX*/){SpiFlashCmd(FLASH_CMD_RDSR, 1);SpiFlashDmaReadLenByte(1);SpiFlashDmaStart(SPIDMA_READ, 0, __LINE__);value = TW8825_Read(REG4D0) & 0x40;}
写状态寄存器值/* Enable Quad IO Mode */if(ManufacturerID == 0x1C ||   /*EON*/ManufacturerID == 0x9D ||   /*ISSI*/ManufacturerID == 0xC2      /*MX*/){SpiFlashCmd(FLASH_CMD_WREN, 1);SpiFlashDmaReadLenByte(0);SpiFlashDmaStart(SPIDMA_WRITE, 0, __LINE__);SpiFlashCmd2(FLASH_CMD_WRSR, 0x40);         /*Enable QAUD Mode*/SpiFlashDmaReadLenByte(0);SpiFlashDmaStart(SPIDMA_WRITE, 1, __LINE__);SpiFlashCmd(FLASH_CMD_WRDI, 1);SpiFlashDmaReadLenByte(0);SpiFlashDmaStart(SPIDMA_WRITE, 0, __LINE__);}else if(ManufacturerID == 0xEF) /*WB*/{SpiFlashCmd(FLASH_CMD_WREN, 1);SpiFlashDmaReadLenByte(0);SpiFlashDmaStart(SPIDMA_WRITE, 0, __LINE__);SpiFlashCmd3(FLASH_CMD_WRSR, 0x00, 0x02);   /*Enable QAUD Mode*/SpiFlashDmaReadLenByte(0);SpiFlashDmaStart(SPIDMA_WRITE, 1, __LINE__);SpiFlashCmd(FLASH_CMD_WRDI, 1);SpiFlashDmaReadLenByte(0);SpiFlashDmaStart(SPIDMA_WRITE, 0, __LINE__);}

此上代码段位于spi-flash初始化部分。

下面设置读模式,实验证明需设置为读或者快读时方可读出数据。
PI_SetReadMode(SPI_RD_MODE_SLOW);

read flash操作代码如下:

BYTE SpiFlashDmaStart1(BYTE dma_option)
{BYTE i;volatile BYTE vdata;// DMA-startTW8825_Write(REG4C4, 0x01 | dma_option);    //wait done flag//REG4C4[0] is a self clear flag register.for(i=0; i < 100; i++) {vdata = TW8825_Read(REG4C4);if((vdata & 0x01)==0)break;delay(2*10);}if(i==100) {printf("\nSpiFlashDmaWait DMA Busy.");return 2;   //fail:busy}return 0;
}void SpiFlashSetAddress2Hw(DWORD addr)
{TW8825_Write(REG4CB, (BYTE)(addr >> 16));TW8825_Write(REG4CC, (BYTE)(addr >> 8));TW8825_Write(REG4CD, (BYTE)(addr));}void SpiFlashDmaRead2XMem(BYTE * dest_loc, DWORD src_loc, WORD size)
{WORD dest_w_loc = (WORD)dest_loc;BYTE dma_option;TW8825_WritePage(TW8825_PAGE4_SPI);TW8825_Write(REG4C3, (DMA_DEST_MCU_XMEM << 6) | 0x05);TW8825_Write(REG4C6, (BYTE)(dest_w_loc>>8));            //pageTW8825_Write(REG4C7, (BYTE)(dest_w_loc));               //indexTW8825_Write(REG4C8, (BYTE)(size >> 8) );               // data Buff count middleTW8825_Write(REG4C9, (BYTE)size );                      // data Buff count LoTW8825_Write(REG4CA, 0x03 );SpiFlashSetAddress2Hw(src_loc);TW8825_Write(REG4DA, (BYTE)(size >> 16) );              // data Buff count high//vblank wait//if(vblank)//  WaitVBlank(vblank);//dma optiondma_option = 0x04;      //SPIDMA_BUSYCHECK// DMA-startSpiFlashDmaStart1(dma_option);
}

主函数里面对SpiFlashDmaRead2XMem()这个函数进行调用即可读出数据。

void SpiFlashDmaStart(BYTE fWrite, BYTE fBusy, WORD call_line)
{BYTE dat = 0x01;            /*Start*/if(fWrite) dat |= 0x02;     /*Write*/if(fBusy)  dat |= 0x04;     /*Busy*/TW8825_WritePage(TW8825_PAGE4_SPI);TW8825_Write(REG4C4, dat);SpiFlashDmaWait(200, 1, call_line);
}BYTE SpiFlashChipRegCmd(BYTE cmd, BYTE w_len, BYTE r_len, BYTE vblank)
{BYTE dma_option;BYTE i;volatile BYTE vdata;TW8825_WritePage(TW8825_PAGE4_SPI);TW8825_Write(REG4C3,(DMA_DEST_CHIPREG << 6) | (1+w_len));TW8825_Write(REG4C6, DMA_BUFF_REG_ADDR_PAGE);TW8825_Write(REG4C7, DMA_BUFF_REG_ADDR_INDEX);TW8825_Write(REG4C8, 0x00 );                            // data Buff count middleTW8825_Write(REG4C9, r_len );                           // data Buff count LoTW8825_Write(REG4CA, cmd );for(i=0; i < w_len; i++)TW8825_Write(REG4CB+i, SPI_CmdBuffer[i]);TW8825_Write(REG4DA, 0x00 );                            // data Buff count high//vblank waitif(vblank)TW8825_WaitVBlank(vblank);//dma optiondma_option = 0x00;if(cmd==FLASH_CMD_PP|| cmd==FLASH_CMD_SE|| cmd==FLASH_CMD_BE|| cmd==FLASH_CMD_BE_32K|| cmd==FLASH_CMD_CE)dma_option |= 0x02; //DMA Buff Write Modeif(cmd==FLASH_CMD_READ|| cmd==FLASH_CMD_FAST_READ|| cmd==FLASH_CMD_4READ|| cmd==FLASH_CMD_WRSR|| cmd==FLASH_CMD_SE|| cmd==FLASH_CMD_BE|| cmd==FLASH_CMD_BE_32K|| cmd==FLASH_CMD_CE)dma_option |= 0x04; //BUSY CHECK// DMA-startTW8825_Write(REG4C4, 0x01 | dma_option);    //wait donefor(i=0; i < 200; i++) {vdata = TW8825_Read(REG4C4);if((vdata & 0x01)==0)break;delay(10 * 10);}if(i==200) {printf("\nSpiFlashChipRegCmd Busy cmd:%bx",cmd);return 2;   //fail:busy}//readfor(i=0; i < r_len; i++) SPI_CmdBuffer[i] = TW8825_Read(REG4D0+i);   printf("SPI_CmdBuffer\n");return 0;   //success
}void SPI_PageProgram(WORD xaddr ,DWORD spiaddr,  WORD cnt)
{BYTE dma_option;printf("tuning debug1********* %06lx\n",spiaddr);SpiFlashChipRegCmd(FLASH_CMD_WREN,0,0,0);TW8825_WritePage(TW8825_PAGE4_SPI);TW8825_Write(REG4C3, (DMA_DEST_MCU_XMEM << 6) | 4);TW8825_Write(REG4C6, (BYTE)(xaddr>>8));             //pageTW8825_Write(REG4C7, (BYTE)(xaddr));                    //indexTW8825_Write(REG4C8, (BYTE)(cnt >> 8) );                // data Buff count middleTW8825_Write(REG4C9, (BYTE)cnt );                       // data Buff count LoTW8825_Write(REG4CA, FLASH_CMD_PP );SpiFlashSetAddress2Hw(spiaddr);TW8825_Write(REG4DA, (BYTE)(cnt >> 16) );               // data Buff count high//vblank wait//if(vblank)//  WaitVBlank(vblank);//dma optiondma_option = 0x04;      //SPIDMA_BUSYCHECKdma_option |= 0x02;     //SPIDMA_WRITE. BK121011. I think, we don't need it.// DMA-startSpiFlashDmaStart(dma_option);printf("dma down\n");
}void SPI_SectorErase( DWORD spiaddr )
{SpiFlashChipRegCmd(FLASH_CMD_WREN,0,0,0);SpiFlashSetAddress2CmdBuffer(spiaddr);SpiFlashChipRegCmd(FLASH_CMD_SE,3,0,0);
}void SpiFlashDmaWrite4XMem(BYTE * src_loc, DWORD dest_loc, WORD size)
{SPI_SectorErase(dest_loc);SPI_PageProgram(src_loc, dest_loc, size);
}

主函数里面对SpiFlashDmaWrite4XMem()这个函数进行调用即可向flash里面写数据了。

注意事项:写flash时必须先擦除块或者扇区。擦除或者写时必须先使能写。

MX25L1635D spi-flash芯片的读写记录相关推荐

  1. 野火STM32F103——Fat文件系统及Flash芯片W25Q64学习记录

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一.Fatfs是什么? 二.W25Q64是什么 三.使用步骤 1.引入库 2.移植文件系统 文件简单读 ...

  2. SPI Flash芯片W25Q32英文版数据手册解读(三)---------程序编写,电路应用

    一.序言 序言对这篇文章进行一个总体的说明: 1.这部分是根据手册写程序,因此采用手册截图+程序截图的形式,对图片不进行标号,而且对重点部分进行颜色标注. 2.考虑到很多读者(包括我),使用手机看文章 ...

  3. linux下spi flash驱动程序,关于spi flash芯片m25p80驱动以及其简单的mtd驱动分析

    项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分 析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析 ...

  4. SPI Flash芯片W25Q32英文版数据手册解读(一)---------引脚功能,工作模式

    W25Q32芯片是一个可以通过SPI(串行外围设备接口)操作的flash存储器,这篇文章备忘和总结一下英文版数据手册的一些解读.有关时序及具体用STC单片机编写程序的内容等下一篇文章. 一.芯片引脚功 ...

  5. Arduino SPI + SPI Flash芯片W25Q80BV

    W25Q80BV是台湾华邦电子(Winbond)生产的8M-bit串行flash芯片.主要特性有: 工作电压:2.5 ~ 3.6 V 功耗:读写(active)时4mA,低功耗(power-down) ...

  6. 使用 STM32 的 SPI 来读取外部 SPI FLASH 芯片(W25Qxx)

    SPI简介 SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola 首先在其 MC68HCXX 系列处理器上定义的.SPI ...

  7. 关于AT25DF041B的flash芯片的读写驱动

    一.什么是AT25DF041B 最近公司采购了一批AT25DF041B的外挂FLASH芯片用来存储数据,说让我负责该芯片的驱动程序的编写.但是我拿到芯片发现这芯片的代码资料几乎没有,MD,完全从头摸索 ...

  8. spi flash擦写调试记录

    最近在调试spi flash的擦写,问题是flash擦写uboot时,不成功.原来的uboot丢失. 测试发现是因为擦能成功,但是写时的地址不是secent大小,一个secent大小为64K. 看da ...

  9. SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器

    接着上一篇文章,由于W25Q32芯片是一个存储器芯片,先对这个芯片有关存储器的一些概念进行解读. 一.存储器相关知识 1.存储器的三个单位: 存储器三个等级:页(Page),扇区(sector),块( ...

最新文章

  1. 安卓AS_git 进行更新远程分支
  2. oralce group by字符串拼接
  3. 【计组实验】P2 Modelsim Verilog单周期处理器开发 MIPS指令集
  4. 使用promise封装ajax
  5. 扩大VMware虚拟机中linux硬盘空间
  6. percona-toolkit--pt-table-checksum
  7. 把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...
  8. Python逐块执行另一个Python程序中的代码观察运行过程
  9. python - 编程规范问题
  10. 多线程的那点儿事(之大结局)
  11. 【强化学习】83篇文献-万字总结
  12. 前端静态页面html珠宝首饰电商平台网站购物商城系统.rar含源码
  13. 剖析广州“开四停四”交通限行的实现技术
  14. 用AI让逝去的亲人照片动起来后,数百万网友泪目:原来思念这么重
  15. R-南丁格尔玫瑰图: 仿制效果最好的疫情玫瑰图
  16. java 为文件赋权,linux 系统给文件赋权命令大全
  17. Halcon 算子 convexity
  18. Linux工作中必知必会的命令总结
  19. dnf剑魂buff等级上限_DNF:剑魂职业改版加强,超一线剑魂职业如何技能加点?...
  20. python遇到错误跳过_python跳过错误

热门文章

  1. 如何实现Obsidian笔记云同步? | 实践
  2. php 小时,php - 将秒转换为小时:分钟:秒
  3. 开题报告:基于java电影院选座售票系统 毕业设计论文开题报告模板
  4. 最近,我读完了张小龙的2351条饭否
  5. seo排名工具-seo排名软件
  6. android开发图案解锁,Android开发中图案解锁完整版
  7. 老黄历:编码式的统治策略
  8. 清华系激光雷达公司,成了量产元年最大的黑马
  9. 什么是高维组合特征?
  10. i5 10210u参数 i5 10210u相当于什么处理器