打印

W25Q32 芯片只能识别 0x9F 指令

[复制链接]
1394|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
love8023|  楼主 | 2018-3-13 17:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      各位猿友们好!
      小生最近在研究 W25Q32 芯片, 经 SPI 操作该芯片时, 只有 0x9F 指令返回的数据
正常, 其余的指令均返回 0xFF.
      MCU 采用新唐的 NUC126.
      以下是部分源代码, 希望理解的朋友给点思路或者解决方案, 谢谢!


#include "W25Qxx.h"

#if 1
#define w25q_debug(fmt, ...) printf("%s-%d: "fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define w25q_debug(fmt, ...)
#endif

void W25Qxx_Reset(void)
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, 0xFF);
//        SPI_WRITE_TX(SPI1, 0xFF);
        SPI_SET_SS_HIGH(SPI1);
}

void W25Qxx_Write_Enable(void)
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_WR_ENABLE);
        SPI_SET_SS_HIGH(SPI1);
}
       
void W25Qxx_Write_Disable(void)
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_WR_DISABLE);
        SPI_SET_SS_HIGH(SPI1);
}

void W25Qxx_Get_JEDEC_ID(void)       
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_JEDEC_ID);        // 0x9F
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
       
        uint32_t i = 0;
        w25q_debug();
        for(i = 0; i < 4; i++)
        {
                printf("%x ", SPI_READ_RX(SPI1));
        }
        printf("\n");
        SPI_SET_SS_HIGH(SPI1);
}

void W25Qxx_Get_Unique_ID(void)       
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_RD_UNIQUE_ID);        // 0x4B
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
       
        uint32_t i = 0;
        for(i = 0; i < 8; i++)
        {
                SPI_WRITE_TX(SPI1, 0x00);
        }
       
        w25q_debug();
        for(i = 0; i < 13; i++)
        {
                printf("%x ", SPI_READ_RX(SPI1));
        }
        printf("\n");
        SPI_SET_SS_HIGH(SPI1);
}

void W25Qxx_Get_Manufacturer(void)
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_MANUFACTURER_ID);        //        0x90
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
        SPI_WRITE_TX(SPI1, 0x00);
       
        uint32_t i = 0;
        w25q_debug();
        for(i = 0; i < 2; i++)
        {
                printf("%x ", SPI_READ_RX(SPI1));
        }
        printf("\n");
        SPI_SET_SS_HIGH(SPI1);
}

uint8_t W25Qxx_Get_Status_REG1(void)
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_RD_STATUS_REG1);
       
        uint8_t rx = SPI_READ_RX(SPI1);
        w25q_debug("%x\n", rx);
        SPI_SET_SS_HIGH(SPI1);
        return rx;
}

uint8_t W25Qxx_Get_Status_REG2(void)
{
        SPI_SET_SS_LOW(SPI1);
        SPI_WRITE_TX(SPI1, W25Qxx_RD_STATUS_REG2);
        SPI_WRITE_TX(SPI1, 0x00);
       
        uint8_t rx = SPI_READ_RX(SPI1);
        w25q_debug("%x\n", rx);
        SPI_SET_SS_HIGH(SPI1);
       
        return rx;
}

void W25Qxx_Is_Busy(void)
{
        while(0x01 & W25Qxx_Get_Status_REG1());
}

void W25Qxx_Page_Write(uint32_t addr, uint8_t* buf, uint32_t len)
{
        while(SPI_IS_BUSY(SPI1));
        SPI_SET_SS_LOW(SPI1);
       
        SPI_WRITE_TX(SPI1, W25Qxx_PAGE_PROGRAM);
        SPI_WRITE_TX(SPI1, (addr >> 16) & 0xff);
        SPI_WRITE_TX(SPI1, (addr >> 8) & 0xff);
        SPI_WRITE_TX(SPI1, (addr >> 0) & 0xff);
       
        uint32_t i = 0;
        w25q_debug();
        for(; i < len; i++)
        {
                SPI_WRITE_TX(SPI1, buf[i]);
                printf("%x ", buf[i]);
        }
        printf("\n");
       
        SPI_SET_SS_HIGH(SPI1);
}
       
void W25Qxx_Read_Data(uint32_t addr, uint8_t* buf, uint32_t len)
{
        while(SPI_IS_BUSY(SPI1));
        SPI_SET_SS_LOW(SPI1);
       
        SPI_WRITE_TX(SPI1, W25Qxx_PAGE_PROGRAM);
        SPI_WRITE_TX(SPI1, (addr >> 16) & 0xff);
        SPI_WRITE_TX(SPI1, (addr >> 8) & 0xff);
        SPI_WRITE_TX(SPI1, (addr >> 0) & 0xff);
       
        uint32_t i = 0;
        w25q_debug();
        for(; i < len; i++)
        {
                buf[i] = SPI_READ_RX(SPI1);
                printf("%x ", buf[i]);
        }
        printf("\n");
       
        SPI_SET_SS_HIGH(SPI1);
}

相关帖子

沙发
dirtwillfly| | 2018-3-14 11:15 | 只看该作者
这东西,代码看不错什么的。
建议手里要有个逻辑分*析仪,最便宜的那种就行。或者有带存储的示波器。
观察着时序,对照手册慢慢调

使用特权

评论回复
板凳
零三翟邢止胃| | 2019-3-21 11:32 | 只看该作者
建议手里要有个逻辑分*析仪,最便宜的那种就行。或者有带存储的示波器。
观察着时序,对照手册慢慢调

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

粉丝