打印

请教AT45DB081B的问题

[复制链接]
4366|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
_nop_|  楼主 | 2007-6-3 18:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人使用C8051F020单片机对AT45DB081B存储器进行读写,但遇到如下问题:
/****************缓存读写测试************************/
    for(j=0;j<264;j++)    //初始化数组数据为:0--264
        {
          MyBuff[j]=j;
          }   
    FlashBuffer1Write(0,264,MyBuff);    //写数据至数据缓存区1
    _nop_();
    for(j=0;j<264;j++)    //初始化数组数据全为:0
        {
          MyBuff[j]=0;
          }
    FlashBuffer1Read(0,264,MyBuff);    //读数据缓存区1数据至数组
    _nop_();

但是存放读取数据的数组只有前132个数据是正确的,而后132个数据保持初值未变,希望大家给点解决的办法,先谢谢了!

相关帖子

沙发
_nop_|  楼主 | 2007-6-4 22:14 | 只看该作者

大家帮分析分析一下出错的可能吧,想来想去也找不出问题

大家帮分析分析一下出错的可能吧,想来想去也找不出问题。

使用特权

评论回复
板凳
mxh0506| | 2007-6-5 08:30 | 只看该作者

问题出在FlashBuffer1Read()内部

不贴出这部分代码谁都看不出怎么回事

使用特权

评论回复
地板
古道热肠| | 2007-6-5 10:53 | 只看该作者

建议楼主将全部代码贴出,大家帮你看看

  新手也好学学,AT45系列的DataFlash很好用的,现在AT45DB161D的SPI总线时钟已能上升到66MHz,一点都不比并行Flash慢。

使用特权

评论回复
5
_nop_|  楼主 | 2007-6-5 18:13 | 只看该作者

源程序,大家帮分析分析

本程序晶振为16MHZ,SPI时钟频率为250KHZ
#include <c8051f020.h>
#include <stdio.h>
#include <intrins.h>

typedef unsigned char uchar ;
typedef unsigned int  uint;
/********************************************/
/*         081部分              */
/*******************************************/
#define DF_RDY_BUSY  while(GetFlashStatus()<0x80);    // 等待AT45DB081准备好
#define DF_CHIP_SELECT         P5&=~0x01; // AT45DB081片选开
#define DF_CHIP_NOSELECT         P5|=0x01;

#define BUFFER_1 0x00             // buffer 1
#define BUFFER_2 0x01             // buffer 2
#define BUFFER_1_WRITE 0x84         // buffer 1 write
#define BUFFER_2_WRITE 0x87              // buffer 2 write
#define BUFFER_1_READ  0x54    // buffer 1 read (change to 0xD4 for SPI mode 0,3)
#define BUFFER_2_READ  0x56                    // buffer 2 read (change to 0xD6 for SPI mode 0,3)
#define B1_TO_PAGE_WITH_ERASE 0x83             // buffer 1 to main memory page program with built-in erase
#define B2_TO_PAGE_WITH_ERASE 0x86             // buffer 2 to main memory page program with built-in erase
#define B1_TO_PAGE_WITHOUT_ERASE 0x88         // buffer 1 to main memory page program without built-in erase
#define B2_TO_PAGE_WITHOUT_ERASE 0x89         // buffer 2 to main memory page program without built-in erase
#define PAGE_PROG_THROUGH_B1 0x82             // main memory page program through buffer 1
#define PAGE_PROG_THROUGH_B2 0x85             // main memory page program through buffer 2
#define AUTO_PAGE_REWRITE_THROUGH_B1 0x58     // auto page rewrite through buffer 1
#define AUTO_PAGE_REWRITE_THROUGH_B2 0x59     // auto page rewrite through buffer 2
#define PAGE_TO_B1_COMP 0x60                 // main memory page compare to buffer 1
#define PAGE_TO_B2_COMP 0x61                 // main memory page compare to buffer 2
#define PAGE_TO_B1_XFER 0x53                 // main memory page to buffer 1 transfer
#define PAGE_TO_B2_XFER 0x55                 // main memory page to buffer 2 transfer
#define STATUS_REGISTER 0x57
#define MAIN_MEMORY_PAGE_READ 0x52             // main memory page read (change to 0xD2 for SPI mode 0,3)

