久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2127|回復: 3
打印 上一主題 下一主題
收起左側

w25q64數據讀取全是ff,應該是沒寫入不進去,單片機程序在下面各位看下

[復制鏈接]
跳轉到指定樓層
樓主
大佬們來看一下,
單片機源程序如下:
#include "w25q128.h"


/************************************************************************/
void SPI_init(void)
{
    SPI_CE_High();
    CLK_FLASH = 0;    // set clock to low initial state
    DI_FLASH = 1;
}


/************************************************************************/
void SPI_WriteByte(u8 out)
{
    u8 i;
    i = 8;
    do{
        out <<= 1;
        DI_FLASH  = CY;
        CLK_FLASH = 1;
        CLK_FLASH = 0;
    }while(--i);
    DI_FLASH = 1;
}

/************************************************************************/
u8 SPI_ReadByte(void)
{
    u8 i, in;
    i = 8;
    do{
        in <<= 1;
        if (DO_FLASH) in++;
        CLK_FLASH = 1;
        CLK_FLASH = 0;
    }while(--i);
    return in;
}


/************************************************
檢測Flash是否準備就緒
入口參數: 無
出口參數:
    0 : 沒有檢測到正確的Flash
    1 : Flash準備就緒
************************************************/
void FlashCheckID(void)
{
        u16 ID,ID1,ID2;
    SPI_CE_Low();
    SPI_WriteByte(SFC_RDID);        //發送讀取ID命令
    SPI_WriteByte(0x00);            //空讀3個字節
    SPI_WriteByte(0x00);
    SPI_WriteByte(0x00);
    ID = SPI_ReadByte();         //讀取制造商ID1
    ID1  = SPI_ReadByte();         //讀取設備ID
    ID2 = SPI_ReadByte();         //讀取制造商ID2
    SPI_CE_High();
        printf("ID:%x,ID1:%x,ID2:%x\r\n",ID,ID1,ID2);
}


/************************************************
檢測Flash的忙狀態
入口參數: 無
出口參數:
    0 : Flash處于空閑狀態
    1 : Flash處于忙狀態
************************************************/
u8  CheckFlashBusy(void)
{
    u8  dat;

    SPI_CE_Low();
    SPI_WriteByte(SFC_RDSR);        //發送讀取狀態命令
    dat = SPI_ReadByte();           //讀取狀態
    SPI_CE_High();

    return (dat);                   //狀態值的Bit0即為忙標志
}

/************************************************
使能Flash寫命令
入口參數: 無
出口參數: 無
************************************************/
void FlashWriteEnable(void)
{
    while(CheckFlashBusy() > 0);    //Flash忙檢測
    SPI_CE_Low();
    SPI_WriteByte(SFC_WREN);        //發送寫使能命令
    SPI_CE_High();
}

/************************************************
禁止Flash寫使能命令
入口參數: 無
出口參數: 無
************************************************/

void FlashWriteDisable(void)
{
    while(CheckFlashBusy() > 0);    //Flash忙檢測
    SPI_CE_Low();
    SPI_WriteByte(SFC_WRDI);        //發送寫使能命令
    SPI_CE_High();
}


/************************************************
擦除扇區, 一個扇區4KB
入口參數: 無
出口參數: 無
************************************************/
void FlashSectorErase(u32 addr)
{
        FlashWriteEnable();             //使能Flash寫命令
        SPI_CE_Low();
        SPI_WriteByte(SFC_SECTORER2);    //發送扇區擦除命令
        SPI_WriteByte(((u8 *)&addr)[1]);           //設置起始地址
        SPI_WriteByte(((u8 *)&addr)[2]);
        SPI_WriteByte(((u8 *)&addr)[3]);
        SPI_CE_High();
                while(CheckFlashBusy() > 0);
                FlashWriteDisable();
}

