[MINI51] mini51学习第五贴 SPI 读写FLASH

[复制链接]
3656|2
 楼主| cnjxlxp 发表于 2012-2-6 21:54 | 显示全部楼层 |阅读模式
本帖最后由 hotpower 于 2012-9-22 12:50 编辑

调试了几天都没有调试成功,芯唐自带的例程也是有问题的。还道园地发帖求助也没有人回答。今天晚上调试通过了。是 uint32_t SpiFlash_ReadStatusReg1(void)函数有问题。

  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include "includes.h"  //°üº¬ËùÐèµÄÍ·Îļþ
  7. uint32_t i2cdata = 0,u32TxData,u32RxData;
  8. uint8_t count;
  9. uint8_t flag;
  10. uint8_t u32write, u32read, u32PageNumber;
  11. uint8_t DataBuffer0[256];
  12. #define TEST_NUMBER 1  /* ¶¨Òå²âÊÔÒ³Êý    */
  13. //#define  Enable_SPI_CS  DrvGPIO_ClrBit(E_PORT3,5)
  14. //#define  DISABLE_SPI_CS  DrvGPIO_SetBit(E_PORT3,5)
  15. void SpiFlash_ChipErase(void)
  16. {
  17.     uint32_t au32SourceData;
  18.     /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
  19.     DrvSPI_SetBitLength(8);
  20.     /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
  21.    DrvSPI_SetSS();

  22.     /* ´«ËÍ0x06ÃüÁî, Write enable    */
  23.     au32SourceData = 0x06;
  24.     DrvSPI_SingleWrite(&au32SourceData);
  25.     /* µÈ´ý´«ËͽáÊø    */
  26.     while (DrvSPI_IsBusy());
  27.     /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
  28.    DrvSPI_ClrSS();
  29.     /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
  30. DrvSPI_SetSS();

  31.     /* ´«ËÍ0xC7ÃüÁî, Chip Erase    */   
  32.     au32SourceData = 0xc7;
  33.     DrvSPI_SingleWrite(&au32SourceData);
  34.     /* µÈ´ý´«ËͽáÊø    */
  35.     while (DrvSPI_IsBusy());
  36.     /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
  37. DrvSPI_ClrSS();
  38. }
  39. /*uint32_t SpiFlash_ReadStatusReg1(void)
  40. {
  41.     uint32_t au32SourceData;
  42.     uint32_t au32DestinationData;
  43.    //
  44.     DrvSPI_SetBitLength(16);
  45.   
  46. DrvSPI_SetSS();

  47.    
  48.     au32SourceData = 0x05;
  49.     DrvSPI_SingleWrite(&au32SourceData);

  50.     while (DrvSPI_IsBusy());
  51.   
  52. DrvSPI_ClrSS();

  53.     DrvSPI_DumpRxRegister(&au32DestinationData, 1);
  54.     return (au32DestinationData & 0xFF);
  55. }  */
  56. uint32_t SpiFlash_ReadStatusReg1(void)
  57. {
  58.     uint32_t au32SourceData;
  59.     uint32_t au32DestinationData;
  60.     /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
  61.     DrvSPI_SetBitLength(8);
  62.     /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
  63.     DrvSPI_SetSS();

  64.     /* ´«ËÍ0x05ÃüÁî, Read status register 1    */   
  65.     au32SourceData = 0x05;
  66.     DrvSPI_SingleWrite(&au32SourceData);
  67.     /* µÈ´ý´«ËͽáÊø    */
  68.     while (DrvSPI_IsBusy());
  69.     /* ¿ªÊ¼½ÓÊÕ×ÊÁÏ    */
  70.     au32SourceData = 0x0;
  71.     DrvSPI_SingleWrite(&au32SourceData);
  72.     /* µÈ´ý´«ËͽáÊø    */
  73.     while (DrvSPI_IsBusy());
  74.     /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
  75.    DrvSPI_ClrSS();

  76. /* ´ÓRx¼Ä´æÆ÷ÄÚ¶ÁÈ¡×ÊÁÏ    */
  77.     DrvSPI_DumpRxRegister(&au32DestinationData, 1);
  78.     return (au32DestinationData & 0xFF);
  79. }
  80. void SpiFlash_WaitReady(void)
  81. {
  82.     uint32_t ReturnValue;
  83.     do
  84.     {
  85.         ReturnValue = SpiFlash_ReadStatusReg1();
  86.         ReturnValue = ReturnValue & 1;
  87.     }
  88.     while (ReturnValue != 0); // check the BUSY bit
  89. }

  90. void SpiFlash_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount)
  91. {
  92.     uint32_t au32SourceData;
  93.     uint32_t Counter;
  94.     /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
  95.     DrvSPI_SetBitLength(8);
  96.     /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
  97.     DrvSPI_SetSS();
  98.     /* ´«ËÍ0x06ÃüÁî, Write enable    */
  99.     au32SourceData = 0x06;
  100.     DrvSPI_SingleWrite(&au32SourceData);
  101.     /* µÈ´ý´«ËͽáÊø    */
  102.     while (DrvSPI_IsBusy());
  103.     /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
  104. DrvSPI_ClrSS();
  105.     /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
  106. DrvSPI_SetSS();
  107.     /* ´«ËÍ0x02ÃüÁî, Page program    */   
  108.     au32SourceData = 0x02;
  109.     DrvSPI_SingleWrite(&au32SourceData);
  110.     // wait
  111.     while (DrvSPI_IsBusy());
  112.     // configure transaction length as 24 bits
  113.     DrvSPI_SetBitLength(24);
  114.     // send 24-bit start address
  115.     au32SourceData = StartAddress;
  116.     DrvSPI_SingleWrite(&au32SourceData);
  117.     /* µÈ´ý´«ËͽáÊø    */
  118.     while (DrvSPI_IsBusy());
  119.     /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
  120.     DrvSPI_SetBitLength(8);
  121.     for (Counter = 0; Counter < ByteCount; Counter++)
  122.     {
  123.         /* ´«ËÍ×ÊÁÏ    */
  124.         au32SourceData = DataBuffer[Counter];
  125.         DrvSPI_SingleWrite(&au32SourceData);
  126.      /* µÈ´ý´«ËͽáÊø    */
  127.         while (DrvSPI_IsBusy());
  128.     }
  129.     /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
  130. DrvSPI_ClrSS();
  131. }
  132. void SpiFlash_ReadData(uint8_t *DataBuffer0, uint32_t StartAddress, uint32_t ByteCount)
  133. {
  134.     uint32_t au32SourceData;
  135.     uint32_t au32DestinationData;
  136.     uint32_t Counter;
  137.     /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
  138.     DrvSPI_SetBitLength(8);
  139.     /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
  140. DrvSPI_SetSS();

  141.     /* ´«ËÍ0x03ÃüÁî, Read data    */     
  142.     au32SourceData = 0x03;
  143.     DrvSPI_SingleWrite(&au32SourceData);
  144.     /* µÈ´ý´«ËͽáÊø    */
  145.     while (DrvSPI_IsBusy());
  146.     /* ÉèÖÃSPI³¤¶ÈΪ24¸öλԪ    */
  147.     DrvSPI_SetBitLength(24);

  148.     /* ´«ËÍ24λԪλַ×ÊÁÏ    */
  149.     au32SourceData = StartAddress;
  150.     DrvSPI_SingleWrite(&au32SourceData);
  151.     /* µÈ´ý´«ËͽáÊø    */
  152.     while (DrvSPI_IsBusy());
  153.     /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
  154.     DrvSPI_SetBitLength(8);
  155.     for (Counter = 0; Counter < ByteCount; Counter++)
  156.     {
  157.         /* ¶ÁÈ¡×ÊÁÏ    */
  158.         au32SourceData = 0x0;
  159.         DrvSPI_SingleWrite(&au32SourceData);
  160.      /* µÈ´ý´«ËͽáÊø    */
  161.         while (DrvSPI_IsBusy());
  162.   /* ´ÓRx¼Ä´æÆ÷ÄÚ¶ÁÈ¡×ÊÁÏ    */
  163.         DrvSPI_DumpRxRegister(&au32DestinationData, 1);
  164.         DataBuffer0[Counter] = (uint8_t) au32DestinationData;
  165.     }
  166.     /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
  167. DrvSPI_ClrSS();
  168. }

  169. /*************************************************************************************
  170. ** Function name:       main
  171. ** Descriptions:                 
  172. ** input parameters:    ÎÞ
  173. ** output parameters:   ÎÞ
  174. ** Returned value:      ÎÞ
  175. *************************************************************************************/
  176. int main (void)
  177. {
  178.       
  179.     uint8_t  WriteBuffer[256] = {0};
  180.       uint16_t i, id = 1;
  181.    
  182.   uint8_t  ReadBuffer[256] = {0};
  183.   //ReadBuffer[0]=0xfe;
  184.   Set_System();
  185.   ReadBuffer[0]=8;      //µ÷ÓÃϵͳ³õʼ»¯º¯Êý
  186.      u32write=0X90;
  187. /* ÉèÖÃSPI I/O    */
  188.     DrvGPIO_InitFunction(FUNC_SPI);
  189.     /* ÉèÖÃSPIΪÖ÷ģʽ, 32-bit ´«Êä    */
  190.     DrvSPI_Open(eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);
  191.    
  192.     /* ÅäÖô«ÊäʱµÄ±ÈÌØÓÅÏÈ´ÎÐòΪMSBÓÅÏÈ     */
  193.     DrvSPI_SetEndian(eDRVSPI_MSB_FIRST);
  194.    
  195.     /* ¹Ø±Õ×Ô¶¯Æ¬Ñ¡¹¦ÄÜ    */
  196.     DrvSPI_DisableAutoSS();
  197.    
  198.     /* É趨ƬѡÐÅºÅÆô¶¯µçƽΪƬѡÐÅºÅµÍµçÆ½»òÕßϽµÑØÆô¶¯    */
  199.     DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_ACTIVE_LOW_FALLING);
  200.    
  201.     /* ÉèÖÃSPIʱÖÓËÙ¶ÈΪ 12MHz    */
  202.     DrvSPI_SetClockFreq(1000000, 0);
  203. // DISABLE_SPI_CS;
  204.   /* ²Á³ýSPI flash    */
  205. SpiFlash_ChipErase();   
  206.     /* µÈ´ý²Á³ý½áÊø    */
  207.     SpiFlash_WaitReady();
  208.    
  209. SpiFlash_ReadData(ReadBuffer,0,256);
  210. DrvGPIO_ClrBit(E_PORT3, 1);  //LED0-ON  Erase OK
  211. // delay_ms(1000);
  212.   /*      SpiFlash_PageProgram(&u32write,0, 1);
  213.         SpiFlash_WaitReady();
  214. DrvGPIO_ClrBit(E_PORT3, 6);  //LED1-ON  //Program done
  215. delay_ms(1000);
  216.         SpiFlash_ReadData(&u32read,0, 1);
  217.             if (u32write !=u32read)
  218.             {
  219.                DrvGPIO_ClrBit(E_PORT2, 6);  //LED3-ON Verify Error
  220.       //delay_ms(1000);
  221.                 //while (1);
  222.             }
  223. DrvGPIO_ClrBit(E_PORT5, 2);  //LED2-ON Verify OK
  224. delay_ms(1000);
  225. DrvSPI_Close();
  226.   //delay_ms(200);*/
  227. for(i=0;i<256;i++)     //³õʼ»¯Êý×é
  228.   {
  229.    WriteBuffer = i;
  230.   }
  231.   SpiFlash_WaitReady();      //W25Q16BVæ״̬¼ì²é
  232. // SPI_SectorErase(0x0000);     //ÉÈÇø²Á³ý
  233.   SpiFlash_WaitReady();      //W25Q16BVæ״̬¼ì²é
  234.   SpiFlash_PageProgram(WriteBuffer,0,256);  //W25Q16BV°´Ò³±à³Ìº¯Êý
  235.   SpiFlash_WaitReady();
  236.   //delay_ms(1000);      //W25Q16BVæ״̬¼ì²é
  237.   SpiFlash_ReadData(ReadBuffer,0,256);  //W25Q16BV¶ÁÊý¾Ýº¯Êý
  238.   //SpiFlash_WaitReady();
  239.   //delay_ms(1000);
  240.   for(i=0;i<256;i++)     //½«¶Á³öÀ´µÄÊý¾ÝÓëд½øÈ¥µÄÊý¾Ý½øÐбȽÏ
  241.   {
  242.     if(WriteBuffer != ReadBuffer)
  243. {
  244.     DrvGPIO_ClrBit(E_PORT5, 2);  //LED2-ON Verify not OK
  245. }
  246. else
  247. DrvGPIO_ClrBit(E_PORT2, 6);  //LED3-ON
  248. }   
  249.   
  250.   while(1);  
  251.    
  252. }




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lixiaoxu2meng 发表于 2012-2-7 07:38 | 显示全部楼层
自己解决的印象深理解的透
yulri 发表于 2012-2-9 19:36 | 显示全部楼层
记下了!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

46

帖子

2

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