OpenEdv-开源电子网

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

求助:W25Q64写不进数据

[复制链接]

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2012-10-26
在线时间
27 小时
发表于 2015-2-13 15:50:41 | 显示全部楼层 |阅读模式
5金钱

上电读取芯片ID0XEF16,正确

整片擦除(测试用),非常快的擦完了?

读取要写入的扇区内的数据判断是否需要擦除,全是FF

开始往0x3FFF9C写入数据

写完从刚刚的地址读出来,全是0xFF ?

最佳答案

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

找到原因了,在写使能之后必须把CS脚拉高,然后再写进数据,要不然是写不进去数据的!结贴总结:在写入一串数据的时候必须保持CS为低,等一串写完之后再拉高,SPI Flash才认为操作结束。擦除、写数据等之前必须写使能,并且写完拉高CS后再写数据,再然后就是IO 比SPI速度快,有时候拉高CS的时候数据还没写完。 PS :逻辑分析仪是神器
无个性,不签名
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2012-10-26
在线时间
27 小时
 楼主| 发表于 2015-2-13 15:50:42 | 显示全部楼层
找到原因了,在写使能之后必须把CS脚拉高,然后再写进数据,要不然是写不进去数据的!结贴总结:在写入一串数据的时候必须保持CS为低,等一串写完之后再拉高,SPI Flash才认为操作结束。擦除、写数据等之前必须写使能,并且写完拉高CS后再写数据,再然后就是IO 比SPI速度快,有时候拉高CS的时候数据还没写完。
PS :逻辑分析仪是神器
无个性,不签名
回复

使用道具 举报

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2012-10-26
在线时间
27 小时
 楼主| 发表于 2015-2-13 15:52:49 | 显示全部楼层
非常困惑,求高手
无个性,不签名
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-2-13 16:03:00 | 显示全部楼层
读取ID正确了,证明时序什么的没问题了,直接上代码吧,这样好分析
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2012-10-26
在线时间
27 小时
 楼主| 发表于 2015-2-13 16:12:32 | 显示全部楼层
