当前位置:   article > 正文

w25qxx spi flash WP写保护引脚的正确使用方式_spi flash写保护

spi flash写保护

WP引脚使用方式

spi flash有一个外部写保护引脚WP, 此引脚并不是直接保护flash上的数据内容,而是保护状态寄存器不被异常改写.flash上的内容写保护是通过状态寄存器的BPxbit的不同组合来实现的. 对于环境相对恶劣的使用场景(供电不稳等.)需要对flash上的内容加以保护.整体的设计思路就是 使用状态寄存器的BPx位组合实现flash上数据内容的局部或整体写保护. 外部WP引脚的电平状态结合状态寄存器的SRP位实现状态寄存器的保护进而间接保护flash上受保护的数据内容.

通过BPx位组合实现的flash写保护,其实是把flash受保护区域置为了只读状态. 这种情况下除非改变flash状态寄存器的BPx位,解除写保护,否则无法擦写受保护区域.

针对相对重要或者是基本不会变动的数据,比如字库等,就可以放置在flash的受保护区域,作为只读数据存在.确保恶劣条件下数据的稳定性.

关键寄存器描述

这里仅贴出一些关键的寄存器,更详细的描述还需要参考数据手册.

状态寄存器写保护测试

通过状态寄存器的写保护位配合外部WP引脚状态,达到状态寄存器的写保护效果.

  1. #define WP_HIGH() GPIO_Set_Output_Data_Bits(GPIOC_SFR,GPIO_PIN_MASK_0,Bit_SET)
  2. #define WP_LOW() GPIO_Set_Output_Data_Bits(GPIOC_SFR,GPIO_PIN_MASK_0,Bit_RESET)
  3. #define SPI_FLASH_RDSR 0x05 /* read status register */
  4. #define SPI_FLASH_WRSR 0x01 /* write status register */
  5. static uint8_t flash_readstatus(uint8_t addr)
  6. {
  7. uint8_t datain, i;
  8. SPI_FLASH_ENABLE();
  9. SpiWrite(&addr, 1);
  10. datain = SpiReadByte();
  11. SPI_FLASH_DISABLE();
  12. return datain;
  13. }
  14. static void flash_writestatus(uint8_t addr, uint8_t status)
  15. {
  16. uint8_t dataout[2] = {0};
  17. SpiSimpleCmd(SPI_FLASH_WREN);
  18. dataout[0] = addr;
  19. dataout[1] = status;
  20. SPI_FLASH_ENABLE();
  21. SpiWrite(dataout, 2);
  22. SPI_FLASH_DISABLE();
  23. while(1){
  24. if ((flash_readstatus(SPI_FLASH_RDSR) & 0x01) == 0) // 等待flash操作完成.
  25. break;
  26. delay_ms(5);
  27. }
  28. }
  29. uint8_t flash_statustest(void)
  30. {
  31. uint8_t get_data = 0;
  32. /*
  33. 写入0x80, 此时拉低WP引脚,即状态寄存器处于hardware protedted模式.状态寄存器不可写入.
  34. 拉高WP引脚, 状态寄存器处于hardware unprotected,状态寄存器可写.
  35. */
  36. get_data = flash_readstatus(SPI_FLASH_RDSR);
  37. uart_printf("status = 0x%x\r\n", get_data);
  38. flash_writestatus(SPI_FLASH_WRSR, 0x80);
  39. get_data = flash_readstatus(SPI_FLASH_RDSR);
  40. uart_printf("status = 0x%x\r\n", get_data);
  41. WP_LOW(); // 拉低时, 写入无效.
  42. flash_writestatus(SPI_FLASH_WRSR, 0x8C);
  43. get_data = flash_readstatus(SPI_FLASH_RDSR);
  44. uart_printf("status = 0x%x\r\n", get_data);
  45. WP_HIGH(); // 拉高时, 写入有效.
  46. flash_writestatus(SPI_FLASH_WRSR, 0x8C);
  47. get_data = flash_readstatus(SPI_FLASH_RDSR);
  48. uart_printf("status = 0x%x\r\n\r\n", get_data);
  49. }
  50. //打印结果
  51. status = 0x8c
  52. status = 0x80
  53. status = 0x80 // 拉低后写入0x8C无效 状态寄存器仍为0x80.
  54. status = 0x8c // 拉高后写入0x8C生效

flash数据内容写保护测试

