[DemoCode下载] MS51通过SPI读取W25Q16BV

[复制链接]
 楼主| wahahaheihei 发表于 2020-6-30 21:06 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2019 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Website: http://www.nuvoton.com
  8. //  E-Mail : MicroC-8bit@nuvoton.com
  9. //  Date   : Jun/21/2019
  10. //***********************************************************************************************************

  11. //***********************************************************************************************************
  12. //  File Function: MS51_8K Access SPI Flash (W25Q16BV) demo code
  13. //***********************************************************************************************************

  14. #include "MS51_32K.h"

  15. #define SS              P15
  16. #define WRITE_ENABLE    0x06
  17. #define WRITE_DISABLE   0x04
  18. #define READ_DATA       0x03
  19. #define PAGE_PROGRAM    0x02
  20. #define CHIP_ERASE      0xC7
  21. #define READ_STATUS1    0x05

  22. //-----------------------------------------------------------------------------------------------------------
  23. void SPI_Error(void)
  24. {
  25.     printf ("\n*  SPI Error, please check the connection between MCU and SPI Flash");
  26.     while(1);
  27. }
  28. //-----------------------------------------------------------------------------------------------------------
  29. void SPI_Initial(void)
  30. {

  31.     /* /SS General purpose I/O ( No Mode Fault ) */
  32.     set_SPSR_DISMODF;
  33.     clr_SPCR_SSOE;

  34.     /* SPI in Master mode */
  35.     set_SPCR_MSTR;

  36.     /* MSB first */
  37.     clr_SPCR_LSBFE;

  38.     clr_SPCR_CPOL;
  39.     clr_SPCR_CPHA;
  40.    
  41.     /* Enable SPI function */
  42.     set_SPCR_SPIEN;
  43. }
  44. //-----------------------------------------------------------------------------------------------------------
  45. void Read_MID_DID(UINT8 *pu8MID,UINT8 *pu8DID)
  46. {
  47.     SS = 0;
  48.     SPDR = 0x90;
  49.     while((SPSR&0x80)==0x00);
  50.     clr_SPSR_SPIF;

  51.     SPDR = 0x00;
  52.     while((SPSR&0x80)==0x00);
  53.     clr_SPSR_SPIF;

  54.     SPDR = 0x00;
  55.     while((SPSR&0x80)==0x00);
  56.     clr_SPSR_SPIF;

  57.     SPDR = 0x00;
  58.     while((SPSR&0x80)==0x00);
  59.     clr_SPSR_SPIF;

  60.     SPDR = 0xFF;
  61.     while((SPSR&0x80)==0x00);
  62.     *pu8MID = SPDR;
  63.     clr_SPSR_SPIF;

  64.     SPDR = 0xFF;
  65.     while((SPSR&0x80)==0x00);
  66.     *pu8DID = SPDR;
  67.     clr_SPSR_SPIF;
  68.     SS = 1;   
  69. }
  70. //-----------------------------------------------------------------------------------------------------------
  71. void Flash_Write_Enable(void)
  72. {
  73.     SS = 0;
  74.     SPDR = WRITE_ENABLE;
  75.     while((SPSR&0x80)==0x00);
  76.     clr_SPSR_SPIF;
  77.     SS = 1;   
  78. }
  79. //-----------------------------------------------------------------------------------------------------------
  80. void Flash_Write_Disable(void)
  81. {
  82.     SS = 0;
  83.     SPDR = WRITE_DISABLE;
  84.     while((SPSR&0x80)==0x00);
  85.     clr_SPSR_SPIF;
  86.     SS = 1;   
  87. }
  88. //-----------------------------------------------------------------------------------------------------------
  89. void Flash_Chip_Erase(void)
  90. {
  91.     SS = 0;
  92.     SPDR = CHIP_ERASE;
  93.     while((SPSR&0x80)==0x00);
  94.     clr_SPSR_SPIF;
  95.     SS = 1;   
  96. }
  97. //-----------------------------------------------------------------------------------------------------------
  98. void Flash_Read_Status(void)
  99. {
  100.     UINT8 u8Status;

  101.     SS = 0;
  102.     do{
  103.         SPDR = READ_STATUS1;
  104.         while((SPSR&0x80)==0x00);
  105.         clr_SPSR_SPIF;
  106.    
  107.         SPDR = 0xFF;
  108.         while((SPSR&0x80)==0x00);
  109.         u8Status = SPDR;
  110.         clr_SPSR_SPIF;
  111.     }while((u8Status&0x01)==0x01);
  112.     SS = 1;   
  113. }
  114. //-----------------------------------------------------------------------------------------------------------
  115. void Flash_Erase_Verify(void)
  116. {
  117.     UINT16 u16CNT;   
  118.     UINT8  u8Data;

  119.     SS = 0;

  120.     SPDR = READ_DATA;
  121.     while((SPSR&0x80)==0x00);
  122.     clr_SPSR_SPIF;

  123.     /* 24-bit Address */
  124.     SPDR = 0x00;
  125.     while((SPSR&0x80)==0x00);
  126.     clr_SPSR_SPIF;

  127.     SPDR = 0x00;
  128.     while((SPSR&0x80)==0x00);
  129.     clr_SPSR_SPIF;

  130.     SPDR = 0x00;
  131.     while((SPSR&0x80)==0x00);
  132.     clr_SPSR_SPIF;

  133.     for(u16CNT=0;u16CNT<256;u16CNT++)
  134.     {
  135.         SPDR = 0x00;
  136.         while((SPSR&0x80)==0x00);
  137.         u8Data = SPDR;
  138.         clr_SPSR_SPIF;
  139.         if(u8Data != 0xFF)
  140.         {
  141.             SPI_Error();
  142.         }
  143.     }

  144.     SS = 1;
  145. }
  146. //-----------------------------------------------------------------------------------------------------------
  147. void Flash_Program(void)
  148. {
  149.     UINT16 u16CNT;
  150.    
  151.     SS = 0;

  152.     SPDR = PAGE_PROGRAM;
  153.     while((SPSR&0x80)==0x00);
  154.     clr_SPSR_SPIF;

  155.     /* 24-bit Address */
  156.     SPDR = 0x00;
  157.     while((SPSR&0x80)==0x00);
  158.     clr_SPSR_SPIF;

  159.     SPDR = 0x00;
  160.     while((SPSR&0x80)==0x00);
  161.     clr_SPSR_SPIF;

  162.     SPDR = 0x00;
  163.     while((SPSR&0x80)==0x00);
  164.     clr_SPSR_SPIF;

  165.     /* Send the data to SPI_Flash buffer */
  166.     for(u16CNT=0;u16CNT<256;u16CNT++)
  167.     {
  168.         SPDR = (UINT8)u16CNT;
  169.         while((SPSR&0x80)==0x00);
  170.         clr_SPSR_SPIF;
  171.     }
  172.    
  173.     SS = 1;   
  174. }
  175. //-----------------------------------------------------------------------------------------------------------
  176. void Flash_Program_Verify(void)
  177. {
  178.     UINT16 u16CNT;   
  179.     UINT8  u8Data;

  180.     SS = 0;

  181.     SPDR = READ_DATA;
  182.     while((SPSR&0x80)==0x00);
  183.     clr_SPSR_SPIF;

  184.     /* 24-bit Address */
  185.     SPDR = 0x00;
  186.     while((SPSR&0x80)==0x00);
  187.     clr_SPSR_SPIF;

  188.     SPDR = 0x00;
  189.     while((SPSR&0x80)==0x00);
  190.     clr_SPSR_SPIF;

  191.     SPDR = 0x00;
  192.     while((SPSR&0x80)==0x00);
  193.     clr_SPSR_SPIF;

  194.     for(u16CNT=0;u16CNT<256;u16CNT++)
  195.     {
  196.         SPDR = 0x00;
  197.         while((SPSR&0x80)==0x00);
  198.         u8Data = SPDR;
  199.         clr_SPSR_SPIF;
  200.         if(u8Data != (UINT8)u16CNT)
  201.         {
  202.             SPI_Error();
  203.         }
  204.     }

  205.     SS = 1;
  206. }
  207. //-----------------------------------------------------------------------------------------------------------
  208. void main(void)
  209. {      
  210.     UINT8 u8MID,u8DID;

  211.     /* Note
  212.        MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
  213.     */
  214.     MODIFY_HIRC(HIRC_24);
  215.     ALL_GPIO_QUASI_MODE;
  216.     UART_Open(240000000,UART0_Timer3,115200);             /* 9600 Baud Rate*/
  217.     ENABLE_UART0_PRINTF;


  218.     SPI_Initial();
  219.     Read_MID_DID(&u8MID,&u8DID);

  220.     if((u8MID != 0xEF)&&(u8DID != 0x14))
  221.     {
  222.         SPI_Error();
  223.     }

  224.     /* The procedure of SPI Flash at erase mode */
  225.     Flash_Write_Enable();
  226.     Flash_Chip_Erase();
  227.     Flash_Read_Status();
  228.     Flash_Write_Disable();
  229.    
  230.     Flash_Erase_Verify();

  231.     /* The procedure of SPI Flash at program mode */
  232.     Flash_Write_Enable();
  233.     Flash_Program();
  234.     Flash_Read_Status();
  235.     Flash_Write_Disable();

  236.     /* Program verify */
  237.     Flash_Program_Verify();
  238.    
  239.     printf("\nFinished the SPI Demo Code and test pass!!!\n");
  240.     while(1);
  241. }
  242. //-----------------------------------------------------------------------------------------------------------


玛尼玛尼哄 发表于 2020-6-30 22:05 | 显示全部楼层
学习一下,这个芯片很多项目都要用。
598330983 发表于 2020-6-30 22:08 | 显示全部楼层
51的操作,看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

231

主题

3196

帖子

12

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