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

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-30 07:59:58
p13692166934 发表于 2018-10-26 11:36
问题找到了是显示函数的问题,不过还有一个问题,发现写1个以上的数据要延时才能写下一个,写6个数据的时 ...

这个要看数据手册,延时1ms可能是软件加的?你可以增加check busy函数,或者使用块写入
STM1024 回答时间:2018-10-26 08:36:36
这种W25储存器,每次写之前你需要先格式化待写入位置所在的Block或者Sector,不能直接写入,可以看看datasheet

评分

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

查看全部评分

七哥 回答时间: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个以上的数组,问一下这样要加多少的延时才不会影响后面数据

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版