/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */ BYTE sequential_write_flash_in_one_sector(WORD begin_addr, WORD counter, BYTE array[]) { WORD i = 0; WORD in_sector_begin_addr = 0; WORD sector_addr = 0; /* 判是否是有效范围,此函数不允许跨扇区操作 */ if(counter > USED_BYTE_QTY_IN_ONE_SECTOR) return ERROR; in_sector_begin_addr = begin_addr & 0x01ff; if((in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR) return ERROR; /* 擦除 要修改/写入 的扇区 */ IapEraseSector(begin_addr); for(i=0; i<counter; i++) { /* 写一个字节 */ IapProgramByte(begin_addr, array[i]); /* 比较对错 */ if (IapReadByte(begin_addr) != array[i]) { IapIdle(); return ERROR; } begin_addr++; } IapIdle(); return OK; }
/* begin_addr,被写数据Flash开始地址;counter,连续写多少个字节; array[],数据来源 */ BYTE write_flash_with_protect_in_one_sector(WORD begin_addr, WORD counter, BYTE array[]) { WORD i = 0; WORD in_sector_begin_addr = 0; WORD sector_addr = 0; WORD byte_addr = 0; /* 判是否是有效范围,此函数不允许跨扇区操作 */ if(counter > USED_BYTE_QTY_IN_ONE_SECTOR) return ERROR; in_sector_begin_addr = begin_addr & 0x01ff; /* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写 */ if((in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR) return ERROR; /* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */ sector_addr = (begin_addr & 0xfe00); byte_addr = sector_addr; for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++) { protect_buffer[i] = IapReadByte(byte_addr++); } /* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */ for(i = 0; i < counter; i++) { protect_buffer[in_sector_begin_addr++] = array[i]; } /* 擦除 要修改/写入 的扇区 */ IapEraseSector(sector_addr); /* 将保护缓冲区的数据写入 Data Flash, EEPROM */ byte_addr = sector_addr; for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++) { /* 写一个字节 */ IapProgramByte(byte_addr, protect_buffer[i]); /* 比较对错 */ if (IapReadByte(begin_addr) != protect_buffer[i]) { IapIdle(); return ERROR; } byte_addr++; } IapIdle(); return OK; }
void IapEraseSector(WORD addr) { IAP_CONTR = ENABLE_IAP; //ʹ��IAP IAP_CMD = CMD_ERASE; //����IAP���� IAP_ADDRL = addr; //����IAP�͵�ַ IAP_ADDRH = addr >> 8; //����IAP�ߵ�ַ IAP_TRIG = 0x5a; //д��������(0x5a) IAP_TRIG = 0xa5; //д��������(0xa5) _nop_(); //�ȴ�ISP/IAP/EEPROM������� IapIdle(); }
/*---------------------------- Erase one sector area Input: addr (ISP/IAP/EEPROM address) Output:- ----------------------------*/ void IapEraseSector(WORD addr) { IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time IAP_CMD = CMD_ERASE; //Set ISP/IAP/EEPROM ERASE command IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high IAP_TRIG = 0x5a; //Send trigger command1 (0x5a) IAP_TRIG = 0xa5; //Send trigger command2 (0xa5) _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete IapIdle(); }
void IapEraseSector(unsigned int addr) //扇区擦除 { IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_ERASE; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); IapIdle(); }
/*---------------------------- 扇区擦除 ----------------------------*/ void IapEraseSector(unsigned int addr) { IAP_CONTR = ENABLE_IAP; //使能IAP IAP_CMD = CMD_ERASE; //设置IAP命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 IapIdle(); }
/*---------------------------- 写一字节数据到ISP/IAP/EEPROM区域 ----------------------------*/ void IapProgramByte(unsigned int addr, unsigned char dat) { IAP_CONTR = ENABLE_IAP; //使能IAP IAP_CMD = CMD_PROGRAM; //设置IAP命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_DATA = dat; //写ISP/IAP/EEPROM数据 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 IapIdle(); }
void IapProgramByte(unsigned int addr, unsigned char dat) //写入1字节 { IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_PROGRAM; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_DATA = dat; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); IapIdle(); }
/*---------------------------- Program one byte to ISP/IAP/EEPROM area Input: addr (ISP/IAP/EEPROM address) dat (ISP/IAP/EEPROM data) Output:- ----------------------------*/ void IapProgramByte(WORD addr, BYTE dat) { IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time IAP_CMD = CMD_PROGRAM; //Set ISP/IAP/EEPROM PROGRAM command IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high IAP_DATA = dat; //Write ISP/IAP/EEPROM data IAP_TRIG = 0x5a; //Send trigger command1 (0x5a) IAP_TRIG = 0xa5; //Send trigger command2 (0xa5) _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete IapIdle(); }
void IapProgramByte(WORD addr, BYTE dat) { IAP_CONTR = ENABLE_IAP; //ʹ��IAP IAP_CMD = CMD_PROGRAM; //����IAP���� IAP_ADDRL = addr; //����IAP�͵�ַ IAP_ADDRH = addr >> 8; //����IAP�ߵ�ַ IAP_DATA = dat; //дISP/IAP/EEPROM���� IAP_TRIG = 0x5a; //д��������(0x5a) IAP_TRIG = 0xa5; //д��������(0xa5) _nop_(); //�ȴ�ISP/IAP/EEPROM������� IapIdle(); }
void IapEraseSector(WORD addr) { IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_ERASE; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); //operation complete IapIdle(); }
void IapProgramByte(WORD addr, BYTE dat) { IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_PROGRAM; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_DATA = dat; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); IapIdle(); }
unsigned char IapReadByte(unsigned int addr) //读取1字节 { unsigned char dat; IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_READ; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); dat = IAP_DATA; IapIdle(); return dat; }
BYTE IapReadByte(WORD addr) { BYTE dat; IAP_CONTR = ENABLE_IAP; IAP_CMD = CMD_READ; IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); dat = IAP_DATA; IapIdle(); return dat; }
/*---------------------------- Read one byte from ISP/IAP/EEPROM area Input: addr (ISP/IAP/EEPROM address) Output:Flash data ----------------------------*/ BYTE IapReadByte(WORD addr) { xdata BYTE dat; //Data buffer IAP_CONTR = ENABLE_IAP; //Open IAP function, and set wait time IAP_CMD = CMD_READ; //Set ISP/IAP/EEPROM READ command IAP_ADDRL = addr; //Set ISP/IAP/EEPROM address low IAP_ADDRH = addr >> 8; //Set ISP/IAP/EEPROM address high IAP_TRIG = 0x5a; //Send trigger command1 (0x5a) IAP_TRIG = 0xa5; //Send trigger command2 (0xa5) _nop_(); //MCU will hold here until ISP/IAP/EEPROM operation complete dat = IAP_DATA; //Read ISP/IAP/EEPROM data IapIdle(); //Close ISP/IAP/EEPROM function return dat; //Return Flash data }
BYTE IapReadByte(WORD addr) { BYTE dat; //���ݻ����� IAP_CONTR = ENABLE_IAP; //ʹ��IAP IAP_CMD = CMD_READ; //����IAP���� IAP_ADDRL = addr; //����IAP�͵�ַ IAP_ADDRH = addr >> 8; //����IAP�ߵ�ַ IAP_TRIG = 0x5a; //д��������(0x5a) IAP_TRIG = 0xa5; //д��������(0xa5) _nop_(); //�ȴ�ISP/IAP/EEPROM������� dat = IAP_DATA; //��ISP/IAP/EEPROM���� IapIdle(); //�ر�IAP���� return dat; //���� }
/*---------------------------- 从ISP/IAP/EEPROM区域读取一字节 ----------------------------*/ unsigned char IapReadByte(unsigned int addr) { unsigned char dat; //数据缓冲区 IAP_CONTR = ENABLE_IAP; //使能IAP IAP_CMD = CMD_READ; //设置IAP命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 dat = IAP_DATA; //读ISP/IAP/EEPROM数据 IapIdle(); //关闭IAP功能 return dat; //返回 }