[mw_shl_code=c,true] W25QXX_Init(); while(W25QXX_TYPE!=W25Q64) //?ì??????W25Q128 { LCD_ShowString(30,150,200,16,16,"W25Q64 Check Failed!"); LCD_ShowString(30,170,200,16,16,"Please Check! "); } W25QXX_Erase_Chip(); LCD_ShowString(30,150,200,16,16,"W25Q64 Ready!"); FLASH_SIZE=4*1024*1024; //FLASH ?ó????8M×??? LCD_ShowString(30,170,200,16,16,"Start Write W25Q128...."); W25QXX_Write((uint8_t*)TEXT_Buffer,FLASH_SIZE-100,sizeof(TEXT_Buffer)); //????????100?????·??????,????SIZE?¤???????? LCD_ShowString(30,190,200,16,16,"W25Q128 Write Finished!"); //?á???????ê?? LCD_ShowString(230,190,200,16,16,(uint8_t*)TEXT_Buffer); //??????????×?·??® LCD_ShowString(30,210,200,16,16,"Start Read W25Q128.... "); W25QXX_Read(datatemp,FLASH_SIZE-100,sizeof(TEXT_Buffer)); //????????100?????·??????,????SIZE??×??? LCD_ShowString(30,230,200,16,16,"The Data Readed Is: "); //?á???????ê?? LCD_ShowString(30,250,200,16,16,datatemp); //??????????×?·??®[/mw_shl_code]
[mw_shl_code=c,true]#include "w25qxx.h" #include "spi_flash.h" #include "uart.h" uint16_t W25QXX_TYPE=W25Q64; //??????W25Q64 //4Kbytes??????Sector //16????????1??Block //W25Q64 //??????8M×???,????128??Block,4096??Sector void W25QXX_Init(void) { SPI_FLASH_Init(); //??????SPI SPI_FLASH_CS_HIGH(); W25QXX_TYPE=W25QXX_ReadID(); //????FLASH ID. } //????????ID //·?????????: //0XEF13,±í????????????W25Q80 //0XEF14,±í????????????W25Q16 //0XEF15,±í????????????W25Q32 //0XEF16,±í????????????W25Q64 //0XEF17,±í????????????W25Q128 uint16_t W25QXX_ReadID(void) { uint16_t Temp = 0; SPI_FLASH_CS_LOW(); SPI_FLASH_SendByte(0x90);//·???????ID?ü?? SPI_FLASH_SendByte(0x00); SPI_FLASH_SendByte(0x00); SPI_FLASH_SendByte(0x00); Temp|=SPI_FLASH_SendByte(0xFF)<<8; Temp|=SPI_FLASH_SendByte(0xFF); printf("\r\n%x",Temp); SPI_FLASH_CS_HIGH(); return Temp; } //????W25QXX??×????????÷ //BIT7 6 5 4 3 2 1 0 //SPR RV TB BP2 BP1 BP0 WEL BUSY //SPR:????0,×????????÷±??¤??,????WP???? //TB,BP2,BP1,BP0:FLASH???ò??±??¤?è?? //WEL:?????????¨ //BUSY:??±ê????(1,??;0,????) //????:0x00 uint8_t W25QXX_ReadSR(void) { uint8_t byte=0; SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_ReadStatusReg); //·???????×????????÷?ü?? byte=SPI_FLASH_SendByte(0Xff); //????????×??? // SPI_FLASH_CS_HIGH(); //???????? return byte; } //??W25QXX×????????÷ //????SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)??????!!! void W25QXX_Write_SR(uint8_t sr) { SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_WriteStatusReg); //·???????×????????÷?ü?? SPI_FLASH_SendByte(sr); //????????×??? // SPI_FLASH_CS_HIGH(); //???????? } //W25QXX?????? //??WEL???? void W25QXX_Write_Enable(void) { SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_WriteEnable); //·????????? // SPI_FLASH_CS_HIGH(); //???????? } //W25QXX?????? //??WEL???? void W25QXX_Write_Disable(void) { SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_WriteDisable); //·????????????? // SPI_FLASH_CS_HIGH(); //???????? } //????SPI FLASH //?????¨???·???????????¨?¤???????? //pBuffer:?????????? //ReadAddr:?????????????·(24bit) //NumByteToRead:????????×?????(×??ó65535) void W25QXX_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead) { uint16_t i; SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_ReadData); //·????????ü?? SPI_FLASH_SendByte((uint8_t)((ReadAddr)>>16)); //·???24bit???· SPI_FLASH_SendByte((uint8_t)((ReadAddr)>>8)); SPI_FLASH_SendByte((uint8_t)ReadAddr); for(i=0;i<NumByteToRead;i++) { pBuffer=SPI_FLASH_SendByte(0XFF); //???·???? } SPI_FLASH_CS_HIGH(); } //SPI??????(0~65535)??????????256??×????????? //?????¨???·????????×??ó256×????????? //pBuffer:?????????? //WriteAddr:?????????????·(24bit) //NumByteToWrite:????????×?????(×??ó256),???????????????????????à×?????!!! void W25QXX_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite) { uint16_t i; W25QXX_Write_Enable(); //SET WEL SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_PageProgram); //·????????ü?? SPI_FLASH_SendByte((uint8_t)((WriteAddr)>>16)); //·???24bit???· SPI_FLASH_SendByte((uint8_t)((WriteAddr)>>8)); SPI_FLASH_SendByte((uint8_t)WriteAddr); for(i=0;i<NumByteToWrite;i++)SPI_FLASH_SendByte(pBuffer);//???·???? // SPI_FLASH_CS_HIGH(); //???????? W25QXX_Wait_Busy(); //?????????á?? SPI_FLASH_CS_HIGH(); } //???ì?é??SPI FLASH //±????·±??ù???????··??§??????????????0XFF,·??ò??·?0XFF???????????????§°?! //????×??????????? //?????¨???·???????????¨?¤????????,???????·±????·??????! //pBuffer:?????????? //WriteAddr:?????????????·(24bit) //NumByteToWrite:????????×?????(×??ó65535) //CHECK OK void W25QXX_Write_NoCheck(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite) { uint16_t pageremain; pageremain=256-WriteAddr%256; //???????à??×????? if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//???ó??256??×??? while(1) { W25QXX_Write_Page(pBuffer,WriteAddr,pageremain); if(NumByteToWrite==pageremain)break;//?????á???? else //NumByteToWrite>pageremain { pBuffer+=pageremain; WriteAddr+=pageremain; NumByteToWrite-=pageremain; //????????????????×????? if(NumByteToWrite>256)pageremain=256; //????????????256??×??? else pageremain=NumByteToWrite; //????256??×????? } }; } //??SPI FLASH //?????¨???·???????????¨?¤???????? //??????????????×÷! //pBuffer:?????????? //WriteAddr:?????????????·(24bit) //NumByteToWrite:????????×?????(×??ó65535) uint8_t W25QXX_BUFFER[4096]; void W25QXX_Write(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite) { uint32_t secpos; uint16_t secoff; uint16_t secremain; uint16_t i; uint8_t * W25QXX_BUF; W25QXX_BUF=W25QXX_BUFFER; secpos=WriteAddr/4096;//???????· secoff=WriteAddr%4096;//?????????????? secremain=4096-secoff;//???????à?????ó?? printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//?????? if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//???ó??4096??×??? while(1) { W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//?????????????????? W25QXX_Wait_Busy(); for(i=0;i<secremain;i++)//???é???? { if(W25QXX_BUF[secoff+i]!=0XFF)break;//?è?????? } if(i<secremain)//?è?????? { W25QXX_Erase_Sector(secpos);//???????????? W25QXX_Wait_Busy(); for(i=0;i<secremain;i++) //???? { W25QXX_BUF[i+secoff]=pBuffer; } W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//???????????? } else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//??????????????,?±?????????????à????. if(NumByteToWrite==secremain)break;//?????á???? else//???????á?? { secpos++;//???????·??1 secoff=0;//??????????0 pBuffer+=secremain; //???????? WriteAddr+=secremain;//?????·???? NumByteToWrite-=secremain; //×????????? if(NumByteToWrite>4096)secremain=4096; //???????????????????ê else secremain=NumByteToWrite; //?????????????????ê?? } SPI_FLASH_CS_HIGH(); }; } void W25QXX_Erase_Chip(void) //???????????? //?????±?????¤... { W25QXX_Write_Enable(); //SET WEL W25QXX_Wait_Busy(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_ChipErase); //·??????????ü?? SPI_FLASH_CS_HIGH(); //???????? W25QXX_Wait_Busy(); //?????????????á?? } //Dst_Addr:???????· ?ù???????????è?? //??????????????×????±??:150ms void W25QXX_Erase_Sector(uint32_t Dst_Addr) //???????????? { //?à??falsh?????é??,?????? SPI_FLASH_CS_HIGH(); printf("fe:%x\r\n",Dst_Addr); Dst_Addr*=4096; W25QXX_Write_Enable(); //SET WEL W25QXX_Wait_Busy(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_SectorErase); //·??????????????? SPI_FLASH_SendByte((uint8_t)((Dst_Addr)>>16)); //·???24bit???· SPI_FLASH_SendByte((uint8_t)((Dst_Addr)>>8)); SPI_FLASH_SendByte((uint8_t)Dst_Addr); // SPI_FLASH_CS_HIGH(); //???????? W25QXX_Wait_Busy(); //?????????ê?? SPI_FLASH_CS_HIGH(); } //???????? void W25QXX_Wait_Busy(void) { SPI_FLASH_CS_HIGH(); while((W25QXX_ReadSR()&0x01)==0x01); // ????BUSY?????? SPI_FLASH_CS_HIGH(); } //???????????? void W25QXX_PowerDown(void) { SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_PowerDown); //·????????ü?? // SPI_FLASH_CS_HIGH(); //???????? //delay_us(3); //????TPD } //???? void W25QXX_WAKEUP(void) { SPI_FLASH_CS_HIGH(); SPI_FLASH_CS_LOW(); //?????÷?? SPI_FLASH_SendByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB // SPI_FLASH_CS_HIGH(); //???????? // delay_us(3); //????TRES1 } [/mw_shl_code]


无个性,不签名
回复

使用道具 举报

18

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2012-10-26
在线时间
27 小时
 楼主| 发表于 2015-2-13 16:13:16 | 显示全部楼层
回复【3楼】八度空间:
---------------------------------
不知道什么问题,Q64输出的字节变成LSB,T.T
无个性,不签名
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
发表于 2015-10-24 21:22:16 | 显示全部楼层
回复【6楼】suebillt:
---------------------------------
所以数据还没写完怎么处理,加延时还是直接检测状态寄存器?
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-9-17
在线时间
7 小时
发表于 2015-10-25 18:50:34 | 显示全部楼层
回复【7楼】zi_yang:
---------------------------------
强制在写使能命令后加了1us延时,再拉高CS,结果就可以了。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 12:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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