[DemoCode下载] N76E003操作SPI的Flash

[复制链接]
1062|10
 楼主| 小灵通2018 发表于 2019-5-13 22:13 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

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

  11. //***********************************************************************************************************
  12. //  File Function: N76E003 Access SPI Flash (W25Q16BV) demo code
  13. //***********************************************************************************************************
  14. #include "N76E003.h"
  15. #include "SFR_Macro.h"
  16. #include "Function_define.h"
  17. #include "Common.h"
  18. #include "Delay.h"


  19. #define SPI_CLOCK       0

  20. #define SS_PIN          P15
  21. #define WRITE_ENABLE    0x06
  22. #define WRITE_DISABLE   0x04
  23. #define READ_DATA       0x03
  24. #define PAGE_PROGRAM    0x02
  25. #define CHIP_ERASE      0xC7
  26. #define READ_STATUS1    0x05

  27. //-----------------------------------------------------------------------------------------------------------
  28. void SPI_Error(void)
  29. {
  30.     printf ("\n*  SPI Error, please check the connection between MCU and SPI Flash");
  31.     while(1);
  32. }
  33. //-----------------------------------------------------------------------------------------------------------
  34. void SPI_Initial(void)
  35. {
  36.     #if   SPI_CLOCK == 0
  37.             clr_SPR1;
  38.             clr_SPR0;
  39.     #elif SPI_CLOCK == 1
  40.             clr_SPR1;
  41.             set_SPR0;
  42.     #elif SPI_CLOCK == 2
  43.             set_SPR1;  
  44.             clr_SPR0;
  45.     #elif SPI_CLOCK == 3
  46.             set_SPR1;
  47.             set_SPR0;
  48.     #endif

  49.     /* /SS General purpose I/O ( No Mode Fault ) */
  50.     set_DISMODF;
  51.     clr_SSOE;

  52.     /* SPI in Master mode */
  53.     set_MSTR;

  54.     /* MSB first */
  55.     clr_LSBFE;

  56.     clr_CPOL;
  57.     clr_CPHA;
  58.    
  59.     /* Enable SPI function */
  60.     set_SPIEN;
  61. }
  62. //-----------------------------------------------------------------------------------------------------------
  63. void Read_MID_DID(UINT8 *pu8MID,UINT8 *pu8DID)
  64. {
  65.     SS_PIN = 0;
  66.     SPDR = 0x90;
  67.     while((SPSR&0x80)==0x00);
  68.     clr_SPIF;

  69.     SPDR = 0x00;
  70.     while((SPSR&0x80)==0x00);
  71.     clr_SPIF;

  72.     SPDR = 0x00;
  73.     while((SPSR&0x80)==0x00);
  74.     clr_SPIF;

  75.     SPDR = 0x00;
  76.     while((SPSR&0x80)==0x00);
  77.     clr_SPIF;

  78.     SPDR = 0xFF;
  79.     while((SPSR&0x80)==0x00);
  80.     *pu8MID = SPDR;
  81.     clr_SPIF;

  82.     SPDR = 0xFF;
  83.     while((SPSR&0x80)==0x00);
  84.     *pu8DID = SPDR;
  85.     clr_SPIF;
  86.     SS_PIN = 1;   
  87. }
  88. //-----------------------------------------------------------------------------------------------------------
  89. void Flash_Write_Enable(void)
  90. {
  91.     SS_PIN = 0;
  92.     SPDR = WRITE_ENABLE;
  93.     while((SPSR&0x80)==0x00);
  94.     clr_SPIF;
  95.     SS_PIN = 1;   
  96. }
  97. //-----------------------------------------------------------------------------------------------------------
  98. void Flash_Write_Disable(void)
  99. {
  100.     SS_PIN = 0;
  101.     SPDR = WRITE_DISABLE;
  102.     while((SPSR&0x80)==0x00);
  103.     clr_SPIF;
  104.     SS_PIN = 1;   
  105. }
  106. //-----------------------------------------------------------------------------------------------------------
  107. void Flash_Chip_Erase(void)
  108. {
  109.     SS_PIN = 0;
  110.     SPDR = CHIP_ERASE;
  111.     while((SPSR&0x80)==0x00);
  112.     clr_SPIF;
  113.     SS_PIN = 1;   
  114. }
  115. //-----------------------------------------------------------------------------------------------------------
  116. void Flash_Read_Status(void)
  117. {
  118.     UINT8 u8Status;

  119.     SS_PIN = 0;
  120.     do{
  121.         SPDR = READ_STATUS1;
  122.         while((SPSR&0x80)==0x00);
  123.         clr_SPIF;
  124.    
  125.         SPDR = 0xFF;
  126.         while((SPSR&0x80)==0x00);
  127.         u8Status = SPDR;
  128.         clr_SPIF;
  129.     }while((u8Status&0x01)==0x01);
  130.     SS_PIN = 1;   
  131. }
  132. //-----------------------------------------------------------------------------------------------------------
  133. void Flash_Erase_Verify(void)
  134. {
  135.     UINT16 u16CNT;   
  136.     UINT8  u8Data;

  137.     SS_PIN = 0;

  138.     SPDR = READ_DATA;
  139.     while((SPSR&0x80)==0x00);
  140.     clr_SPIF;

  141.     /* 24-bit Address */
  142.     SPDR = 0x00;
  143.     while((SPSR&0x80)==0x00);
  144.     clr_SPIF;

  145.     SPDR = 0x00;
  146.     while((SPSR&0x80)==0x00);
  147.     clr_SPIF;

  148.     SPDR = 0x00;
  149.     while((SPSR&0x80)==0x00);
  150.     clr_SPIF;

  151.     for(u16CNT=0;u16CNT<256;u16CNT++)
  152.     {
  153.         SPDR = 0x00;
  154.         while((SPSR&0x80)==0x00);
  155.         u8Data = SPDR;
  156.         clr_SPIF;
  157.         if(u8Data != 0xFF)
  158.         {
  159.             SPI_Error();
  160.         }
  161.     }

  162.     SS_PIN = 1;
  163. }
  164. //-----------------------------------------------------------------------------------------------------------
  165. void Flash_Program(void)
  166. {
  167.     UINT16 u16CNT;
  168.    
  169.     SS_PIN = 0;

  170.     SPDR = PAGE_PROGRAM;
  171.     while((SPSR&0x80)==0x00);
  172.     clr_SPIF;

  173.     /* 24-bit Address */
  174.     SPDR = 0x00;
  175.     while((SPSR&0x80)==0x00);
  176.     clr_SPIF;

  177.     SPDR = 0x00;
  178.     while((SPSR&0x80)==0x00);
  179.     clr_SPIF;

  180.     SPDR = 0x00;
  181.     while((SPSR&0x80)==0x00);
  182.     clr_SPIF;

  183.     /* Send the data to SPI_Flash buffer */
  184.     for(u16CNT=0;u16CNT<256;u16CNT++)
  185.     {
  186.         SPDR = (UINT8)u16CNT;
  187.         while((SPSR&0x80)==0x00);
  188.         clr_SPIF;
  189.     }
  190.    
  191.     SS_PIN = 1;   
  192. }
  193. //-----------------------------------------------------------------------------------------------------------
  194. void Flash_Program_Verify(void)
  195. {
  196.     UINT16 u16CNT;   
  197.     UINT8  u8Data;

  198.     SS_PIN = 0;

  199.     SPDR = READ_DATA;
  200.     while((SPSR&0x80)==0x00);
  201.     clr_SPIF;

  202.     /* 24-bit Address */
  203.     SPDR = 0x00;
  204.     while((SPSR&0x80)==0x00);
  205.     clr_SPIF;

  206.     SPDR = 0x00;
  207.     while((SPSR&0x80)==0x00);
  208.     clr_SPIF;

  209.     SPDR = 0x00;
  210.     while((SPSR&0x80)==0x00);
  211.     clr_SPIF;

  212.     for(u16CNT=0;u16CNT<256;u16CNT++)
  213.     {
  214.         SPDR = 0x00;
  215.         while((SPSR&0x80)==0x00);
  216.         u8Data = SPDR;
  217.         clr_SPIF;
  218.         if(u8Data != (UINT8)u16CNT)
  219.         {
  220.             SPI_Error();
  221.         }
  222.     }

  223.     SS_PIN = 1;
  224. }
  225. //-----------------------------------------------------------------------------------------------------------
  226. void main(void)
  227. {      
  228.     UINT8 u8MID,u8DID;

  229.     /* Note
  230.        MCU power on system clock is HIRC (22.1184MHz), so Fsys = 22.1184MHz
  231.     */
  232.    
  233.     Set_All_GPIO_Quasi_Mode;
  234.     InitialUART0_Timer3(115200);             /* 9600 Baud Rate*/
  235.     SPI_Initial();

  236.     Read_MID_DID(&u8MID,&u8DID);

  237.     if((u8MID != 0xEF)&&(u8DID != 0x14))
  238.     {
  239.         SPI_Error();
  240.     }

  241.     /* The procedure of SPI Flash at erase mode */
  242.     Flash_Write_Enable();
  243.     Flash_Chip_Erase();
  244.     Flash_Read_Status();
  245.     Flash_Write_Disable();
  246.    
  247.     Flash_Erase_Verify();

  248.     /* The procedure of SPI Flash at program mode */
  249.     Flash_Write_Enable();
  250.     Flash_Program();
  251.     Flash_Read_Status();
  252.     Flash_Write_Disable();

  253.     /* Program verify */
  254.     Flash_Program_Verify();

  255.     printf("\nFinished the SPI Demo Code and test pass!!!\n");
  256.     while(1);
  257. }
  258. //-----------------------------------------------------------------------------------------------------------


 楼主| 小灵通2018 发表于 2019-5-13 22:15 | 显示全部楼层
如果有需要,就参考这个例子做就行了。
xinpian101 发表于 2019-5-14 22:05 | 显示全部楼层
Flash操作还不多,我都是用内部flash弄。
xuanhuanzi 发表于 2019-5-14 22:28 | 显示全部楼层
例子通俗易懂,多谢。
zhuomuniao110 发表于 2019-5-15 00:22 | 显示全部楼层
寄存器操作,手册要熟练。
捉虫天师 发表于 2019-5-15 00:32 | 显示全部楼层
这个芯片很火。
643757107 发表于 2019-5-15 20:01 | 显示全部楼层
早就会的了。
antusheng 发表于 2019-5-15 21:59 | 显示全部楼层
这是用的SPI接口的Flash,应该也可以操作其他的东西吧
zhuotuzi 发表于 2019-5-18 00:26 | 显示全部楼层
新唐的003端口真全面。
643757107 发表于 2019-5-18 00:30 | 显示全部楼层
这个函数可以直接拿走用的。
幸福小强 发表于 2019-5-18 16:53 | 显示全部楼层
宏定义的妙用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

158

主题

1732

帖子

4

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