📄 spi(mm36sb020).txt
字号:
/* ---作者: FOISON 5/15/2003--- */
/* -----------调试注意事项?-------------- */
/* IEB(片选信号) 可固定接到地,也可以由I/O来片选 */
/* SDO,SDIO,SCLK,各接一100K电阻到地 */
/* MM36SB020 OSC端:接一300K电阻到 VCC,一100p电容到 GND,加快速度。大唐不接时,没调通 */
/* MM36SB010 OSC端:接一680K电阻到 VCC,一100p电容到 GND,加快速度. 也可不接 */
/* MM36SB020 SMC0,SMC1端: SMC0 , SMC1 = 1 , 0 二线制; SMC0 , SMC1 = 0 , 0 三线制 */
/* MM36SB010 SMC端: 接到 VCC,二线制;接到 GND,三线制 */
/******************************************************************************/
sbit SDIO = P2^3;
sbit SCLK = P2^4;
sbit E_BUSY = P0^7;
/******************************************************************************/
/* 定义命令 *//*
#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 SUBTT0 0x016000 //存储器的记录起始值 注:不带门禁为0x0100 ;带门禁为0x2880//+姓名地址0x2810-0x016100
#define ROMLAST 0x040000 //存储器的容量 MM36SB010/MM36SB020 = 0x20000/0x40000
/******************************************************************************/
//INT8U idata verify_buffer[128];
/******************************************************************************/
/***** 读一字节 *****/
char read_byte(void)
{
unsigned char i, odata=0;
SDIO=1;
SCLK=0;
for (i=0; i<8; i++) {
_nop_();
SCLK=1;
odata>>=1;
if (SDIO) odata|=0x80;
SCLK=0;
}
return (odata);
}
/*************************************************************/
/***** 写一字节 *****/
void send_byte(unsigned char odata)
{
char i;
SCLK=0;
for (i=0; i<8; i++) {
SDIO=odata&0x01;
_nop_();
_nop_();
SCLK=1;
odata>>=1;
SCLK=0;
}
}
/*************************************************************/
/**************一个简单延时程序*****************/
/********** ct*1ms 11.0592MHZ晶振 ***********/
void Delay(unsigned char ct)
{
idata unsigned char j;
while(ct--) {j=0x90; while(j--);}
}
/*****擦除整块芯片命令函数*****/
/*
void erase_e(void)
{
while (E_BUSY); // 忙等待
send_byte(0xF6); // 擦除芯片 0x90F6 = ERSC
send_byte(0x90);
while (E_BUSY); // 忙等待
}
/*************************************************************/
/***** 复位命令函数 *****/
void reset_e(void)
{
E_BUSY=1;
send_byte(0xfe); // 0xfffffffe = SRC //
send_byte(0xff);
send_byte(0xff);
send_byte(0xff);
Delay(0x02); // 延时 1ms
while (E_BUSY); // 忙等待
}
/*************************************************************/
/* 读数据从缓冲区: */
// iaddr为缓冲区内开始地址, counter为读多少个数, array[]为MCU内部存储空间 //
void RD_B(unsigned char iaddr, unsigned char counter, unsigned char array[])
{
unsigned char i;
for (i=0;i<counter;i++) {
send_byte(0x98); // 送 0x98 = RBE 指令, 读一个字节数据从 Buffer //
send_byte(iaddr++); // 送页内地址 //
array[i]=read_byte(); // 读数据 //
}
}
/*************************************************************/
/* 读数据从flash存储器: */
/* paddr与iaddr为flash的页地址和页内地址,counter为写多少个数,send_array[]为MCU内部存储空间 */
//void RD_F(unsigned int paddr,unsigned char iaddr,unsigned char counter,unsigned char send_array[])
/* laddr为flash存储器的开始地址, counter为读多少个数, array[]为MCU内部存储空间 */
void RD_F(unsigned long laddr, unsigned char counter, unsigned char array[])
{
unsigned char i;
while (E_BUSY); // 忙等待
send_byte(0x9C); // 送 0x9C = RME 指令, 读一个字节数据从Flash存储器 //
send_byte(laddr&0x7f); // 送页内地址 0-127 //
send_byte(laddr>>7); // 送页地址 低8位 //
send_byte(laddr>>15); // 送页地址 高8位 //
array[0]=read_byte(); // 读数据 //
for (i=1;i<counter;i++) {
send_byte(0xA0); // 送 0xA0 = RMEC 指令,连续读一字节数据从Flash存储器,先自动地址增加 //
array[i]=read_byte();
}
}
/*************************************************************/
/* 写一页数据到缓冲区,从flash存储器,paddr为页地址 */
void WD_F_B(unsigned int paddr)
{
send_byte(0xA4); // 送 0xA4 = RMB 指令, 读一页数据到缓冲区,从Flash存储器 //
send_byte(paddr); // 送页地址 低8位//
send_byte(paddr>>8); // 送页地址 高8位//
Delay(0x01); // 延时1ms
while (E_BUSY); // 忙等待
}
/*************************************************************/
/* 写一页数据到flash存储器,从缓冲区,paddr为页地址 */
void WD_B_F(unsigned int paddr)
{
send_byte(0xB0); // 送0xB0 = WBMEP指令, 写缓冲区数据到Flash存储器,先自动页檫除 //
//send_byte(0xB4); // 送0xB4 = WBMP指令, 写缓冲区数据到Flash存储器,没自动页檫除 //
send_byte(paddr); // 送页地址 低8位//
send_byte(paddr>>8); // 送页地址 高8位//
Delay(0x12); // 延时18ms
while (E_BUSY); // 忙等待
}
/*************************************************************/
/* 写数据到缓冲区 */
/* iaddr为缓冲区内开始地址, counter为写多少个数, send_array[]为MCU内部存储空间 */
void WD_B(unsigned char iaddr, unsigned char counter, unsigned char send_array[])
{
unsigned char i;
send_byte(0xA8); // 送 0xA8 = WEB 指令,写一个字节数据到缓冲区 //
send_byte(iaddr); // 送缓冲区内首地址 //
send_byte(send_array[0]); // 送第一字节数据 //
for (i=1;i<counter;i++) {
send_byte(0xAC); // 送 0xAC = WEBC 指令, 连续写一个字节数据到缓冲区,先自动地址增加 //
send_byte(send_array[i]); // 送第 i 字节数据 //
}
}
/*************************************************************/
/* 写数据到Flash存储器 */
/* paddr与iaddr为flash的页地址和页内地址,counter为写多少个数,send_array[]为MCU内部存储空间 */
//bit WD_F(unsigned int paddr,unsigned char iaddr,unsigned char counter,unsigned char send_array[])
/* laddr为flash存储器的开始地址,counter为写多少个数,send_array[]为MCU内部存储空间 */
bit WD_F(unsigned long laddr, unsigned char counter, unsigned char send_array[])
{
WD_F_B(laddr>>7); // 将Flash存储器整页数据读进缓冲区 //
WD_B(laddr&0x7f, counter, send_array); // 写数据,在缓冲区中修改相应的数据 //
WD_B_F(laddr>>7); // 将缓冲区整页数据写进Flash存储器 //
return(0);
}
/*************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -