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

📄 spi(mm36sb020).txt

📁 mm36sb020的spi的接口,已经调试过的 /* 定义命令 *//* #define ERSC 0x90f6 // 檫除整个芯片 // #define SRC 0xfffffffe //
💻 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 + -