4回答

0收藏

【SOM9331】修砖记(2)——FLASH裸刷固件

其他 其他 7168 人阅读 | 4 人回复 | 2015-09-13

本帖最后由 dvd1478 于 2015-9-13 23:45 编辑


【SOM9331】修改砖(1)——EJTAG失败
https://www.cirmall.com/bbs/forum ... 44045&fromuid=23447

提到修砖的方法有两种,1、用EJTAG ;2、给Winbond 25Q64FV 重新刷入固件
两者的原理都是一样重新刷入UBOOT 到FLASH中。

板子没有引出EJTAG接口,剩下的方法是用直接给W25Q64FV 刷入UBOOT
UBOOT 文件
u-boot-ar9331.rar (80.58 KB, 下载次数: 20)


使用FLASH编程器,可惜我手头上没有,只能使用其他的单片机直接操作W25Q64FV
再看回核芯片的原理图 用的是MX25L6445E 但实质上是W25Q64FV,但不用担心
两者的引脚功能是一样的。问题不大。



开始是并没有折下FLASH,直接通过飞线 SPI_CS0、 SPI_MISO、SPI_CLK、SPI_MOSI、电源、地 六跟线与STM32F107相接的
但是结果是只能正确读取ID,花了很长时间调试,读写数据一直不正确,写的与读到不相同。

后果查看DATASHEET


猜想是AR9331 引起的问题。最后只能把FLASH芯片折下来,STM32F107 直接对其操作。

折下来就成功了。

代码如下:
  1. #include "W25Q64.h"

  2. //W25X系列/Q系列芯片列表
  3. #define W25Q80  0XEF13
  4. #define W25Q16  0XEF14
  5. #define W25Q32  0XEF15
  6. #define W25Q64  0XEF16

  7. //W25Q64
  8. #define SPI_FLASH_SectorSize            (4*1024)
  9. #define SPI_FLASH_BlockSize             (32*1024)
  10. #define SPI_FLASH_PageSize              256 //Program 1 to 256 byte per programmable pag
  11. #define SPI_FLASH_PerWritePageSize      SPI_FLASH_PageSize

  12. //指令表
  13. #define W25X_WriteEnable        0x06
  14. #define W25X_WriteDisable       0x04
  15. #define W25X_ReadStatusReg      0x05
  16. #define W25X_WriteStatusReg     0x01
  17. #define W25X_ReadData           0x03
  18. #define W25X_FastReadData       0x0B
  19. #define W25X_FastReadDual       0x3B
  20. #define W25X_PageProgram        0x02
  21. #define W25X_32KBlockErase      0x52
  22. #define W25X_64KBlockErase      0xD8
  23. #define W25X_SectorErase        0x20
  24. #define W25X_ChipErase          0xC7
  25. #define W25X_PowerDown          0xB9
  26. #define W25X_ReleasePowerDown   0xAB
  27. #define W25X_DeviceID           0xAB
  28. #define W25X_ManufactDeviceID   0x90
  29. #define W25X_JedecDeviceID      0x9F

  30. #define W25X_WIP_Flag           0x01  /* Write In Progress (WIP) flag */

  31. #define W25X_Dummy_Byte         0xFF


  32. #include "gpio.h"
  33. #include "spi.h"


  34. #define SPI_FLASH_CS_LOW()
  35. #define SPI_FLASH_CS_HIGH()


  36. static uint8_t SPI_FLASH_SendByte(uint8_t byte)
  37. {
  38. /* 输入为  写数据
复制代码
直接把UBOOT 刷入W25Q64FV 的0地址的空间,就可以。

单片机的很简单,直接支持SPI功能的就可以,或者用GPIO模拟也没有问题
上面的代码,只要简单修改
#define SPI_FLASH_CS_LOW()
#define SPI_FLASH_CS_HIGH()

static uint8_t SPI_FLASH_SendByte(uint8_t byte)
{
/* 输入为  写数据
   输出 为 读数据
*/
}

就可以使用

当然如果不想做得复杂,单片机选择FLASH大一些,把U-BOOT 一起烧到单片机中,再烧写入W25Q64FV中也是可以
附件中UBOOT 对应的数组文件
u-boot-ar9331.h.rar (131.08 KB, 下载次数: 12)

直接写入W25Q64FV中即可




分享到:
回复

使用道具 举报

回答|共 4 个

倒序浏览

沙发

党国特派员

发表于 2015-9-14 10:56:35 | 只看该作者

膜拜一下。。。
喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
板凳

魅影-2023106

发表于 2015-9-14 11:43:48 | 只看该作者

好 很好的资料
地板

zhengzhirui

发表于 2015-9-15 10:54:54 | 只看该作者

挺实用,,,
5#

c_cai_niao

发表于 2017-4-10 10:30:03 | 只看该作者

谢谢楼主的无私分享
您需要登录后才可以回帖 注册/登录

本版积分规则

1544 积分
99 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条