xdata uint AT450XXPageAddr=0;
xdata uint buf081[264]=0;
xdata uint buffer1[264]=0;
xdata uint buffer2[264]=0;
/************************************************************/
/*                     SPI通信子程序                        */
/************************************************************/

void SendSPIByte(unsigned char ch)  // 通过SPI发送一个字节数据
{
         SPIF = 0;                  // SPIF位清零
         SPI0DAT = ch;              // 启动一次数据发送
         while (SPIF == 0);              // 等待数据发送完毕 


unsigned char GetSPIByte()        //通过SPI接收一个字节数据
{
         SPIF = 0;                  // SPIF位清零
         SPI0DAT = 0;                  //启动一次数据接收
         while (SPIF == 0);         // 等待数据接收完毕
     return  SPI0DAT;          // 读取SPI接收到的数据
}

/************************************************************/
/*                     081 子程序                        */
/************************************************************/

unsigned char GetFlashStatus() //读Flash当前状态Bit7=1:空闲 0:忙 Bit6=1:比较结果不匹配 0:匹配 Bit5Bit3Bit2:芯片标志 100:081 
{
        unsigned char idata ret;
    DF_CHIP_SELECT;//芯片选择
        SendSPIByte(STATUS_REGISTER);
        ret=GetSPIByte();
        DF_CHIP_NOSELECT;
        return ret;
}
//启用缓存1读
void FlashBuffer1Read(unsigned int star_addr,unsigned int len, unsigned char *buffer) //从缓冲区1的指定位置(0-263)中读入指定字节
{                                       
       unsigned int i;
             DF_RDY_BUSY;//测芯片准备好?
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(BUFFER_1_READ);   //缓冲区1为54H
        SendSPIByte(0);
        SendSPIByte((unsigned char)(star_addr>>8));
        SendSPIByte((unsigned char)star_addr);
        SendSPIByte(0);
        for (i=0;i<len;i++)            
       buffer = GetSPIByte();   // read data from SPI            DF_CHIP_NOSELECT;
}
//启用缓存2读
void FlashBuffer2Read(unsigned int star_addr,unsigned int len, unsigned char *buffer) //从缓冲区2的指定位置(0-263)中读入指定字节
{                                       
       unsigned int i;
        DF_RDY_BUSY;//测芯片准备好? 
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(BUFFER_2_READ);   //缓冲区2为56H
        SendSPIByte(0);
        SendSPIByte((unsigned char)(star_addr>>8));
        SendSPIByte((unsigned char)star_addr);
        SendSPIByte(0);
        for (i=0;i<len;i++)
        {
           *buffer = GetSPIByte();     // read data from SPI
             buffer++;
        }
           DF_CHIP_NOSELECT;
}
//启用缓存1写
void FlashBuffer1Write(unsigned int start_addr, unsigned int len,unsigned char *buffer) //向缓冲区1的指定位置(0-263)写入指定字节
{
           unsigned int  i;
        DF_RDY_BUSY;//测芯片准备好? 
           DF_CHIP_SELECT;//芯片选择              
        SendSPIByte(BUFFER_1_WRITE);//缓冲区1为84H
           SendSPIByte(0x00);
           SendSPIByte((unsigned char)(start_addr>>8));
           SendSPIByte((unsigned char)start_addr);
           for (i=0;i<len;i++)
           SendSPIByte(buffer);
        DF_CHIP_NOSELECT;
}
//启用缓存2写
void FlashBuffer2Write(unsigned int start_addr, unsigned int len,unsigned char *buffer) //向缓冲区2的指定位置(0-263)写入指定字节
{
           unsigned int  i;
        DF_RDY_BUSY;//测芯片准备好? 
           DF_CHIP_SELECT;//芯片选择            
        SendSPIByte(BUFFER_2_WRITE);//缓冲区2为87H
           SendSPIByte(0x00);
           SendSPIByte((unsigned char)(start_addr>>8));
           SendSPIByte((unsigned char)start_addr);
           for (i=0;i<len;i++)
           SendSPIByte(buffer);
        DF_CHIP_NOSELECT;
}
//读主存至缓存
void PageToBuffer1(void)     //从Flash读一页至缓存1
{
        DF_RDY_BUSY;//测芯片准备好? 
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(PAGE_TO_B1_XFER);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0);                
        DF_CHIP_NOSELECT;
}
//读主存至缓存
void PageToBuffer2(void)    //从Flash读一页至缓存2
{
        DF_RDY_BUSY;//测芯片准备好?  
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(PAGE_TO_B2_XFER);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0);                
        DF_CHIP_NOSELECT;
}
//缓存1写主存
void FlashBuffer1ProgNoErase(void)  //直接将缓存1写入Flash一页(不擦除)
{
        DF_RDY_BUSY;//测芯片准备好?
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(B1_TO_PAGE_WITHOUT_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
        DF_CHIP_NOSELECT;
}
//缓存2写主存
void FlashBuffer2ProgNoErase(void) //直接将缓存2写入Flash一页(不擦除)
{
        DF_RDY_BUSY;//测芯片准备好?
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(B2_TO_PAGE_WITHOUT_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
        DF_CHIP_NOSELECT;
}
//擦除+缓存1写主存
void FlashBuffer1ProgAutoErase(void) //直接将缓存1写入Flash一页(先擦除)
{
        DF_RDY_BUSY;//测芯片准备好? 
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(B1_TO_PAGE_WITH_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
        DF_CHIP_NOSELECT;
}

//擦除+缓存2写主存
void FlashBuffer2ProgAutoErase(void) //直接将缓存2写入Flash一页(先擦除)
{
        DF_RDY_BUSY;//测芯片准备好?
        DF_CHIP_SELECT;//芯片选择
        SendSPIByte(B2_TO_PAGE_WITH_ERASE);
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
        SendSPIByte(0x00);
        DF_CHIP_NOSELECT;
}

//读主存
//写缓存+缓存写主存
void FlashProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(不擦除)
{
           unsigned int  i;
        DF_RDY_BUSY;//测芯片准备好?  
           DF_CHIP_SELECT;//芯片选择                    
        SendSPIByte(PAGE_PROG_THROUGH_B1);//缓冲区1为82H
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
           SendSPIByte((unsigned char)start_addr);
           for (i=0;i<len;i++)
               SendSPIByte(buffer);
        DF_CHIP_NOSELECT;
}
//写缓存+缓存写主存
void FlashProgViaBuffer2(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存2写入Flash指定位置(不擦除)
{
           unsigned int  i;
        DF_RDY_BUSY;//测芯片准备好?  
           DF_CHIP_SELECT;//芯片选择                    
        SendSPIByte(PAGE_PROG_THROUGH_B2);//缓冲区2为85H
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
           SendSPIByte((unsigned char)start_addr);
           for (i=0;i<len;i++)
           SendSPIByte(buffer);
        DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer1(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存1写入Flash指定位置(先擦除)
{
           unsigned int  i;
        DF_RDY_BUSY;//测芯片准备好? 
           DF_CHIP_SELECT;//芯片选择                    
        SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B1);//缓冲区1为58H
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
           SendSPIByte((unsigned char)start_addr);
           for (i=0;i<len;i++)
           SendSPIByte(buffer);
        DF_CHIP_NOSELECT;
}

//写缓存+擦除+缓存写主存
void FlashAutoProgViaBuffer2(unsigned int start_addr, unsigned int len,unsigned char *buffer) //将指定数据通过缓存2写入Flash指定位置(先擦除)
{
           unsigned int  i;
        DF_RDY_BUSY;//测芯片准备好?
           DF_CHIP_SELECT;//芯片选择                    
        SendSPIByte(AUTO_PAGE_REWRITE_THROUGH_B2);//缓冲区2为59H
        SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
        SendSPIByte((unsigned char)(AT450XXPageAddr << 1 + start_addr>>8));
           SendSPIByte((unsigned char)start_addr);
           for (i=0;i<len;i++)
           SendSPIByte(buffer);
        DF_CHIP_NOSELECT;
}
void main(void){ 
 uint j=0;
/*---------------------------------------------------------------------------
缓存读写测试
---------------------------------------------------------------------------*/
    for(j=0;j<264;j++)                    //初始化数组数据为:0--264
        {
              buf081[j]=j;
          }   
    FlashBuffer1Write(0,264,buf081);    //写数据至数据缓存区1
    _nop_();
    for(j=0;j<264;j++)                    //初始化数组数据全为:0
        {
              buf081[j]=0;
          }
    FlashBuffer1Read(0,264,buf081);        //读数据缓存区1数据至数组
    _nop_();
}

使用特权

评论回复
6
amixice| | 2007-6-6 08:52 | 只看该作者

看看对你有帮助没

这是俺写得AT45DB321C的程序, 正常工作中, 给你贴上, 看看对你有帮助没.

/************************************************************************************/
/*!    Copyright (c) 2006, cabletech,All rights reserved.
*
* @brief    Flash相关操作文件
*
*        开发平台    C8051F023.
*        开发工具    Keil C51.
*
* @file        Flash.c
*
* @author     XiQingPing
* @date        10/06/2006
* @version    1.0
*/ 
/************************************************************************************/
/************************************************************************************/
//    导入头文件.
/************************************************************************************/
#include "Target.h"
#include "flash.h"


/************************************************************************************/
//    函数定义.
/************************************************************************************/

/****************************************************************************/
/*!
* @fn        void Flash_ReadSecurityString(unsigned char *p)
*    
* @brief    Flash读取加密字符串
*
* @param    unsigned char *p 字符串存放地址
*              
* @return    无
*/
/****************************************************************************/
void Flash_ReadSecurityString(unsigned char *p) reentrant
{
    unsigned char i;
    ENABLE_FLASH;
    Target_SPIByte(0x77);
    Target_SPIByte(0x00);
    Target_SPIByte(0x00);
    Target_SPIByte(0x00);
    Target_SPIByte(0xFF);
    Target_SPIByte(0xFF);
    Target_SPIByte(0xFF);
    Target_SPIByte(0xFF);
    for(i=0;i<128;i++)
    {
        *p++ = Target_SPIByte(0xFF);
    }
    DISABLE_FLASH;
}

/****************************************************************************/
/*!
* @fn        void Flash_ReadString(unsigned int pageaddr, unsigned int byteaddr, unsigned char *strp,unsigned char len)
*
* @brief    从flash中读取长度为len的字符串

* @param    pageaddr 要读入flash的page号码
* @param    byteaddr 要读入的flash的page内的地址
* @param    strp 用于存放读出的字符串
* @param     len    要读出的字符串长度参数             
*
* @return    无
*/
/****************************************************************************/
void Flash_ReadString(unsigned int pageaddr, unsigned int byteaddr, unsigned char *strp,unsigned char len) reentrant
{
//    unsigned char addr[3];
#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif
//    addr[2] = HighByte(pageaddr); 
//    addr[1] = LowByte(pageaddr)+HighByte(byteaddr);
//    addr[0] = (unsigned char)byteaddr;
    
    ENABLE_FLASH;
    Target_SPIByte(0xE8);                ///Continuous Array Read 
//    Target_SPIByte(addr[2]);
//    Target_SPIByte(addr[1]);
//    Target_SPIByte(addr[0]);
    Target_SPIByte(HighByte(pageaddr));
    Target_SPIByte(LowByte(pageaddr)+HighByte(byteaddr));
    Target_SPIByte((unsigned char)byteaddr);
    Target_SPIByte(0xFF);
    Target_SPIByte(0xFF);
    Target_SPIByte(0xFF);
    Target_SPIByte(0xFF);
    
    for(; len; len--)
    {
        *strp++ = Target_SPIByte(0xFF);
    }
//    *strp = 0;
    DISABLE_FLASH;
    return;
}
/****************************************************************************/
/*!
* @fn        unsigned char Flash_ReadByte(unsigned int pageaddr, unsigned int byteaddr)
*
* @brief    Flash读取字节函数程序
*
* @param    pageaddr 要读入flash的page号码
* @param    byteaddr 要读入的flash的page内的地址
*              
* @return    返回读出的字节数据
*/
/****************************************************************************/
unsigned char Flash_ReadByte(unsigned int pageaddr, unsigned int byteaddr) reentrant
{
    unsigned char rc;
    Flash_ReadString(pageaddr,byteaddr,&rc,1);
    return rc;
}

/****************************************************************************/
/*!
* @fn        void Flash_WriteString(unsigned int pageaddr, unsigned int byteaddr, unsigned char *strp, unsigned int len)
*
* @brief    Flash写入字符串函数程序
*
* @param    pageaddr 要写入flash的page号码
* @param    byteaddr 要写入的flash的page内起始地址
* @param    strp 要写入flash中的字符串的起始地址
* @param    len 要写入flash中的字符串的长度
*              
* @return    无
*/
/****************************************************************************/
void Flash_WriteString(unsigned int pageaddr, unsigned int byteaddr, unsigned char *strp, unsigned int len) reentrant
{
    unsigned char addr[3];
#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif
    addr[2] = HighByte(pageaddr); 
    addr[1] = LowByte(pageaddr)+HighByte(byteaddr);
    addr[0] = (unsigned char)byteaddr;
    
    /**Program the first page, Maybe not whole page*/
    ENABLE_FLASH;
    
    ///Main Memory to Buffer 1 transfer.
    Target_SPIByte(0x53);
    Target_SPIByte(addr[2]);
    Target_SPIByte(addr[1]);
    Target_SPIByte(addr[0]);
    DISABLE_FLASH;
    BusyWait();
    ENABLE_FLASH;
    Target_SPIByte(0x82);
    Target_SPIByte(addr[2]);
    Target_SPIByte(addr[1]);
    Target_SPIByte(addr[0]);
    for(; len; len--)
        Target_SPIByte(*strp++);
    DISABLE_FLASH;
    BusyWait();
    return;
}
/****************************************************************************/
/*!
* @fn        void Flash_WriteByte(unsigned int pageaddr, unsigned int byteaddr, unsigned char databyte)
*
* @brief    向指定位置的flash中写入一个字节数据
*
* @param    pageaddr 要读入flash的page号码
* @param    byteaddr 要读入的flash的page内的地址
* @param    databyte 要写入的字符数据
*              
* @return    无
*/
/****************************************************************************/
void Flash_WriteByte(unsigned int pageaddr, unsigned int byteaddr, unsigned char databyte)reentrant
{
    Flash_WriteString(pageaddr,byteaddr,&databyte,1);
}


/****************************************************************************/
/*!
* @fn        void Flash_ErasePage(unsigned int pageaddr)
*
* @brief    Flash按页擦除
*
* @param    pageaddr 要写入flash page的起始号码
*              
* @return    无
*/
/****************************************************************************/
void Flash_ErasePage(unsigned int pageaddr) reentrant
{
    unsigned char addr[3];
#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif
    addr[2] = HighByte(pageaddr); 
    addr[1] = LowByte(pageaddr);
    addr[0] = 0;
    
    ENABLE_FLASH;
    Target_SPIByte(0x81);
    Target_SPIByte(addr[2]);
    Target_SPIByte(addr[1]);
    Target_SPIByte(addr[0]);    
    DISABLE_FLASH;
    BusyWait();
    return;
}

/****************************************************************************/
/*!
* @fn        void Flash_Memory2Buffer(unsigned int pageaddr)
*
* @brief    读Flash的数据到缓冲区
*
* @param    pageaddr 要写入flash page的起始号码
*              
* @return    无
*/
/****************************************************************************/
void Flash_Memory2Buffer(unsigned int pageaddr) reentrant
{
    unsigned char addr[3];
#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif
    addr[2] = HighByte(pageaddr); 
    addr[1] = LowByte(pageaddr);
    addr[0] = 0;
    
    ENABLE_FLASH;
    Target_SPIByte(0x53);
    Target_SPIByte(addr[2]);
    Target_SPIByte(addr[1]);
    Target_SPIByte(addr[0]);    
    DISABLE_FLASH;
    BusyWait();
    return;
}

/****************************************************************************/
/*!
* @fn        void Flash_MemoryWriteString(unsigned int byteaddr,unsigned char *p,unsigned char len)
*
* @brief    Flash中写入字符串
*
* @param    byteaddr 要写入flash 的起始地址
* @param    p 要写入flash中的数据的起始地址
* @param    len  要写入flash中的数据的长度
*              
* @return    无
*/
/****************************************************************************/
void Flash_MemoryWriteString(unsigned int byteaddr,unsigned char *p,unsigned char len) reentrant
{
    unsigned char addr[3];
    addr[2] = 0; 
    addr[1] = HighByte(byteaddr);
    addr[0] = (unsigned char)byteaddr;
    
    ENABLE_FLASH;
    Target_SPIByte(0x84);
    Target_SPIByte(addr[2]);
    Target_SPIByte(addr[1]);
    Target_SPIByte(addr[0]);
    for(;len>0;len--)
    {
        Target_SPIByte(*p++);
    }    
    DISABLE_FLASH;
    return;
}



/****************************************************************************/
/*!
* @fn        void Flash_Buffer2Memory(unsigned int pageaddr)
*
* @brief    Flash从缓冲区写入
*
* @param    pageaddr 要写入flash page的起始号码
*              
* @return    无
*/
/****************************************************************************/
void Flash_Buffer2Memory(unsigned int pageaddr) reentrant
{
    unsigned char addr[3];
#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif
    addr[2] = HighByte(pageaddr); 
    addr[1] = LowByte(pageaddr);
    addr[0] = 0;
    
    ENABLE_FLASH;
    Target_SPIByte(0x83);
    Target_SPIByte(addr[2]);
    Target_SPIByte(addr[1]);
    Target_SPIByte(addr[0]);    
    DISABLE_FLASH;
    BusyWait();
    return;
}
/***********************************************************************************/
//    文件结束.
/***********************************************************************************/

使用特权

评论回复
7
古道热肠| | 2007-6-6 11:15 | 只看该作者

没发现明显的问题

  从程序代码来看,应该可行的,况且前132工作正常,换成5A试试,还有一点检查是否有指针趆界的情况,不行的话我把AT45DB161B的程序给你去测试。

使用特权

评论回复
8
_nop_|  楼主 | 2007-6-6 12:12 | 只看该作者

多谢大家的意见,问题找着了

    根据大家的说法,我把问题定位在子程序内部,后来发现数据类型有些混乱,本来定义整型变量是为了方便调试,但是字程序中的指针类型仍为字符型变量,081内部应该是以字节为单位的,我估计着只有前132字节正常工作应该与这个有关系,后来将测试数据改为8位数据,经测试正常工作。
   对于这种情况,我还不是特别清晰这些数据类型之间的关系为什么会导致只有前一半缓存正常工作,希望哪位能为大家解释一下,便于以后学习。
   

使用特权

评论回复
9
古道热肠| | 2007-6-6 14:35 | 只看该作者

还是没听明白,你是如何解决的

  我现在测试AT45DB161D芯片时,读状态寄存器,读ID功能都正常,就是写数据后读数据不正常,读出全是FF,源程序在AT45DB161B上都正常的,试了两块都存在这问题,正愁着呢!按理说应该不会是硬件连接的问题了,有谁用过D版本的161,也给提个建议,先谢过了。

使用特权

评论回复
10
_nop_|  楼主 | 2007-6-6 21:39 | 只看该作者

回复--古道热肠

xdata uchar buf081[264]=0;
/*---------------------------------------------------------------------------
缓存读写测试
---------------------------------------------------------------------------*/
    for(j=0;j<264;j++)                    //初始化数组数据为:0--264
        {
              buf081[j]=5;
          }   
    FlashBuffer1Write(0,264,buf081);    //写数据至数据缓存区1
    _nop_();
    for(j=0;j<264;j++)                    //初始化数组数据全为:0
        {
              buf081[j]=0;
          }
    FlashBuffer1Read(0,264,buf081);        //读数据缓存区1数据至数组
    _nop_();
}

这样测试就对了,我认识也不太清楚,不好描述
古道热肠--你那AT45DB161B的SPI时序注意了没有,光知道081有两种SPI时序,但只发现一种好用。


使用特权

评论回复
11
古道热肠| | 2007-6-7 12:41 | 只看该作者

谢谢提醒

  SPI时序注意了,我用的是先将CLK置高的情况下,将CS拉低的那一种,咋天又拿了2片45DB161B,做做对比试验肯定能找到问题的,只是要花些时间。

使用特权

评论回复
12
gyt| | 2007-6-7 17:13 | 只看该作者

有收获

谢谢两位:)

使用特权

评论回复
13
莫沾衣| | 2008-5-19 15:51 | 只看该作者

请教有关RA8835方面的问题!!

RA8835的显示部分是否与SED1335兼容?它是用什么驱动的?有劳各位了!!如果有程序给我看一下是最好的了!!

使用特权

评论回复
14
xuanny| | 2013-3-13 19:59 | 只看该作者
_nop_ 发表于 2007-6-5 18:13
本程序晶振为16MHZ,SPI时钟频率为250KHZ#include&nbsp;&ltc8051f020.h&gt#include&nbsp;&ltstdio.h&gt#inc ...

你好,能把AT45DB081B的接线图发给我吗?是否需要上拉电阻?谢谢你

使用特权

评论回复
15
JJ| | 2015-10-6 21:56 | 只看该作者
SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
你好  请问这两句什么意思

使用特权

评论回复
16
JJ| | 2015-10-6 21:57 | 只看该作者
SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
SendSPIByte((unsigned char)(AT450XXPageAddr << 1));
你好  请问这两句什么意思

使用特权

评论回复
17
xuyaqi| | 2015-10-7 15:03 | 只看该作者
void SendSPIByte(unsigned char ch)  // 通过SPI发送一个字节数据
SendSPIByte((unsigned char)(AT450XXPageAddr >> 7));
SendSPIByte((unsigned char)(AT450XXPageAddr << 1));向两个地址发送数据

使用特权

评论回复
18
JJ| | 2015-10-8 16:19 | 只看该作者
我知道了  你选择的是264的容量  我现在也在用这个Flash  可不知道为什么  用0xD7读状态寄存器 返回的结果总是0

使用特权

评论回复
19
JJ| | 2015-10-9 09:31 | 只看该作者
古道热肠 发表于 2007-6-7 12:41
  SPI时序注意了,我用的是先将CLK置高的情况下,将CS拉低的那一种,咋天又拿了2片45DB161B,做做对比试 ...

你好  我的AT45DB081输出引脚一直是高电平  输出0xFF 和你遇到的情况一样  请问你当时是怎么解决的

使用特权

评论回复
20
JJ| | 2015-10-17 12:39 | 只看该作者
amixice 发表于 2007-6-6 08:52
这是俺写得AT45DB321C的程序,&nbsp;正常工作中,&nbsp;给你贴上,&nbsp;看看对你有帮助没./***************** ...

#if (BYTES_PER_PAGE == 512)
    pageaddr = pageaddr << 1;
#else
    pageaddr = pageaddr << 2;
#endif

你好 关于这段程序我有点疑问  AT45DB081的默认容量是264KB 因此如果不设置容量的话  页地址应该用else里的语句  不过我怎么觉得264的页地址应该是左移1  而不是2呢

使用特权

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

本版积分规则

2

主题

19

帖子

0

粉丝