打印
[MINI51]

mini51学习第五贴 SPI 读写FLASH

[复制链接]
3061|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cnjxlxp|  楼主 | 2012-2-6 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2012-9-22 12:50 编辑

调试了几天都没有调试成功,芯唐自带的例程也是有问题的。还道园地发帖求助也没有人回答。今天晚上调试通过了。是 uint32_t SpiFlash_ReadStatusReg1(void)函数有问题。
 
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2009 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/
#include "includes.h"  //°üº¬ËùÐèµÄÍ·Îļþ
uint32_t i2cdata = 0,u32TxData,u32RxData;
uint8_t count;
uint8_t flag;
uint8_t u32write, u32read, u32PageNumber;
uint8_t DataBuffer0[256];
#define TEST_NUMBER 1  /* ¶¨Òå²âÊÔÒ³Êý    */
//#define  Enable_SPI_CS  DrvGPIO_ClrBit(E_PORT3,5)
//#define  DISABLE_SPI_CS  DrvGPIO_SetBit(E_PORT3,5)
void SpiFlash_ChipErase(void)
{
    uint32_t au32SourceData;
    /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
    DrvSPI_SetBitLength(8);
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
   DrvSPI_SetSS();

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

    /* ´«ËÍ0xC7ÃüÁî, Chip Erase    */   
    au32SourceData = 0xc7;
    DrvSPI_SingleWrite(&au32SourceData);
    /* µÈ´ý´«ËͽáÊø    */
    while (DrvSPI_IsBusy());
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
DrvSPI_ClrSS();
}
/*uint32_t SpiFlash_ReadStatusReg1(void)
{
    uint32_t au32SourceData;
    uint32_t au32DestinationData;
   //
    DrvSPI_SetBitLength(16);
  
DrvSPI_SetSS();

   
    au32SourceData = 0x05;
    DrvSPI_SingleWrite(&au32SourceData);

    while (DrvSPI_IsBusy());
  
DrvSPI_ClrSS();

    DrvSPI_DumpRxRegister(&au32DestinationData, 1);
    return (au32DestinationData & 0xFF);
}  */
uint32_t SpiFlash_ReadStatusReg1(void)
{
    uint32_t au32SourceData;
    uint32_t au32DestinationData;
    /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
    DrvSPI_SetBitLength(8);
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
    DrvSPI_SetSS();

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

/* ´ÓRx¼Ä´æÆ÷ÄÚ¶ÁÈ¡×ÊÁÏ    */
    DrvSPI_DumpRxRegister(&au32DestinationData, 1);
    return (au32DestinationData & 0xFF);
}
void SpiFlash_WaitReady(void)
{
    uint32_t ReturnValue;
    do
    {
        ReturnValue = SpiFlash_ReadStatusReg1();
        ReturnValue = ReturnValue & 1;
    }
    while (ReturnValue != 0); // check the BUSY bit
}

void SpiFlash_PageProgram(uint8_t *DataBuffer, uint32_t StartAddress, uint32_t ByteCount)
{
    uint32_t au32SourceData;
    uint32_t Counter;
    /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
    DrvSPI_SetBitLength(8);
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
    DrvSPI_SetSS();
    /* ´«ËÍ0x06ÃüÁî, Write enable    */
    au32SourceData = 0x06;
    DrvSPI_SingleWrite(&au32SourceData);
    /* µÈ´ý´«ËͽáÊø    */
    while (DrvSPI_IsBusy());
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
DrvSPI_ClrSS();
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
DrvSPI_SetSS();
    /* ´«ËÍ0x02ÃüÁî, Page program    */   
    au32SourceData = 0x02;
    DrvSPI_SingleWrite(&au32SourceData);
    // wait
    while (DrvSPI_IsBusy());
    // configure transaction length as 24 bits
    DrvSPI_SetBitLength(24);
    // send 24-bit start address
    au32SourceData = StartAddress;
    DrvSPI_SingleWrite(&au32SourceData);
    /* µÈ´ý´«ËͽáÊø    */
    while (DrvSPI_IsBusy());
    /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
    DrvSPI_SetBitLength(8);
    for (Counter = 0; Counter < ByteCount; Counter++)
    {
        /* ´«ËÍ×ÊÁÏ    */
        au32SourceData = DataBuffer[Counter];
        DrvSPI_SingleWrite(&au32SourceData);
     /* µÈ´ý´«ËͽáÊø    */
        while (DrvSPI_IsBusy());
    }
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
DrvSPI_ClrSS();
}
void SpiFlash_ReadData(uint8_t *DataBuffer0, uint32_t StartAddress, uint32_t ByteCount)
{
    uint32_t au32SourceData;
    uint32_t au32DestinationData;
    uint32_t Counter;
    /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
    DrvSPI_SetBitLength(8);
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
DrvSPI_SetSS();

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

    /* ´«ËÍ24λԪλַ×ÊÁÏ    */
    au32SourceData = StartAddress;
    DrvSPI_SingleWrite(&au32SourceData);
    /* µÈ´ý´«ËͽáÊø    */
    while (DrvSPI_IsBusy());
    /* ÉèÖÃSPI³¤¶ÈΪ8¸öλԪ    */
    DrvSPI_SetBitLength(8);
    for (Counter = 0; Counter < ByteCount; Counter++)
    {
        /* ¶ÁÈ¡×ÊÁÏ    */
        au32SourceData = 0x0;
        DrvSPI_SingleWrite(&au32SourceData);
     /* µÈ´ý´«ËͽáÊø    */
        while (DrvSPI_IsBusy());
  /* ´ÓRx¼Ä´æÆ÷ÄÚ¶ÁÈ¡×ÊÁÏ    */
        DrvSPI_DumpRxRegister(&au32DestinationData, 1);
        DataBuffer0[Counter] = (uint8_t) au32DestinationData;
    }
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
DrvSPI_ClrSS();
}