/************************************************
從Flash中讀取數據
入口參數:
    addr   : 地址參數
    buffer : 緩沖從Flash中讀取的數據
    len   : 數據塊大小
出口參數:
    無
************************************************/
void SPI_Read_Nbytes(u32 addr, u8 *buffer, u16 len)
{
        u16 i;
    while(CheckFlashBusy() > 0);        //Flash忙檢測
    SPI_CE_Low();                       //enable device
    SPI_WriteByte(SFC_READ);            //read command

        SPI_WriteByte((addr & 0xFF0000) >> 16);
    SPI_WriteByte((addr & 0xFF00) >> 8);
    SPI_WriteByte(addr & 0xFF);
        for (i = 0; i < len; i++)
        {
                buffer[ i]= SPI_ReadByte();
        }
    SPI_CE_High();                      //disable device
}

/************************************************************************
讀出n個字節,跟指定的數據進行比較, 錯誤返回1,正確返回0
************************************************************************/
u8  SPI_Read_Compare(u32 addr, u8 *buffer, u16 len)
{
    u8  j;
    if(len == 0)   return 2;
    while(CheckFlashBusy() > 0);            //Flash忙檢測

    j = 0;
    SPI_CE_Low();                           //enable device
    SPI_WriteByte(SFC_READ);                //read command
    SPI_WriteByte(((u8 *)&addr)[1]);        //設置起始地址
    SPI_WriteByte(((u8 *)&addr)[2]);
    SPI_WriteByte(((u8 *)&addr)[3]);
    do
    {
        if(*buffer != SPI_ReadByte())       //receive byte and store at buffer
        {
            j = 1;
            break;
        }
        buffer++;
    }while(--len);         //read until no_bytes is reached
    SPI_CE_High();          //disable device
    return j;
}


/************************************************
寫數據到Flash中
入口參數:
    addr   : 地址參數
    buffer : 緩沖需要寫入Flash的數據
    len   : 數據塊大小
出口參數: 無
************************************************/
void SPI_Write_Nbytes(u32 addr, u8 *buffer, u8 len)
{
        u16 i;
    while(CheckFlashBusy() > 0);        //Flash忙檢測
    FlashWriteEnable();                 //使能Flash寫命令
    SPI_CE_Low();                       // enable device
    SPI_WriteByte(SFC_PAGEPROG);        // 發送頁編程命令
        SPI_WriteByte((addr & 0xFF0000) >> 16);
    SPI_WriteByte((addr & 0xFF00) >> 8);
    SPI_WriteByte(addr & 0xFF);
        for (i = 0; i < len; i++)
        {
                SPI_WriteByte(buffer[ i]);
        }        
    SPI_CE_High();                      // disable device
        while(CheckFlashBusy() > 0);
        FlashWriteDisable();
}

//////////////////////////////////主函數//////////////


code const unsigned char arr[200] = {
        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,
        0X00,        0X04,        0X00,        0X00,        0X00,        0X04,        0X00,        0X70,        0X00,        0X40,
        0X04,        0X00,        0X04,        0X00,        0X04,        0X00,        0X07,        0X00,        0X00,        0X00,
        0X00,        0X04,        0X00,        0X00,        0X70,        0X00,        0X07,        0X00,        0X00,        0X00,
        0X00,        0X00,        0X00,        0X07,        0X70,        0X00,        0X77,        0X00,        0X00,        0X00,
        0X00,        0X00,        0X70,        0X07,        0X77,        0X77,        0X77,        0X77,        0X00,        0X00,
        0X00,        0X00,        0X07,        0X77,        0X77,        0X77,        0X77,        0X70,        0X70,        0X00,
        0X00,        0X77,        0X77,        0X00,        0X00,        0X77,        0X77,        0X00,        0X00,        0X00,
        0X00,        0X00,        0X70,        0X70,        0X00,        0X77,        0X77,        0X00,        0X00,        0X00,
        0X00,        0X07,        0X70,        0X70,        0X00,        0X07,        0X77,        0X00,        0X07,        0X00,
        0X07,        0X77,        0X00,        0X00,        0X00,        0X07,        0X77,        0X70,        0X70,        0X00,
        0X00,        0X70,        0X00,        0X40,        0X00,        0X07,        0X77,        0X77,        0X00,        0X00,
        0X00,        0X00,        0X00,        0X00,        0X40,        0X07,        0X77,        0X77,        0X00,        0X00,
        0X00,        0X40,        0X00,        0X00,        0X00,        0X07,        0X77,        0X77,        0X00,        0X00,
        0X00,        0X00,        0X00,        0X00,        0X00,        0X07,        0X70,        0X77,        0X70,        0X00,
        0X00,        0X00,        0X00,        0X40,        0X00,        0X07,        0X00,        0X00,        0X07,        0X00,
        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,
        0X00,        0X00,        0X40,        0X00,        0X40,        0X00,        0X00,        0X00,        0X00,        0X00,
        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X40,        0X00,        0X00,
        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,        0X00,

};

