⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mm36sb010.c

📁 存储芯片MM360SB010 KEIL下的驱动
💻 C
字号:
#include <reg52.h>
#include <intrins.h>

#define   uchar  unsigned char
#define   uint   unsigned int

/* 定义命令 */
#define ERSC	0x90f6
#define SRC	0xfffffffe
#define RSE	0x94
#define RBE	0x98
#define RME	0x9c
#define RMEC	0xa0
#define RMB	0xa4
#define WEB	0xa8
#define WEBC	0xac
#define WBMEP   0xb0
#define WBME	0xb4

/* 调试控制项 */
sbit	MM_CLK= P2^0;
sbit	MM_DOUT= P2^1;
sbit	MM_DIN= P2^2;
sbit	MM_IEB0= P3^4;
sbit	MM_IEB1= P3^5;

extern void delay_time(uint i);

uchar read_one_byte(uchar ch)          //读一字节
{
	uchar i = 0, temp = 0,	one_data = 0;
	//MM_IEB=0;
	if (ch==0) {MM_IEB0=0;}
        if (ch==1) {MM_IEB1=0;}
        MM_DOUT = 1;
	for(i = 0; i < 8; i ++)
	{
		MM_CLK = 0;
		one_data = one_data >> 1;
		_nop_();
		_nop_();
		MM_CLK = 1;
		_nop_();
		_nop_();
		if(temp = MM_DOUT){
		     one_data = one_data | 0x80;
		}
	}
	MM_CLK = 0;
        //MM_IEB=1;
	if (ch==0) {MM_IEB0=1;}
        if (ch==1) {MM_IEB1=1;}
	return (one_data);
}

void send_one_byte(uchar ch, one_data)          //发送一字节
{
	uchar i = 0;
        //MM_IEB=0;
	if (ch==0) {MM_IEB0=0;}
        if (ch==1) {MM_IEB1=0;}
        for(i = 0;i < 8;i ++)
	{
		MM_CLK = 0;
		MM_DIN=one_data & 0x01;
		_nop_();
		_nop_();
		MM_CLK = 1;
		one_data = one_data >> 1;
		_nop_();
		_nop_();

	}
	MM_CLK = 0;
        //MM_IEB=1;
        if (ch==0) {MM_IEB0=1;}
        if (ch==1) {MM_IEB1=1;}
}

void send_two_byte(uchar ch,uint one_data)          //发送二字节
{
	uchar i = 0;
        //MM_IEB=0;
	if (ch==0) {MM_IEB0=0;}
        if (ch==1) {MM_IEB1=0;}
        for(i = 0;i < 16;i ++)
	{
		MM_CLK = 0;
		MM_DIN=one_data & 0x01;
		_nop_();
		_nop_();
		MM_CLK = 1;
		one_data = one_data >> 1;
		_nop_();
		_nop_();
	}
	MM_CLK = 0;
        //MM_IEB=1;
        if (ch==0) {MM_IEB0=1;}
        if (ch==1) {MM_IEB1=1;}
        
}

void send_reset_com(uchar ch)             //复位命令函数
{
	send_one_byte(ch,0xfe);
	send_one_byte(ch,0xff);
	send_one_byte(ch,0xff);
	send_one_byte(ch,0xff);
}

void read_data_from_buffer(uchar ch, in_buffer_begin_addr, uchar array[], uchar num)
{
	uchar i ,temp=0;
	delay_time(10000);
	for(i = 0; i < num; i ++)  /* 连续读数据 */
	{
		send_one_byte(ch,RBE);     /* 送 RBE 指令, 读一个字节数据从 Buffer */
		send_one_byte(ch,in_buffer_begin_addr + i);  /* 送MM缓冲区内地址 */
		array[i] = read_one_byte(ch);		/* 读数据 */
	}
}

/* 读一页数据到缓冲区,从flash存储器,page_addr为页地址 */
void read_to_buffer_from_flash(uchar ch,uint page_addr)
{
	uchar temp=0;
	delay_time(10000);
	send_one_byte(ch,RMB);     /* 送 RMB 指令, 读一页数据到缓冲区,从Flash存储器 */
	send_two_byte(ch,page_addr);	/* 送页地址 */
	delay_time(135);	/* MM36SB010, Max = 135 uS, without Rosc; MM36SB020, Max = 105 uS, with Rosc */
}

/* 写数据到缓冲区 */
/* in_buffer_begin_addr为缓冲区内开始地址, send_array[]为MCU内部存储空间 */
void write_data_to_buffer(uchar ch, in_buffer_begin_addr, uchar send_array[],uchar num)
{
	uchar i = 0;
	delay_time(10000);
	send_one_byte(ch,WEB);    /* 送 WEB 指令,写一个字节数据到缓冲区 */
	send_one_byte(ch,in_buffer_begin_addr);    /* 送缓冲区内首地址 */
	send_one_byte(ch,send_array[0]);  /* 送第一字节数据 */
	for(i = 1;i < num; i ++)
	{
		send_one_byte(ch,WEBC);		/* 连续写一个字节数据到缓冲区,先自动地址增加 */
		send_one_byte(ch,send_array[i]);	/* 送第 i 字节数据 */
	}
}

/* 写数据到Flash存储器 */
/* page_addr为页地址, in_page_begin_addr为页内地址,send_array[]为MCU内部存储空间 */
void write_data_to_flash(uchar ch,uint page_addr)
{
	uchar i = 0;
	delay_time(10000);
  	send_one_byte(ch,WBMEP);   /* 送WBMEP指令, 写缓冲区数据到Flash存储器,先自动页檫除 */
        send_two_byte(ch,page_addr);  /* 送页字节地址 */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -