这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 430,MM36SB020,FLASH 【求助】哪位大侠有430读写MM36SB

共2条 1/1 1 跳转至

430,MM36SB020,FLASH 【求助】哪位大侠有430读写MM36SB020串行FLASH的简单例子,谢谢!我的代码总是不能正常读写。紧急求助。

院士
2006-09-17 18:14:16     打赏
430,MM36SB020,FLASH 【求助】哪位大侠有430读写MM36SB020串行FLASH的简单例子,谢谢!我的代码总是不能正常读写。紧急求助。



关键词: MM36SB020     FLASH     求助     哪位     大侠         

院士
2006-12-22 22:43:00     打赏
2楼
问 【求助】哪位大侠有430读写MM36SB020串行FLASH的简单例子,谢谢!我的代码总是不能正常读写。紧急求助。 1: #include "common.h"
#include "36sb020.h"
#define BUSY_PIN (1<<2)
#define SCLK (1<<3)
#define SDI (1<<4)
#define SDO (1<<5)


/* 定义命令 */
#define ERSC 0x90f6 /* 檫除整个芯片 */
#define SRC 0xfffffffe /* 软件复位芯片 */
#define RSE 0x94 /* 读状态寄存器 */
#define RBE 0x98 /* 读一个字节数据从缓冲区 */

#define RME 0x9c /* 读一个字节数据从Flash存储器 */
#define RMEC 0xa0 /* 连续读一字节数据从Flash存储器,先自动地址增加 */

#define RMB 0xa4 /* 读一页数据(128 byte),从Flash存储器到缓冲区 */

#define WEB 0xa8 /* 写一个字节数据到缓冲区 */
#define WEBC 0xac /* 连续写一个字节数据到缓冲区,先自动地址增加 */

#define WBMEP 0xb0 /* 写缓冲区数据到Flash存储器,先自动页檫除 */
#define WBME 0xb4 /* 写缓冲区数据到Flash存储器,没有自动页檫除 */



/* 定义常量 */
#define LOW 0
#define HIGH 1


/*
数据写入用法:
ResetFlash(); // 发送 e-flash 复位命令
Delay(100); // 延时
while( busy() );
WriteFlash(100,0, 128, buffer); // 写数据到 e-Flash 缓冲区

数据读取用法:
ResetFlash(); // 发送 e-flash 复位命令
Delay(100); // 延时
while( busy() );
ReadFlash(100,0,128,buffer);
}
*/
void Delay(unsigned int k)
{
unsigned int i,j;
for(j = 0; j<k; j++)
{
for(i=0;i<15;i++);
}
}

void ResetFlash()
{
WriteChar(0xfe);
WriteChar(0xff);
WriteChar(0xff);
WriteChar(0xff);
}


unsigned char ReadChar()
{
unsigned char i ,one_data;


for(i = 0; i < 8; i ++)
{

P2OUT=0;
Delay(2);
one_data = one_data >> 1;

P2OUT=SCLK ;
Delay(2);

if ((P2IN & SDO) == SDO)
{
one_data = one_data | 0x80;
}
}

return (one_data);
}


void WriteChar(unsigned char one_data)
{
unsigned char i ;
for(i = 0;i < 8;i ++)
{
P2OUT=0;
if ((one_data & 0x01)==0x01)
{
P2OUT = SDI;
Delay(2);
P2OUT = SDI + SCLK;
}
else
{
Delay(2);
P2OUT = SCLK;
}
Delay(2);
one_data = one_data >> 1;

}
}
void WriteInt(unsigned int one_data)
{
WriteChar(one_data&0xff);
WriteChar(one_data>>8);
}


unsigned char busy( ) /*读状态命令*/
{
if((P2IN & BUSY_PIN) == BUSY_PIN)
return 1;
else
return 0;
}


/* 读数据从缓冲区: */
/* in_buffer_begin_addr为缓冲区内开始地址, counter为读多少个数, array[]为MCU内部存储空间 */
unsigned char ReadBuff(unsigned char begin_addr, unsigned char counter, unsigned char array[])
{
unsigned char i ;
if(busy()) return 0xff;

for(i = 0; i < counter; i ++) /* 连续读数据 */
{
WriteChar(RBE); /* 送 RBE 指令, 读一个字节数据从 Buffer */
WriteChar(begin_addr + i); /* 送页内地址 */
array[i] = ReadChar(); /* 读数据 */
}
return 0x0;
}

/* 读数据从flash存储器: */
/* page_addr为页地址, in_page_byte_addr为页内地址, counter为读多少个数, array[]为MCU内部存储空间 */
/* 读数据从flash存储器: */
/* page_addr为页地址, in_page_byte_addr为页内地址, counter为读多少个数, array[]为MCU内部存储空间 */
unsigned char ReadFlash(unsigned int page_addr, unsigned char in_page_byte_addr, unsigned char counter, unsigned char array[])
{
while(busy());

FlashToBuff(page_addr); /* 送 RME 指令, 读一个字节数据从Flash存储器 */
while(busy());
ReadBuff(in_page_byte_addr,counter,array); /* 送页内地址 */
return 0x0;
}




/* 读一页数据到缓冲区,从flash存储器,page_addr为页地址 */
unsigned char FlashToBuff(unsigned int page_addr)
{
while(busy());
WriteChar(RMB); /* 送 RMB 指令, 读一页数据到缓冲区,从Flash存储器 */
WriteInt(page_addr); /* 送页地址 */

Delay(1000); /* MM36SB010, Max = 135 uS, without Rosc; MM36SB020, Max = 105 uS, with Rosc */

return 0x0;
}

/* 写数据到缓冲区 */
/* in_buffer_begin_addr为缓冲区内开始地址, counter为写多少个数, send_array[]为MCU内部存储空间 */
unsigned char WriteBuff(unsigned char begin_addr, unsigned char counter, unsigned char send_array[])
{
unsigned char i ;
while(busy());

WriteChar(WEB); /* 送 WEB 指令,写一个字节数据到缓冲区 */
WriteChar(begin_addr); /* 送缓冲区内首地址 */
WriteChar(send_array[0]); /* 送第一字节数据 */

for(i = 1;i < counter; i ++)
{
WriteChar(WEBC); /* 连续写一个字节数据到缓冲区,先自动地址增加 */
WriteChar(send_array[i]); /* 送第 i 字节数据 */
}

return 0x0;
}


/* 写数据到Flash存储器 */
/* page_addr为页地址, in_page_begin_addr为页内地址,counter为写多少个数,send_array[]为MCU内部存储空间 */
unsigned char WriteFlash(unsigned int page, unsigned char begin_addr, unsigned char counter, unsigned char send_array[])
{
while(busy());
FlashToBuff(page); /* 将整页数据读进缓冲区进行保护 */

WriteBuff(begin_addr, counter, send_array);
/* in_buffer_begin_addr = in_page_begin_addr, 在缓冲区中修改相应的数据 */

WriteChar(WBMEP); /* 送WBMEP指令, 写缓冲区数据到Flash存储器,先自动页檫除 */
WriteInt(page); /* 送页字节地址 */
Delay(1000);
return 0x0;
}

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]