打印
[MINI51]

mini51 SPI FLASH调试不成功,求助

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

调试了几天都没有调试成功,写入和读出的数据不一致
请各位大侠帮分析一下原因,谢谢
 
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* 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);
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
   Enable_SPI_CS; //DrvSPI_SetSS();

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

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

    /* ´«ËÍ0x05ÃüÁî, Read status register 1    */   
    au32SourceData = 0x05;
    DrvSPI_SingleWrite(&au32SourceData);
    /* µÈ´ý´«ËͽáÊø    */
    while (DrvSPI_IsBusy());
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
    DISABLE_SPI_CS;//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());
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
    DISABLE_SPI_CS;//DrvSPI_ClrSS();
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
   Enable_SPI_CS; //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());
    }
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
    DISABLE_SPI_CS;//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);
    /* Ƭѡ½ÅÉèΪÆô¶¯×´Ì¬   */
    Enable_SPI_CS;//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;
    }
    /* Ƭѡ½ÅÉèΪ·ÇÆô¶¯×´Ì¬   */
   DISABLE_SPI_CS;// 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
}
}   
  while(1);  
   
}

SPI FLASH.rar

620.34 KB

相关帖子

沙发
cnjxlxp|  楼主 | 2012-2-6 21:57 | 只看该作者
问题已经解决,详情请看另一帖https://bbs.21ic.com/icview-305182-1-1.html

使用特权

评论回复
板凳
Ryanhsiung| | 2012-2-7 10:26 | 只看该作者
恭喜LZ

使用特权

评论回复
地板
lixiaoxu2meng| | 2012-2-7 10:33 | 只看该作者
自己解决的印象深理解的透

使用特权

评论回复
5
缥缈九哥| | 2012-2-8 12:01 | 只看该作者
我上面的帖子有例程。

使用特权

评论回复
6
cnjxlxp|  楼主 | 2012-2-8 20:38 | 只看该作者
九哥说的是这个?这个程序测试不完整,只是测试了SPI读ID,而且ID也是和我的mini51对不上,我的mini51的ID是0xEF16
#include <stdio.h>
#include <stdint.h>
#include <Nuvoton\iomini51.h>
#include "mini51.h"
#include "Driver/DrvGPIO.h"
#include "Driver/DrvSYS.h"
#include "Driver/DrvSPI.h"

int w25x16_test(void);
void SPI_init(void);
// **************************************
// For W25Q16BV, Manufacturer ID: 0xEF; Device ID: 0x14
// For W26X16, Manufacturer ID: 0xEF; Device ID: 0x14
uint32_t SpiFlash_ReadMidDid(void)
{
    uint32_t au32SourceData;
    uint32_t au32DestinationData;

    // configure transaction length as 8 bits
    DrvSPI_SetBitLength(8);

    // /CS: active
    DrvSPI_SetSS();

    // send Command: 0x90, Read Manufacturer/Device ID
    au32SourceData = 0x90;
    DrvSPI_SingleWrite(&au32SourceData);

    // wait
    while (DrvSPI_IsBusy());

    // configure transaction length as 24 bits
    DrvSPI_SetBitLength(24);

    // send 24-bit '0', dummy
    au32SourceData = 0x0;
    DrvSPI_SingleWrite(&au32SourceData);

    // wait
    while (DrvSPI_IsBusy());

    // configure transaction length as 16 bits
    DrvSPI_SetBitLength(16);

    // receive
    au32SourceData = 0x0;
    DrvSPI_SingleWrite(&au32SourceData);

    // wait
    while (DrvSPI_IsBusy());

    // /CS: de-active
    DrvSPI_ClrSS();

    DrvSPI_DumpRxRegister(&au32DestinationData, 1);

    if ((au32DestinationData & 0xffff) == 0xEF14)
        printf("MID & DID=0xEF14\n");
    else
        printf("MID & DID Error!\n");
   
    return  (au32DestinationData & 0xffff);

}
void SPI_init(void)
{
    DrvGPIO_InitFunction(FUNC_SPI);

    /*Initialize SPI*/
    DrvSPI_Open(eDRVSPI_MASTER, eDRVSPI_TYPE1, 32);
    /* MSB first */
    DrvSPI_SetEndian(eDRVSPI_MSB_FIRST);
    /* Disable the automatic slave select function of SS0. */
    DrvSPI_DisableAutoSS();
    /* Set the active level of slave select. */
    DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_ACTIVE_LOW_FALLING);
    /* SPI clock rate 12MHz */
    DrvSPI_SetClockFreq(12000000, 0);
}
int w25x16_test(void)
{   
    int ret;
    if (SpiFlash_ReadMidDid() != 0xEF14)  /*Get flash ID*/
    {
        printf("SPI ID fail!!\n");
        ret = 0;
    }
    else
    {
        printf("SPI ID OK \n");
        ret = 1;
    }
   
//    SPItest();

    DrvSPI_Close();
   
    return ret;
}

使用特权

评论回复
7
缥缈九哥| | 2012-2-10 11:05 | 只看该作者
能读ID,基本没有难度了。

使用特权

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

本版积分规则

0

主题

46

帖子

2

粉丝