/*************************************************************************************
** Function name:       main
** Descriptions:                 
** input parameters:    ÎÞ
** output parameters:   ÎÞ
** Returned value:      ÎÞ
*************************************************************************************/
int main (void)
{
      
    uint8_t  WriteBuffer[256] = {0};
      uint16_t i, id = 1;
   
  uint8_t  ReadBuffer[256] = {0};
  //ReadBuffer[0]=0xfe;
  Set_System();
  ReadBuffer[0]=8;      //µ÷ÓÃϵͳ³õʼ»¯º¯Êý
     u32write=0X90;
/* ÉèÖÃSPI I/O    */
    DrvGPIO_InitFunction(FUNC_SPI);
    /* ÉèÖÃSPIΪÖ÷ģʽ, 32-bit ´«Êä    */
    DrvSPI_Open(eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);
   
    /* ÅäÖô«ÊäʱµÄ±ÈÌØÓÅÏÈ´ÎÐòΪMSBÓÅÏÈ     */
    DrvSPI_SetEndian(eDRVSPI_MSB_FIRST);
   
    /* ¹Ø±Õ×Ô¶¯Æ¬Ñ¡¹¦ÄÜ    */
    DrvSPI_DisableAutoSS();
   
    /* É趨ƬѡÐźÅÆô¶¯µçƽΪƬѡÐźŵ͵çƽ»òÕßϽµÑØÆô¶¯    */
    DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_ACTIVE_LOW_FALLING);
   
    /* ÉèÖÃSPIʱÖÓËÙ¶ÈΪ 12MHz    */
    DrvSPI_SetClockFreq(1000000, 0);
// DISABLE_SPI_CS;
  /* ²Á³ýSPI flash    */
SpiFlash_ChipErase();   
    /* µÈ´ý²Á³ý½áÊø    */
    SpiFlash_WaitReady();
   
SpiFlash_ReadData(ReadBuffer,0,256);
DrvGPIO_ClrBit(E_PORT3, 1);  //LED0-ON  Erase OK
// delay_ms(1000);
  /*      SpiFlash_PageProgram(&u32write,0, 1);
        SpiFlash_WaitReady();
DrvGPIO_ClrBit(E_PORT3, 6);  //LED1-ON  //Program done
delay_ms(1000);
        SpiFlash_ReadData(&u32read,0, 1);
            if (u32write !=u32read)
            {
               DrvGPIO_ClrBit(E_PORT2, 6);  //LED3-ON Verify Error
      //delay_ms(1000);
                //while (1);
            }
DrvGPIO_ClrBit(E_PORT5, 2);  //LED2-ON Verify OK
delay_ms(1000);
DrvSPI_Close();
  //delay_ms(200);*/
for(i=0;i<256;i++)     //³õʼ»¯Êý×é
  {
   WriteBuffer = i;
  }
  SpiFlash_WaitReady();      //W25Q16BVæ״̬¼ì²é
// SPI_SectorErase(0x0000);     //ÉÈÇø²Á³ý
  SpiFlash_WaitReady();      //W25Q16BVæ״̬¼ì²é
  SpiFlash_PageProgram(WriteBuffer,0,256);  //W25Q16BV°´Ò³±à³Ìº¯Êý
  SpiFlash_WaitReady();
  //delay_ms(1000);      //W25Q16BVæ״̬¼ì²é
  SpiFlash_ReadData(ReadBuffer,0,256);  //W25Q16BV¶ÁÊý¾Ýº¯Êý
  //SpiFlash_WaitReady();
  //delay_ms(1000);
  for(i=0;i<256;i++)     //½«¶Á³öÀ´µÄÊý¾ÝÓëд½øÈ¥µÄÊý¾Ý½øÐбȽÏ
  {
    if(WriteBuffer != ReadBuffer)
{
    DrvGPIO_ClrBit(E_PORT5, 2);  //LED2-ON Verify not OK
}
else
DrvGPIO_ClrBit(E_PORT2, 6);  //LED3-ON
}   
  
  while(1);  
   
}




SPI FLASH.rar

620.7 KB

相关帖子

沙发
lixiaoxu2meng| | 2012-2-7 07:38 | 只看该作者
自己解决的印象深理解的透

使用特权

评论回复
板凳
yulri| | 2012-2-9 19:36 | 只看该作者
记下了!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

46

帖子

2

粉丝