MX25L1635D spi-flash芯片的读写记录
读取设备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芯片的读写记录相关推荐
- 野火STM32F103——Fat文件系统及Flash芯片W25Q64学习记录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一.Fatfs是什么? 二.W25Q64是什么 三.使用步骤 1.引入库 2.移植文件系统 文件简单读 ...
- SPI Flash芯片W25Q32英文版数据手册解读(三)---------程序编写,电路应用
一.序言 序言对这篇文章进行一个总体的说明: 1.这部分是根据手册写程序,因此采用手册截图+程序截图的形式,对图片不进行标号,而且对重点部分进行颜色标注. 2.考虑到很多读者(包括我),使用手机看文章 ...
- linux下spi flash驱动程序,关于spi flash芯片m25p80驱动以及其简单的mtd驱动分析
项目中用到了spi flash芯片MX25L25635E,之前在uboot下简单分析了驱动代码,调试该flash擦除的bug,一直没有时间分 析内核中关于该芯片的驱动,以下是对该芯片驱动的一个简单分析 ...
- SPI Flash芯片W25Q32英文版数据手册解读(一)---------引脚功能,工作模式
W25Q32芯片是一个可以通过SPI(串行外围设备接口)操作的flash存储器,这篇文章备忘和总结一下英文版数据手册的一些解读.有关时序及具体用STC单片机编写程序的内容等下一篇文章. 一.芯片引脚功 ...
- Arduino SPI + SPI Flash芯片W25Q80BV
W25Q80BV是台湾华邦电子(Winbond)生产的8M-bit串行flash芯片.主要特性有: 工作电压:2.5 ~ 3.6 V 功耗:读写(active)时4mA,低功耗(power-down) ...
- 使用 STM32 的 SPI 来读取外部 SPI FLASH 芯片(W25Qxx)
SPI简介 SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola 首先在其 MC68HCXX 系列处理器上定义的.SPI ...
- 关于AT25DF041B的flash芯片的读写驱动
一.什么是AT25DF041B 最近公司采购了一批AT25DF041B的外挂FLASH芯片用来存储数据,说让我负责该芯片的驱动程序的编写.但是我拿到芯片发现这芯片的代码资料几乎没有,MD,完全从头摸索 ...
- spi flash擦写调试记录
最近在调试spi flash的擦写,问题是flash擦写uboot时,不成功.原来的uboot丢失. 测试发现是因为擦能成功,但是写时的地址不是secent大小,一个secent大小为64K. 看da ...
- SPI Flash芯片W25Q32英文版数据手册解读(二)---------存储器知识,寄存器
接着上一篇文章,由于W25Q32芯片是一个存储器芯片,先对这个芯片有关存储器的一些概念进行解读. 一.存储器相关知识 1.存储器的三个单位: 存储器三个等级:页(Page),扇区(sector),块( ...
最新文章
- 安卓AS_git 进行更新远程分支
- oralce group by字符串拼接
- 【计组实验】P2 Modelsim Verilog单周期处理器开发 MIPS指令集
- 使用promise封装ajax
- 扩大VMware虚拟机中linux硬盘空间
- percona-toolkit--pt-table-checksum
- 把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...
- Python逐块执行另一个Python程序中的代码观察运行过程
- python - 编程规范问题
- 多线程的那点儿事(之大结局)
- 【强化学习】83篇文献-万字总结
- 前端静态页面html珠宝首饰电商平台网站购物商城系统.rar含源码
- 剖析广州“开四停四”交通限行的实现技术
- 用AI让逝去的亲人照片动起来后,数百万网友泪目:原来思念这么重
- R-南丁格尔玫瑰图: 仿制效果最好的疫情玫瑰图
- java 为文件赋权,linux 系统给文件赋权命令大全
- Halcon 算子 convexity
- Linux工作中必知必会的命令总结
- dnf剑魂buff等级上限_DNF:剑魂职业改版加强,超一线剑魂职业如何技能加点?...
- python遇到错误跳过_python跳过错误