你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

w25q16读id正确,但是为什么我写6个1然后在读出来之后全是0

[复制链接]
p13692166934 提问时间:2018-10-25 19:29 /
开发板用的是f030c8t6,w25q16读出来的是EF14,为w25q16的flash,但是写数据之后读出来全是0,请问各位大神是什么原因,我的代码如下
//spi读写函数--模式0
//_data:待发送的数据,如果是接收模式,发送的数据则应该是0xff
//返回值:接收到的数据。如果是发送模式,返回值可以丢弃

u8 SPI1_ReadWriteByte(u8 _data)
{
        u8 i;
        for(i=0;i<8;i++)
        {
        
                if(_data&0x80)      //高位在前
                {
                        MOSI_1;
                }
                else
                {
                        MOSI_0;
                }
                SCK_1;
                _data=_data<<1;
                delay_us(2);

        
                if(GPIOA ->IDR&0x01<<6)                           //判断收到的数据
                {
                        _data=_data | 0X01;
                }
                SCK_0;
               
                delay_us(2);
        }
        return _data;
}



//返回值如下:                                   
//0XEF13,表示芯片型号为W25Q80  
//0XEF14,表示芯片型号为W25Q16   
//0XEF15,表示芯片型号为W25Q32  
//0XEF16,表示芯片型号为W25Q64            
uint16_t SPI_Flash_ReadID(void)
{
        uint32_t Temp = 0;         


        GPIOA ->ODR &=~(0x01<<4);        
        SPI1_ReadWriteByte(W25X_ManufactDeviceID);//发送读取ID命令            
        SPI1_ReadWriteByte(0x00);         
        SPI1_ReadWriteByte(0x00);         
        SPI1_ReadWriteByte(0x00);        
        Temp|=SPI1_ReadWriteByte(0xFF)<<8;  
        Temp|=SPI1_ReadWriteByte(0xFF);
        
        GPIOA ->ODR |=0x01<<4;                                    
        return Temp;
}                       
//读取SPI FLASH  
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535)
void SPI_Flash_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)   
{
         uint16_t i;                                                                                       
                GPIOA ->ODR &=~(0x01<<4);                            //使能器件   
    SPI1_ReadWriteByte(W25X_ReadData);         //发送读取命令   
    SPI1_ReadWriteByte((uint8_t)((ReadAddr)>>16));  //发送24bit地址   
    SPI1_ReadWriteByte((uint8_t)((ReadAddr)>>8));   
    SPI1_ReadWriteByte((uint8_t)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
        {
        pBuffer=SPI1_ReadWriteByte(0XFF);   //循环读数  
    }
        GPIOA ->ODR |=0x01<<4;                                                   
}  
//SPI在一页内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!         
//函数使用的限定WriteAddr/256==(WriteAddr+NumByteToWrite-1)/256
//在用这个函数前已经确认了待写入区域全为0xff
void SPI_Flash_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
         uint16_t i;  
    SPI_FLASH_Write_Enable();                  //SET WEL
          GPIOA ->ODR &=~(0x01<<4);                            //使能器件   
    SPI1_ReadWriteByte(W25X_PageProgram);      //发送写页命令   
    SPI1_ReadWriteByte((uint8_t)((WriteAddr)>>16)); //发送24bit地址   
    SPI1_ReadWriteByte((uint8_t)((WriteAddr)>>8));   
    SPI1_ReadWriteByte((uint8_t)WriteAddr);   
    for(i=0;i<NumByteToWrite;i++)
        {
                SPI1_ReadWriteByte(pBuffer);//循环写数  
        }
        GPIOA ->ODR |=0x01<<4;                            //取消片选
        SPI_Flash_Wait_Busy();                                           //等待写入结束
}

<
收藏 评论5 发布时间:2018-10-25 19:29

举报

5个回答
stm1024 回答时间:2018-10-26 08:36:36
这种W25储存器,每次写之前你需要先格式化待写入位置所在的Block或者Sector,不能直接写入,可以看看datasheet

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

toofree 回答时间:2018-10-26 09:00:50
请参考沙发楼层。
子程序没发现有什么问题,把主程序贴出来,可能还是流程没处理对。

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

chifen 回答时间:2018-10-26 09:09:49
写w25q16的位置前 要保证每个一个位置一定是0xFF,才可以写入,一般是先擦除成0xff后写入

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

p13692166934 回答时间:2018-10-26 11:36:28
chifen 发表于 2018-10-26 09:09
写w25q16的位置前 要保证每个一个位置一定是0xFF,才可以写入,一般是先擦除成0xff后写入 ...

问题找到了是显示函数的问题,不过还有一个问题,发现写1个以上的数据要延时才能写下一个,写6个数据的时候1ms不够,要2ms,我是要写数据的时候把那个区域读取出来,在原有的基础增加数组写进去,这样始终会叠加到100个以上的数组,问一下这样要加多少的延时才不会影响后面数据
stm1024 回答时间:2018-10-30 07:59:58
p13692166934 发表于 2018-10-26 11:36
问题找到了是显示函数的问题,不过还有一个问题,发现写1个以上的数据要延时才能写下一个,写6个数据的时 ...

这个要看数据手册,延时1ms可能是软件加的?你可以增加check busy函数,或者使用块写入

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版