/* ---作者: 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>7); // 送页地址 低8位 // send_byte(laddr>>15); // 送页地址 高8位 // array[0]=read_byte(); // 读数据 // for (i=1;i>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>7); // 将Flash存储器整页数据读进缓冲区 // WD_B(laddr&0x7f, counter, send_array); // 写数据,在缓冲区中修改相应的数据 // WD_B_F(laddr>>7); // 将缓冲区整页数据写进Flash存储器 // return(0); } /*************************************************************/