📄 mm36sb010.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 + -