W25Q32 芯片只能识别 0x9F 指令

[复制链接]
1746|2
 楼主| love8023 发表于 2018-3-13 17:29 | 显示全部楼层 |阅读模式
      各位猿友们好!
      小生最近在研究 W25Q32 芯片, 经 SPI 操作该芯片时, 只有 0x9F 指令返回的数据
正常, 其余的指令均返回 0xFF.
      MCU 采用新唐的 NUC126.
      以下是部分源代码, 希望理解的朋友给点思路或者解决方案, 谢谢!


  1. #include "W25Qxx.h"

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

  7. void W25Qxx_Reset(void)
  8. {
  9.         SPI_SET_SS_LOW(SPI1);
  10.         SPI_WRITE_TX(SPI1, 0xFF);
  11. //        SPI_WRITE_TX(SPI1, 0xFF);
  12.         SPI_SET_SS_HIGH(SPI1);
  13. }

  14. void W25Qxx_Write_Enable(void)
  15. {
  16.         SPI_SET_SS_LOW(SPI1);
  17.         SPI_WRITE_TX(SPI1, W25Qxx_WR_ENABLE);
  18.         SPI_SET_SS_HIGH(SPI1);
  19. }
  20.        
  21. void W25Qxx_Write_Disable(void)
  22. {
  23.         SPI_SET_SS_LOW(SPI1);
  24.         SPI_WRITE_TX(SPI1, W25Qxx_WR_DISABLE);
  25.         SPI_SET_SS_HIGH(SPI1);
  26. }

  27. void W25Qxx_Get_JEDEC_ID(void)       
  28. {
  29.         SPI_SET_SS_LOW(SPI1);
  30.         SPI_WRITE_TX(SPI1, W25Qxx_JEDEC_ID);        // 0x9F
  31.         SPI_WRITE_TX(SPI1, 0x00);
  32.         SPI_WRITE_TX(SPI1, 0x00);
  33.         SPI_WRITE_TX(SPI1, 0x00);
  34.        
  35.         uint32_t i = 0;
  36.         w25q_debug();
  37.         for(i = 0; i < 4; i++)
  38.         {
  39.                 printf("%x ", SPI_READ_RX(SPI1));
  40.         }
  41.         printf("\n");
  42.         SPI_SET_SS_HIGH(SPI1);
  43. }

  44. void W25Qxx_Get_Unique_ID(void)       
  45. {
  46.         SPI_SET_SS_LOW(SPI1);
  47.         SPI_WRITE_TX(SPI1, W25Qxx_RD_UNIQUE_ID);        // 0x4B
  48.         SPI_WRITE_TX(SPI1, 0x00);
  49.         SPI_WRITE_TX(SPI1, 0x00);
  50.         SPI_WRITE_TX(SPI1, 0x00);
  51.         SPI_WRITE_TX(SPI1, 0x00);
  52.        
  53.         uint32_t i = 0;
  54.         for(i = 0; i < 8; i++)
  55.         {
  56.                 SPI_WRITE_TX(SPI1, 0x00);
  57.         }
  58.        
  59.         w25q_debug();
  60.         for(i = 0; i < 13; i++)
  61.         {
  62.                 printf("%x ", SPI_READ_RX(SPI1));
  63.         }
  64.         printf("\n");
  65.         SPI_SET_SS_HIGH(SPI1);
  66. }

  67. void W25Qxx_Get_Manufacturer(void)
  68. {
  69.         SPI_SET_SS_LOW(SPI1);
  70.         SPI_WRITE_TX(SPI1, W25Qxx_MANUFACTURER_ID);        //        0x90
  71.         SPI_WRITE_TX(SPI1, 0x00);
  72.         SPI_WRITE_TX(SPI1, 0x00);
  73.         SPI_WRITE_TX(SPI1, 0x00);
  74.        
  75.         uint32_t i = 0;
  76.         w25q_debug();
  77.         for(i = 0; i < 2; i++)
  78.         {
  79.                 printf("%x ", SPI_READ_RX(SPI1));
  80.         }
  81.         printf("\n");
  82.         SPI_SET_SS_HIGH(SPI1);
  83. }

  84. uint8_t W25Qxx_Get_Status_REG1(void)
  85. {
  86.         SPI_SET_SS_LOW(SPI1);
  87.         SPI_WRITE_TX(SPI1, W25Qxx_RD_STATUS_REG1);
  88.        
  89.         uint8_t rx = SPI_READ_RX(SPI1);
  90.         w25q_debug("%x\n", rx);
  91.         SPI_SET_SS_HIGH(SPI1);
  92.         return rx;
  93. }

  94. uint8_t W25Qxx_Get_Status_REG2(void)
  95. {
  96.         SPI_SET_SS_LOW(SPI1);
  97.         SPI_WRITE_TX(SPI1, W25Qxx_RD_STATUS_REG2);
  98.         SPI_WRITE_TX(SPI1, 0x00);
  99.        
  100.         uint8_t rx = SPI_READ_RX(SPI1);
  101.         w25q_debug("%x\n", rx);
  102.         SPI_SET_SS_HIGH(SPI1);
  103.        
  104.         return rx;
  105. }

  106. void W25Qxx_Is_Busy(void)
  107. {
  108.         while(0x01 & W25Qxx_Get_Status_REG1());
  109. }

  110. void W25Qxx_Page_Write(uint32_t addr, uint8_t* buf, uint32_t len)
  111. {
  112.         while(SPI_IS_BUSY(SPI1));
  113.         SPI_SET_SS_LOW(SPI1);
  114.        
  115.         SPI_WRITE_TX(SPI1, W25Qxx_PAGE_PROGRAM);
  116.         SPI_WRITE_TX(SPI1, (addr >> 16) & 0xff);
  117.         SPI_WRITE_TX(SPI1, (addr >> 8) & 0xff);
  118.         SPI_WRITE_TX(SPI1, (addr >> 0) & 0xff);
  119.        
  120.         uint32_t i = 0;
  121.         w25q_debug();
  122.         for(; i < len; i++)
  123.         {
  124.                 SPI_WRITE_TX(SPI1, buf[i]);
  125.                 printf("%x ", buf[i]);
  126.         }
  127.         printf("\n");
  128.        
  129.         SPI_SET_SS_HIGH(SPI1);
  130. }
  131.        
  132. void W25Qxx_Read_Data(uint32_t addr, uint8_t* buf, uint32_t len)
  133. {
  134.         while(SPI_IS_BUSY(SPI1));
  135.         SPI_SET_SS_LOW(SPI1);
  136.        
  137.         SPI_WRITE_TX(SPI1, W25Qxx_PAGE_PROGRAM);
  138.         SPI_WRITE_TX(SPI1, (addr >> 16) & 0xff);
  139.         SPI_WRITE_TX(SPI1, (addr >> 8) & 0xff);
  140.         SPI_WRITE_TX(SPI1, (addr >> 0) & 0xff);
  141.        
  142.         uint32_t i = 0;
  143.         w25q_debug();
  144.         for(; i < len; i++)
  145.         {
  146.                 buf[i] = SPI_READ_RX(SPI1);
  147.                 printf("%x ", buf[i]);
  148.         }
  149.         printf("\n");
  150.        
  151.         SPI_SET_SS_HIGH(SPI1);
  152. }
dirtwillfly 发表于 2018-3-14 11:15 | 显示全部楼层
这东西,代码看不错什么的。
建议手里要有个逻辑分*析仪,最便宜的那种就行。或者有带存储的示波器。
观察着时序,对照手册慢慢调
零三翟邢止胃 发表于 2019-3-21 11:32 | 显示全部楼层
建议手里要有个逻辑分*析仪,最便宜的那种就行。或者有带存储的示波器。
观察着时序,对照手册慢慢调
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

12

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部