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

標(biāo)題: w25q64數(shù)據(jù)讀取全是ff,應(yīng)該是沒寫入不進(jìn)去,單片機(jī)程序在下面各位看下 [打印本頁]

作者: djjcgqss    時間: 2024-4-10 00:22
標(biāo)題: w25q64數(shù)據(jù)讀取全是ff,應(yīng)該是沒寫入不進(jìn)去,單片機(jī)程序在下面各位看下
大佬們來看一下,
單片機(jī)源程序如下:
#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是否準(zhǔn)備就緒
入口參數(shù): 無
出口參數(shù):
    0 : 沒有檢測到正確的Flash
    1 : Flash準(zhǔn)備就緒
************************************************/
void FlashCheckID(void)
{
        u16 ID,ID1,ID2;
    SPI_CE_Low();
    SPI_WriteByte(SFC_RDID);        //發(fā)送讀取ID命令
    SPI_WriteByte(0x00);            //空讀3個字節(jié)
    SPI_WriteByte(0x00);
    SPI_WriteByte(0x00);
    ID = SPI_ReadByte();         //讀取制造商ID1
    ID1  = SPI_ReadByte();         //讀取設(shè)備ID
    ID2 = SPI_ReadByte();         //讀取制造商ID2
    SPI_CE_High();
        printf("ID:%x,ID1:%x,ID2:%x\r\n",ID,ID1,ID2);
}


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

    SPI_CE_Low();
    SPI_WriteByte(SFC_RDSR);        //發(fā)送讀取狀態(tài)命令
    dat = SPI_ReadByte();           //讀取狀態(tài)
    SPI_CE_High();

    return (dat);                   //狀態(tài)值的Bit0即為忙標(biāo)志
}

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

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

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


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

/************************************************
從Flash中讀取數(shù)據(jù)
入口參數(shù):
    addr   : 地址參數(shù)
    buffer : 緩沖從Flash中讀取的數(shù)據(jù)
    len   : 數(shù)據(jù)塊大小
出口參數(shù):
    無
************************************************/
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個字節(jié),跟指定的數(shù)據(jù)進(jì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]);        //設(shè)置起始地址
    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;
}


/************************************************
寫數(shù)據(jù)到Flash中
入口參數(shù):
    addr   : 地址參數(shù)
    buffer : 緩沖需要寫入Flash的數(shù)據(jù)
    len   : 數(shù)據(jù)塊大小
出口參數(shù): 無
************************************************/
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);        // 發(fā)送頁編程命令
        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();
}

//////////////////////////////////主函數(shù)//////////////


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); //每次可以擦除一個扇區(qū)。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);
}


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


spi_w25q128_sw.rar

26.13 KB, 下載次數(shù): 6

實(shí)驗(yàn)2-13:SPI總線的應(yīng)用.pdf

2.56 MB, 下載次數(shù): 3


作者: djjcgqss    時間: 2024-4-10 13:50
cocolala 發(fā)表于 2024-4-10 09:26
1、不知你的硬件連接是怎樣的,一定注意假如使用的是外部FLASH模塊,然后與單片機(jī)之間連接盡可能不要使 ...

謝謝大佬,我來根據(jù)你發(fā)的測試下
作者: djjcgqss    時間: 2024-4-10 21:37
cocolala 發(fā)表于 2024-4-10 09:26
1、不知你的硬件連接是怎樣的,一定注意假如使用的是外部FLASH模塊,然后與單片機(jī)之間連接盡可能不要使 ...

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




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: a天堂在线 | 九九九久久国产免费 | 亚洲欧美日韩精品久久亚洲区 | 中文字幕国产第一页 | 国产视频精品免费 | 久久久久亚洲精品 | 一区二区三区欧美 | 国产亚洲精品精品国产亚洲综合 | 在线观看日韩 | 国产精品久久 | 精品久久久久久久久久 | 国产精品免费av | 久久精品国产一区 | 日本高清中文字幕 | 在线欧美一区二区 | 久久久久国产一区二区三区 | 久久天天躁狠狠躁夜夜躁2014 | 中文字幕亚洲区一区二 | 欧美a v在线| 亚洲精品一区二区三区在线 | 操久久 | 精品国产乱码一区二区三区 | 国产99免费 | 亚洲精品久久久久久下一站 | 欧美日本韩国一区二区 | 亚洲 欧美 另类 综合 偷拍 | 午夜一级做a爰片久久毛片 精品综合 | 日本黄色免费大片 | 日韩一区二区三区视频在线观看 | 国产欧美精品区一区二区三区 | 亚洲成人www| 欧美国产日韩在线观看成人 | 国产精品69久久久久水密桃 | 精品中文在线 | 欧美一区二区三区在线观看 | 亚洲成人999 | 国产 亚洲 网红 主播 | 亚洲一区二区三区免费视频 | 色视频一区二区 | 天堂资源最新在线 | 欧美电影大全 |