0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

M45PE16 FLASH读写问题

循环擦除读写时   
100次中  少则两三次 多则十多次, 总有读写失败的例子,经验证是没有写入  可程序都是一样的 也都检测状态位了,但就是不能保证完全OK   
求指点方向。。。。。
用的是PROTEUS里面的仿真器件,应该比实际器件效果更好才最啊  求解
提问者:神圣奇迹 地点:- 浏览次数:8670 提问时间:01-06 19:49
我有更好的答案
提 交
1条回答
超级电200 01-14 17:20 回答数:0 被采纳数:0


#include "reg52.h"
#include "main.h"

sbit FLASH_CLK = P2^5;
sbit FLASH_DI  = P2^6;
sbit FLASH_DO  = P2^7;
sbit FLASH_CS  = P2^4;

#define WREN         0x06
#define WRDI        0x04
#define RDID        0x9f
#define RDSR        0x05
#define READ        0x03
#define FAST_READ        0x0B
#define PAGE_WRITE        0x0A
#define PAGE_PROGRAM        0x02
#define PAGE_ERASE        0xDB
#define SECOTR_ERASE        0xD8

void FLASH_WriteByte(unsigned char inData);
unsigned char FLASH_ReadByte(void);
void FLASH_Init(void);
void FLASH_Write(unsigned long addr, unsigned char* p_value, unsigned char writebytes );



void FLASH_WriteByte(unsigned char inData)
{
        unsigned char i;  
        for(i = 0x80; i > 0; i >>= 1)
        {               
                FLASH_CLK = 0;
                if( inData & i ) FLASH_DI = 1;
                else FLASH_DI = 0;
                FLASH_CLK = 1;                 
        }               
}
unsigned char FLASH_ReadByte(void)
{
        unsigned char i;
        unsigned char outData = 0;
        for(i = 0x80; i > 0; i >>= 1)
        {                                                
                FLASH_CLK = 1;        
                FLASH_CLK = 0;
                if( FLASH_DO ) outData |= i;
        }        
        return outData;
}
void FLASH_Init(void)
{
        FLASH_CS = 1;
        FLASH_CS = 0;
}
unsigned char FLASH_Register(void)
{
        unsigned char result;
        FLASH_CS = 0;
        FLASH_WriteByte(RDSR);
        result =  FLASH_ReadByte();        
        FLASH_CS = 1;        
        return result;
}
void FLASH_WriteEnable(void)
{
        FLASH_CS = 0;
        FLASH_WriteByte(WREN);
        FLASH_CS = 1;
}
void FLASH_WriteDisEnable(void)
{
        FLASH_CS = 0;
        FLASH_WriteByte(WRDI);
        FLASH_CS = 1;           
}
void FLASH_PageErase(unsigned long addr)
{
        while(!( FLASH_Register() & 0x02 ))FLASH_WriteEnable();
        FLASH_CS = 0;
        FLASH_WriteByte(PAGE_ERASE);  
        FLASH_WriteByte((addr>>16)&0xff);
        FLASH_WriteByte((addr>>8)&0xff);
        FLASH_WriteByte(0);               
        FLASH_CS = 1;  
        while( FLASH_Register() & 0x01 );  
        FLASH_WriteDisEnable();         
}
void FLASH_Write(unsigned long addr, unsigned char* p_value, unsigned char writebytes )
{
        unsigned char i;
        unsigned char frontPageCnt = 0;
        unsigned char pageIndex = addr&0xff;
        while(!( FLASH_Register() & 0x02 ))FLASH_WriteEnable();
        FLASH_CS = 0;
        FLASH_WriteByte(PAGE_WRITE);
        FLASH_WriteByte((addr>>16)&0xff);
        FLASH_WriteByte((addr>>8)&0xff);
        FLASH_WriteByte(pageIndex);               
        if( writebytes > (256-pageIndex) )
        {
                frontPageCnt = 256-pageIndex;
        }
        else
        {
                 frontPageCnt = writebytes;
        }         
        for( i = 0; i < frontPageCnt; i++ )
        {
                 FLASH_WriteByte(*p_value++);        
        }
        FLASH_CS = 1;         
        while( FLASH_Register() & 0x01 );
        FLASH_WriteDisEnable();                  
        if( frontPageCnt == writebytes ) return;
        addr++;
        frontPageCnt = writebytes - frontPageCnt;
        FLASH_WriteEnable();
        FLASH_CS = 0;               
        FLASH_WriteByte(PAGE_WRITE);
        FLASH_WriteByte((addr>>16)&0xff);
        FLASH_WriteByte((addr>>8)&0xff);
        FLASH_WriteByte(0);        
        for( i = 0; i < frontPageCnt; i++ )
        {
                 FLASH_WriteByte(*p_value++);        
        }
        FLASH_CS = 1;         
        while( FLASH_Register() & 0x01 );
        FLASH_WriteDisEnable();
}                                                                                   
void FLASH_Read(unsigned long addr, unsigned char* p_value, unsigned char readbytes )
{
        unsigned char i;
        FLASH_CS = 0;
        FLASH_WriteByte(READ);
        FLASH_WriteByte((addr>>16)&0xff);
        FLASH_WriteByte((addr>>8)&0xff);
        FLASH_WriteByte(addr&0xff);               
        for(i = 0; i < readbytes; i++)
        {
                *p_value++ = FLASH_ReadByte();
        }
        FLASH_CS = 1;
}
void main(void)
{
        unsigned int i;
        unsigned char failCnt = 0;
        unsigned char test[101];
        unsigned char result = 0;
        for(i=0;i<10000;i++);
        FLASH_Init();        
        while(1){
                result++;
                FLASH_PageErase(0);        
                for( i = 0; i < 101; i++ )
                {
                         test[i] = result;
                }
                FLASH_Write( 0, test, 101 );                        
                FLASH_Read( 0, test, 101 );
                if( result != test[0] )        
                {
                         failCnt++;        
                }
                if( result > 100 )
                {
                         result = 0;
                }
        }
}复制代码上程序   
撰写答案
提 交
1 / 3
1 / 3