通过BPx位组合实现的flash写保护,其实是把flash受保护区域置为了只读状态. 这种情况下除非改变flash状态寄存器的BPx位,解除写保护,否则无法擦写受保护区域.

  1. uint8_t flash_datatest(void)
  2. {
  3. uint8_t get_data = 0;
  4. uint8_t write_data[3] = {0x01,0x02,0x03};
  5. uint8_t read_data[3] = {0};
  6. /*
  7. 1.所有数据区域都不设置保护, 读写flash测试. 正常擦写.
  8. 2.所有数据区域都设置保护(flash数据区处于只读状态), 读写flash测试. 擦写无效.
  9. */
  10. WP_HIGH(); // 拉高时, 写入有效.
  11. flash_writestatus(SPI_FLASH_WRSR, 0x80);
  12. get_data = flash_readstatus(SPI_FLASH_RDSR);
  13. get_data = flash_readstatus(SPI_FLASH_RDSR);
  14. uart_printf("status = 0x%x\r\n", get_data); // 输出0x80
  15. /*
  16. 状态寄存器的BPx位组合不保护任何flash数据区域时, 无论外部WP引脚拉高还是拉低,
  17. 都数据都能正常写入.
  18. */
  19. WP_LOW();
  20. flash_sector_erase(0);
  21. flash_write(0, write_data, sizeof (write_data));
  22. flash_read(0, read_data, sizeof (read_data));
  23. uart_printf("get_data = 0x%x 0x%x 0x%x\r\n", read_data[0],read_data[1],read_data[2]);
  24. WP_HIGH();
  25. write_data[0] = 0x04;
  26. write_data[1] = 0x05;
  27. write_data[2] = 0x06;
  28. flash_sector_erase(0);
  29. flash_write(0, write_data, sizeof (write_data));
  30. flash_read(0, read_data, sizeof (read_data));
  31. uart_printf("get_data = 0x%x 0x%x 0x%x\r\n", read_data[0],read_data[1],read_data[2]);
  32. WP_HIGH();
  33. flash_writestatus(SPI_FLASH_WRSR, 0x9C); // 设置写保护所有扇区
  34. get_data = flash_readstatus(SPI_FLASH_RDSR);
  35. get_data = flash_readstatus(SPI_FLASH_RDSR);
  36. uart_printf("status = 0x%x\r\n", get_data); // 输出0x9C
  37. /*
  38. flash状态寄存器对所有的flash数据内容设置了写保护.此时无论外部引脚拉高还是拉低.
  39. 都无法对flash数据内容进行擦写. 必须解除写保护,才能正常擦写.
  40. */
  41. WP_HIGH();
  42. write_data[0] = 0x07;
  43. write_data[1] = 0x07;
  44. write_data[2] = 0x07;
  45. flash_sector_erase(0);
  46. flash_write(0, write_data, sizeof (write_data));
  47. flash_read(0, read_data, sizeof (read_data));
  48. uart_printf("get_data = 0x%x 0x%x 0x%x\r\n", read_data[0],read_data[1],read_data[2]);
  49. WP_LOW();
  50. write_data[0] = 0x07;
  51. write_data[1] = 0x07;
  52. write_data[2] = 0x07;
  53. flash_sector_erase(0);
  54. flash_write(0, write_data, sizeof (write_data));
  55. flash_read(0, read_data, sizeof (read_data));
  56. uart_printf("get_data = 0x%x 0x%x 0x%x\r\n", read_data[0],read_data[1],read_data[2]);
  57. /*
  58. 设置状态寄存器保护低8K数据.
  59. */
  60. WP_HIGH();
  61. flash_writestatus(SPI_FLASH_WRSR, 0xE8); // 设置写保护低8K数据
  62. get_data = flash_readstatus(SPI_FLASH_RDSR);
  63. get_data = flash_readstatus(SPI_FLASH_RDSR);
  64. uart_printf("status = 0x%x\r\n", get_data); // 输出0xE8
  65. /*
  66. 设置了保护低8K数据, 即低8K为只读.无法擦写.
  67. */
  68. write_data[0] = 0x07;
  69. write_data[1] = 0x07;
  70. write_data[2] = 0x07;
  71. flash_sector_erase(0);
  72. flash_write(0, write_data, sizeof (write_data));
  73. flash_read(0, read_data, sizeof (read_data));
  74. uart_printf("get_data = 0x%x 0x%x 0x%x\r\n", read_data[0],read_data[1],read_data[2]);
  75. /*
  76. 高于8K地址的数据不受保护,可正常擦写.
  77. */
  78. flash_sector_erase(0x1000*2);
  79. flash_write(0x1000*2, write_data, sizeof (write_data));
  80. flash_read(0x1000*2, read_data, sizeof (read_data));
  81. uart_printf("get_data = 0x%x 0x%x 0x%x\r\n", read_data[0],read_data[1],read_data[2]);
  82. // 打印结果.
  83. status = 0x80 // 未保护数据区域 flash正常擦写
  84. get_data = 0x1 0x2 0x3
  85. get_data = 0x4 0x5 0x6
  86. status = 0x9c // 保护全部区域 flash无法擦写 保持之前的值
  87. get_data = 0x4 0x5 0x6
  88. get_data = 0x4 0x5 0x6
  89. status = 0xe8 // 保护低8K 0地址保持之前的值 8K之后正常擦写.
  90. get_data = 0x4 0x5 0x6
  91. get_data = 0x7 0x7 0x7
  92. }

总结

本文对spi flash 的WP引脚做了相对深入的分析.结合数据手册给了其基本用法,读者如需更深入的用法, 还需结合数据手册进行深入分析.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/703993
推荐阅读
相关标签
  

闽ICP备14008679号