M45PE16 FLASH读写问题

[复制链接]
 楼主| a250871207 发表于 2013-1-28 11:30 | 显示全部楼层 |阅读模式
循环擦除读写时   
100次中  少则两三次 多则十多次, 总有读写失败的例子,经验证是没有写入  可程序都是一样的 也都检测状态位了,但就是不能保证完全OK   
求指点方向。。。。。
用的是PROTEUS里面的仿真器件,应该比实际器件效果更好才最啊  求解
 楼主| a250871207 发表于 2013-1-28 11:51 | 显示全部楼层
本帖最后由 a250871207 于 2013-1-28 15:55 编辑

  1. #include "reg52.h"
  2. #include "main.h"

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

  7. #define WREN         0x06
  8. #define WRDI        0x04
  9. #define RDID        0x9f
  10. #define RDSR        0x05
  11. #define READ        0x03
  12. #define FAST_READ        0x0B
  13. #define PAGE_WRITE        0x0A
  14. #define PAGE_PROGRAM        0x02
  15. #define PAGE_ERASE        0xDB
  16. #define SECOTR_ERASE        0xD8

  17. void FLASH_WriteByte(unsigned char inData);
  18. unsigned char FLASH_ReadByte(void);
  19. void FLASH_Init(void);
  20. void FLASH_Write(unsigned long addr, unsigned char* p_value, unsigned char writebytes );



  21. void FLASH_WriteByte(unsigned char inData)
  22. {
  23.         unsigned char i;  
  24.         for(i = 0x80; i > 0; i >>= 1)
  25.         {               
  26.                 FLASH_CLK = 0;
  27.                 if( inData & i ) FLASH_DI = 1;
  28.                 else FLASH_DI = 0;
  29.                 FLASH_CLK = 1;                 
  30.         }               
  31. }
  32. unsigned char FLASH_ReadByte(void)
  33. {
  34.         unsigned char i;
  35.         unsigned char outData = 0;
  36.         for(i = 0x80; i > 0; i >>= 1)
  37.         {                                                
  38.                 FLASH_CLK = 1;        
  39.                 FLASH_CLK = 0;
  40.                 if( FLASH_DO ) outData |= i;
  41.         }        
  42.         return outData;
  43. }
  44. void FLASH_Init(void)
  45. {
  46.         FLASH_CS = 1;
  47.         FLASH_CS = 0;
  48. }
  49. unsigned char FLASH_Register(void)
  50. {
  51.         unsigned char result;
  52.         FLASH_CS = 0;
  53.         FLASH_WriteByte(RDSR);
  54.         result =  FLASH_ReadByte();        
  55.         FLASH_CS = 1;        
  56.         return result;
  57. }
  58. void FLASH_WriteEnable(void)
  59. {
  60.         FLASH_CS = 0;
  61.         FLASH_WriteByte(WREN);
  62.         FLASH_CS = 1;
  63. }
  64. void FLASH_WriteDisEnable(void)
  65. {
  66.         FLASH_CS = 0;
  67.         FLASH_WriteByte(WRDI);
  68.         FLASH_CS = 1;           
  69. }
  70. void FLASH_PageErase(unsigned long addr)
  71. {
  72.         while(!( FLASH_Register() & 0x02 ))FLASH_WriteEnable();
  73.         FLASH_CS = 0;
  74.         FLASH_WriteByte(PAGE_ERASE);  
  75.         FLASH_WriteByte((addr>>16)&0xff);
  76.         FLASH_WriteByte((addr>>8)&0xff);
  77.         FLASH_WriteByte(0);               
  78.         FLASH_CS = 1;  
  79.         while( FLASH_Register() & 0x01 );  
  80.         FLASH_WriteDisEnable();         
  81. }
  82. void FLASH_Write(unsigned long addr, unsigned char* p_value, unsigned char writebytes )
  83. {
  84.         unsigned char i;
  85.         unsigned char frontPageCnt = 0;
  86.         unsigned char pageIndex = addr&0xff;
  87.         while(!( FLASH_Register() & 0x02 ))FLASH_WriteEnable();
  88.         FLASH_CS = 0;
  89.         FLASH_WriteByte(PAGE_WRITE);
  90.         FLASH_WriteByte((addr>>16)&0xff);
  91.         FLASH_WriteByte((addr>>8)&0xff);
  92.         FLASH_WriteByte(pageIndex);               
  93.         if( writebytes > (256-pageIndex) )
  94.         {
  95.                 frontPageCnt = 256-pageIndex;
  96.         }
  97.         else
  98.         {
  99.                  frontPageCnt = writebytes;
  100.         }         
  101.         for( i = 0; i < frontPageCnt; i++ )
  102.         {
  103.                  FLASH_WriteByte(*p_value++);        
  104.         }
  105.         FLASH_CS = 1;         
  106.         while( FLASH_Register() & 0x01 );
  107.         FLASH_WriteDisEnable();                  
  108.         if( frontPageCnt == writebytes ) return;
  109.         addr++;
  110.         frontPageCnt = writebytes - frontPageCnt;
  111.         FLASH_WriteEnable();
  112.         FLASH_CS = 0;               
  113.         FLASH_WriteByte(PAGE_WRITE);
  114.         FLASH_WriteByte((addr>>16)&0xff);
  115.         FLASH_WriteByte((addr>>8)&0xff);
  116.         FLASH_WriteByte(0);        
  117.         for( i = 0; i < frontPageCnt; i++ )
  118.         {
  119.                  FLASH_WriteByte(*p_value++);        
  120.         }
  121.         FLASH_CS = 1;         
  122.         while( FLASH_Register() & 0x01 );
  123.         FLASH_WriteDisEnable();
  124. }                                                                                   
  125. void FLASH_Read(unsigned long addr, unsigned char* p_value, unsigned char readbytes )
  126. {
  127.         unsigned char i;
  128.         FLASH_CS = 0;
  129.         FLASH_WriteByte(READ);
  130.         FLASH_WriteByte((addr>>16)&0xff);
  131.         FLASH_WriteByte((addr>>8)&0xff);
  132.         FLASH_WriteByte(addr&0xff);               
  133.         for(i = 0; i < readbytes; i++)
  134.         {
  135.                 *p_value++ = FLASH_ReadByte();
  136.         }
  137.         FLASH_CS = 1;
  138. }
  139. void main(void)
  140. {
  141.         unsigned int i;
  142.         unsigned char failCnt = 0;
  143.         unsigned char test[101];
  144.         unsigned char result = 0;
  145.         for(i=0;i<10000;i++);
  146.         FLASH_Init();        
  147.         while(1){
  148.                 result++;
  149.                 FLASH_PageErase(0);        
  150.                 for( i = 0; i < 101; i++ )
  151.                 {
  152.                          test[i] = result;
  153.                 }
  154.                 FLASH_Write( 0, test, 101 );                        
  155.                 FLASH_Read( 0, test, 101 );
  156.                 if( result != test[0] )        
  157.                 {
  158.                          failCnt++;        
  159.                 }
  160.                 if( result > 100 )
  161.                 {
  162.                          result = 0;
  163.                 }
  164.         }
  165. }
上程序   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

107

帖子

1

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