w25q32.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "gd32f10x.h"
  2. #include "spi.h"
  3. #include "w25q32.h"
  4. /*-------------------------------------------------*/
  5. /*函数名:初始化W25Q32 */
  6. /*参 数:无 */
  7. /*返回值:无 */
  8. /*-------------------------------------------------*/
  9. void W25Q32_Init(void)
  10. {
  11. rcu_periph_clock_enable(RCU_GPIOA); //打开GPIOA时钟
  12. gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_4); //设置PA4,PP输出,控制CS引脚
  13. CS_DISENABLE; //关闭CS
  14. SPI0_Init(); //初始化SPI0
  15. }
  16. /*-------------------------------------------------*/
  17. /*函数名:等待W25Q32空闲 */
  18. /*参 数:无 */
  19. /*返回值:无 */
  20. /*-------------------------------------------------*/
  21. void W25Q32_WaitBusy(void)
  22. {
  23. uint8_t res; //保存返回值
  24. do{ //循环等待
  25. CS_ENABLE; //打开CS
  26. SPI0_ReadWriteByte(0x05); //发送命令0x05
  27. res = SPI0_ReadWriteByte(0xff); //发送一个字节,从而才能读取一个字节,也就是W25Q32状态寄存器1的数据
  28. CS_DISENABLE; //关闭CS
  29. }while((res&0x01)==0x01); //等到BIT0成0,退出while循环,说明W25Q32空闲了
  30. }
  31. /*-------------------------------------------------*/
  32. /*函数名:W25Q32写使能 */
  33. /*参 数:无 */
  34. /*返回值:无 */
  35. /*-------------------------------------------------*/
  36. void W25Q32_Enable(void)
  37. {
  38. W25Q32_WaitBusy(); //等待W25Q32空闲
  39. CS_ENABLE; //打开CS
  40. SPI0_ReadWriteByte(0x06); //发送命令0x06
  41. CS_DISENABLE; //关闭CS
  42. }
  43. /*-------------------------------------------------*/
  44. /*函数名:W25Q32擦除一个64K大小的块 */
  45. /*参 数:blockNB:块编号从0开始 */
  46. /*返回值:无 */
  47. /*-------------------------------------------------*/
  48. void W25Q32_Erase64K(uint8_t blockNB)
  49. {
  50. uint8_t wdata[4]; //保存命令和地址
  51. wdata[0] = 0xD8; //擦除指令0xD8
  52. wdata[1] = (blockNB*64*1024)>>16; //需要擦除的块的地址
  53. wdata[2] = (blockNB*64*1024)>>8; //需要擦除的块的地址
  54. wdata[3] = (blockNB*64*1024)>>0; //需要擦除的块的地址
  55. W25Q32_WaitBusy(); //等待W25Q32空闲
  56. W25Q32_Enable(); //使能
  57. CS_ENABLE; //打开CS
  58. SPI0_Write(wdata,4); //把wdata发送给W25Q32
  59. CS_DISENABLE; //关闭CS
  60. W25Q32_WaitBusy(); //等待W25Q32空闲吗,确保擦除完毕后再退出W25Q32_Erase64K子函数
  61. }
  62. /*--------------------------------------------------------*/
  63. /*函数名:W25Q32写入一页数据(256字节) */
  64. /*参 数:wbuff:写入数据指针 pageNB:页编号从0开始 */
  65. /*返回值:无 */
  66. /*--------------------------------------------------------*/
  67. void W25Q32_PageWrite(uint8_t *wbuff, uint16_t pageNB)
  68. {
  69. uint8_t wdata[4]; //保存命令和地址
  70. wdata[0] = 0x02; //页写入数据指令0x02
  71. wdata[1] = (pageNB*256)>>16; //需要写入数据的页地址
  72. wdata[2] = (pageNB*256)>>8; //需要写入数据的页地址
  73. wdata[3] = (pageNB*256)>>0; //需要写入数据的页地址
  74. W25Q32_WaitBusy(); //等待W25Q32空闲
  75. W25Q32_Enable(); //使能
  76. CS_ENABLE; //打开CS
  77. SPI0_Write(wdata,4); //把wdata发送给W25Q32
  78. SPI0_Write(wbuff,256); //接着发送256字节(一页)的数据
  79. CS_DISENABLE; //关闭CS
  80. }
  81. /*-----------------------------------------------------------------*/
  82. /*函数名:W25Q32读取数据 */
  83. /*参 数:rbuff:接收缓冲区 addr:读取地址 datalen:读取长度 */
  84. /*返回值:无 */
  85. /*-----------------------------------------------------------------*/
  86. void W25Q32_Read(uint8_t *rbuff, uint32_t addr, uint32_t datalen)
  87. {
  88. uint8_t wdata[4]; //保存命令和地址
  89. wdata[0] = 0x03; //读取数据指令0x03
  90. wdata[1] = (addr)>>16; //读取数据的地址
  91. wdata[2] = (addr)>>8; //读取数据的地址
  92. wdata[3] = (addr)>>0; //读取数据的地址
  93. W25Q32_WaitBusy(); //等待W25Q32空闲
  94. CS_ENABLE; //打开CS
  95. SPI0_Write(wdata,4); //把wdata发送给W25Q32
  96. SPI0_Read(rbuff,datalen); //读取datalen个字节数据
  97. CS_DISENABLE; //关闭CS
  98. }