初级会员

- 积分
- 136
- 金钱
- 136
- 注册时间
- 2020-1-15
- 在线时间
- 39 小时
|
1金钱
用的是正点原子提供的代码
已经可以正常读写了,然而有部分地址无法写入;
代码逻辑是我先整个芯片擦除,那么里面存的就应该全部是0XFF,然后写入某个地址后立即读取,发现有部分地址无法写入
是我地址格式不对吗?各位大佬如果知道麻烦说一下,非常感谢啊!
代码比较长,简单来说就是
W25QXX_Erase_Chip();//先初始化,里面全是0xff
W25QXX_Write (temp ,FLASH_SIZE , 10 );//先写入,temp里面是123456789
W25QXX_Read (tempr ,FLASH_SIZE , 10 );//读出,到tempr
for(int i=0;i<len;i++)
{
printf(" %d ",*(tempr+i));//打印出来
}
实测也就是如下4个地址无法写入,打印的结果在下面,很奇怪,我的格式错了吗?
W25QXX_Write (temp ,FLASH_SIZE -0xFF, 10 );
W25QXX_Write (temp ,FLASH_SIZE -0xFF42FF, 10 );
W25QXX_Write (temp ,FLASH_SIZE -0xFF23FF, 10 );
W25QXX_Write (temp ,FLASH_SIZE -0xFF00FF, 10 );- u8 temp[10] ={1,2,3,4,5,6,7,8,9,10};
- u8 tempr[10];
- memset(tempr,0,10);
- u32 FLASH_SIZE =0X1000000u;
- u16 len=10;
- ID=W25QXX_ReadID();
- printf("\nID =%x\n",ID);
- W25QXX_Erase_Chip();
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE , 10 );
- W25QXX_Read (tempr ,FLASH_SIZE , 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE-100 , 10 );
- W25QXX_Read (tempr ,FLASH_SIZE-100 , 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE -0xFFFF, 10 );
- W25QXX_Read (tempr ,FLASH_SIZE -0xFFFF, 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE -0xFF00FF, 10 );
- W25QXX_Read (tempr ,FLASH_SIZE -0xFF00FF, 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE -0xFF23FF, 10 );
- W25QXX_Read (tempr ,FLASH_SIZE -0xFF23FF, 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE -0xFF42FF, 10 );
- W25QXX_Read (tempr ,FLASH_SIZE -0xFF42FF, 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE -0xFF, 10 );
- W25QXX_Read (tempr ,FLASH_SIZE -0xFF, 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- W25QXX_Write (temp ,FLASH_SIZE -FLASH_SIZE, 10 );
- W25QXX_Read (tempr ,FLASH_SIZE -FLASH_SIZE, 10 );
- for(int i=0;i<len;i++)
- {
- printf(" %d ",*(tempr+i));
- }
- printf("\n----------------------------------\n");
- while (1)
- {
- ID=W25QXX_ReadID();
- printf("\nID =%x\n",ID);
- // printf("\n----------------[loop %d]-----------------------\n",loop++);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
- HAL_Delay(300);
- HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
- HAL_Delay(300);
- loop=(loop>0xffff)?0:loop;
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 打印结果
- ----------------------------------
- 1 2 3 4 5 6 7 8 9 10
- ----------------------------------
- 1 2 3 4 5 6 7 8 9 10
- ----------------------------------
- 255 255 255 255 255 255 255 255 255 255
- ----------------------------------
- 255 255 255 255 255 255 255 255 255 255
- ----------------------------------
- 255 255 255 255 255 255 255 255 255 255
- ----------------------------------
- 255 255 255 255 255 255 255 255 255 255
- ----------------------------------
- 1 2 3 4 5 6 7 8 9 10
- ----------------------------------
- 1 2 3 4 5 6 7 8 9 10
- ----------------------------------
复制代码
|
最佳答案
查看完整内容[请看2#楼]
自问自答了;
一开始把调试方向放在了硬件初始化上,实际上弄错了,硬件初始化没问题。
u16 W25QXX_TYPE=W25Q256; //默认是W25Q256
关键在于这里,原子哥的代码初始化会读取ID,然后赋值给W25QXX_TYPE,这里被我误删了,导致后续的地址位出错了,也就导致了某些地址位可以写入,而某些写不进。
这也就是代码习惯问题,我习惯初始化都是0,原子哥初始化给了一个TYPE值,我想当然的以为初始化是0,导致了这个错误。
以及原 ...
|