OpenEdv-开源电子网

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

spi无法擦除

[复制链接]

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-4 15:31:47 | 显示全部楼层 |阅读模式
1金钱
做了一个ADC+DMA+SPI的实验,发现从flash读取出来的数据是错误的。单步调试SPI时发现,如果我在某个地址写入数据,我就不能在这个地址写入新的数据,读取到的数据还是以前写的数据。

最佳答案

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

问题已解决,自己犯错了。想看看状态寄存器的值,在读取地址值的时候,我去读取了寄存器的值,没有将CS线拉低,导致不能读取出正确的数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 15:31:48 | 显示全部楼层
本帖最后由 不學會32不改名 于 2018-9-10 14:50 编辑

问题已解决,自己犯错了。想看看状态寄存器的值,在读取地址值的时候,我去读取了寄存器的值,没有将CS线拉低,导致不能读取出正确的数据。
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 15:35:56 | 显示全部楼层
//要写入到W25Q128的字符串数组

const u8 SEND_Buffer[]={"hello world!"};
#define SIZE sizeof(SEND_Buffer)

int main(void)
{
    u8 key;
        u16 i=0;
        u8 datatemp[SIZE];
        u32 FLASH_SIZE;
    Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,115200);        //串口初始化为115200
        delay_init(72);                            //延时初始化        
    KEY_Init();                                //按键初始化                                 
        W25QXX_Init();                        //W25QXX初始化
        FLASH_SIZE=16*1024*1024;        //FLASH 大小为16M字节
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY1_PRES)        //KEY1按下,写入W25QXX
                {
            
                        printf("Start Write W25Q128:\r\n");
                        W25QXX_Write((u8*)SEND_Buffer,FLASH_SIZE,SIZE);
                }
                if(key==KEY0_PRES)        //KEY0按下,读取字符串并显示
                {
            
                        printf("Start Read W25Q128....\r\n");
                        W25QXX_Read(datatemp,FLASH_SIZE,SIZE);
            
                        printf("The Data Readed Is:");        //提示传送完成
                        for(i=0;i<SIZE;i++)       
                printf("%c",datatemp[i]);
                        printf("\r\n");
                       
                }
        }
}

回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 15:37:02 | 显示全部楼层
Start Write W25Q128:
fe:1000
Start Read W25Q128....
The Data Readed Is:WarShip STM32
这是串口打印出来的结果
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-4 15:55:20 | 显示全部楼层
那就调试咯,直接写入不要用按键,然后读出来串口打印
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 15:59:33 | 显示全部楼层
        while(1)
        {       
                W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容
                for(i=0;i<secremain;i++)//校验数据
                {
                        if(W25QXX_BUF[secoff+i]!=0XFF) break;//需要擦除            
                }
                if(i<secremain)//需要擦除
                {
                        W25QXX_Erase_Sector(secpos);                //擦除这个扇区
                        for(i=0;i<secremain;i++)                           //复制
                        {
                                    W25QXX_BUF[i+secoff]=pBuffer[i];       
                   // printf("%c\r\n",W25QXX_BUF[i+secoff]);
                        }
                        W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//写入整个扇区
            W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容  //读取写入后的扇区
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 16:02:57 | 显示全部楼层
本帖最后由 不學會32不改名 于 2018-9-4 16:17 编辑

按下按键 第一次读扇区 BUF memory  WarShip STM32F1 SPI TEST
写完之后         BUF memory  hello world!.F1 SPI TEST  擦除之后.F1 SPI TEST 这几个数据还在BUF里面保存,这是为什么?
再去读扇区 BUF memory WarShip STM32F1 SPI TEST

又回到之前的值了,为什么WarShip STM32F1 SPI TEST 这个数据会一直被保存
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 16:57:47 | 显示全部楼层
回复

使用道具 举报

3

主题

288

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2018-8-28
在线时间
130 小时
发表于 2018-9-4 17:02:05 | 显示全部楼层
你说的是擦除一些??还剩下一些??那可能是你secremain这个变量问题。你仔细看看程序
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 17:03:04 | 显示全部楼层
我现在从倒数第50的地址开始写W25QXX_Write((u8*)SEND_Buffer,FLASH_SIZE-50,SIZE);    W25QXX_Read(datatemp,FLASH_SIZE-50,SIZE);   串口打印出来的是问号
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 17:24:49 | 显示全部楼层
douxiaolingyun 发表于 2018-9-4 17:02
你说的是擦除一些??还剩下一些??那可能是你secremain这个变量问题。你仔细看看程序

是吧一个扇区给擦除掉,但是我发现擦除完之后,以前保存的数据还存在。
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-4 17:26:19 | 显示全部楼层
@正点原子
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2018-9-4 19:39:08 | 显示全部楼层
你说的这部分 在原子的例程就有啊,你参照下“FLASH 模拟 EEPROM 实验”
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-5 10:08:59 | 显示全部楼层
未解决
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-5 10:19:51 | 显示全部楼层
翼行园子 发表于 2018-9-4 19:39
你说的这部分 在原子的例程就有啊,你参照下“FLASH 模拟 EEPROM 实验”

用的就是例程,发现给的例程写进去的数据擦不掉
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-5 10:46:03 | 显示全部楼层
用原子的 擦除整个芯片 程序 也擦不掉呢
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14433
金钱
14433
注册时间
2018-8-3
在线时间
1157 小时
发表于 2018-9-5 11:37:21 | 显示全部楼层
本帖最后由 翼行园子 于 2018-9-5 11:42 编辑

先定位一下是不是烧写器问题。在uboot下自己搞个命令,擦写一个block,看看能不能成功,是否被写保护  然后再看是不是时序除了问题
啊哈~加油!!
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-5 14:05:26 | 显示全部楼层
救救孩子
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-6 01:39:32 | 显示全部楼层
flash读写特性你了解下先
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-6 10:26:48 | 显示全部楼层
正点原子 发表于 2018-9-6 01:39
flash读写特性你了解下先

请原子哥赐教
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-7 02:16:53 | 显示全部楼层

自己找去了解
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

109

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2018-9-2
在线时间
8 小时
发表于 2018-9-7 08:04:08 | 显示全部楼层
赞同楼主的说法,先定位一下是不是烧写器问题。在uboot下自己搞个命令,擦写一个block,看看能不能成功,是否被写保护  然后再看是不是时序除了问题
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-7 10:35:00 | 显示全部楼层

原子哥,我现在改用IIC,功能可以正常实现,也可以擦除,重新写入数据。SPI的不知道为什么写不进去,里面只有例程里写进去的数据,擦不掉。
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
 楼主| 发表于 2018-9-10 08:42:03 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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