void main(void)
{
        xdata unsigned char read_dat[256];
//        EA = 1;
        UartInit();
        io_init();
    SPI_init();
    FlashCheckID();
        FlashSectorErase(0x011000); //每次可以擦除一個扇區。4KB
        delay_ms(500);
        SPI_Write_Nbytes(0x011000,arr,200);
        delay_ms(100);
        SPI_Read_Nbytes(0x011000, read_dat,200);  
        delay_ms(100);
        UartSend(read_dat,200);
        
        P03=0;
        while(1);
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:226055 發表于 2024-4-10 09:26 | 只看該作者
    1、不知你的硬件連接是怎樣的,一定注意假如使用的是外部FLASH模塊,然后與單片機之間連接盡可能不要使用杜邦線。個人有測試過,杜邦線會導致讀取數據失敗。、
    2、排除硬件問題,還要考慮操作問題,那就是在寫數據之前一定要先擦除(即將存儲區域數據置為1),因為FLASH的特點是可將存儲數據1變為0,但沒辦法實現從0變為1。
    3、要考慮軟件設計的問題,下面給出的是艾克姆W25Q128的程序(兼容W25Q64)供參考,PDF文檔寫得非常好,附件和程序一起供參考。


spi_w25q128_sw.rar

26.13 KB, 下載次數: 6

實驗2-13:SPI總線的應用.pdf

2.56 MB, 下載次數: 3

回復

使用道具 舉報

板凳
ID:1104542 發表于 2024-4-10 13:50 | 只看該作者
cocolala 發表于 2024-4-10 09:26
1、不知你的硬件連接是怎樣的,一定注意假如使用的是外部FLASH模塊,然后與單片機之間連接盡可能不要使 ...

謝謝大佬,我來根據你發的測試下
回復

使用道具 舉報

地板
ID:1104542 發表于 2024-4-10 21:37 | 只看該作者
cocolala 發表于 2024-4-10 09:26
1、不知你的硬件連接是怎樣的,一定注意假如使用的是外部FLASH模塊,然后與單片機之間連接盡可能不要使 ...

按這個例程是w25q64剛寫入可以讀取,其他地址多寫幾次之后,開始的就讀不出來了顯示的FF,換了一個也一樣,但最后一次寫入的可以讀出來
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91免费看片 | 国产一区91精品张津瑜 | 国产在视频一区二区三区吞精 | 日本色综合 | 成人免费看片 | 色综合一区 | 一区二区在线看 | 五月天天丁香婷婷在线中 | 91免费观看 | 国产高清一二三区 | 蜜臀久久99精品久久久久野外 | 久久久久一区二区三区 | 欧美一级视频在线观看 | 在线激情视频 | 五月天综合网 | 亚洲品质自拍视频 | 亚洲一区二区三区在线观看免费 | 亚洲成人av一区二区 | 亚洲精品一二区 | a级在线免费观看 | 成人在线精品视频 | 欧美老少妇一级特黄一片 | 午夜影院| 97超碰人人| 久久久久久久久久久丰满 | 精品国产色 | 欧美激情一区二区三级高清视频 | 特级生活片 | 伊人色综合久久天天五月婷 | 狠狠草视频 | 亚洲一区二区三区在线播放 | 日韩一二区 | 麻豆一区一区三区四区 | 欧美精品久久久久久久久久 | 精品久久久久久亚洲精品 | 国产视频一区在线 | 亚洲伊人久久综合 | 久久久2o19精品 | 激情福利视频 | 欧美精品一区三区 | 亚洲一区二区三区在线播放 |