📄 flash_m25p80.c
字号:
void m25p20_read(UINT32 address, UINT8 *data, UINT32 schip_en){ UINT32 opcode,status; UINT32 value; //opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ; opcode = 0x80000000 | FLASH_ACCESS_ACTION_SHIFT_ADDRESS_DATA | M25P20_READ; FLASH_CTRL_WRITE_REG(FLASH_ADDRESS_OFFSET, address); #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); status=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(status&0x80000000) { status=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } value=FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); *data = value & 0xff; }static int m25p20_program(void* addr, void* data, int len){ UINT32 opcode; UINT32 status; UINT32 tmp, i, j=0 ; unsigned char *paddr=(unsigned char *)addr; unsigned char *pdata=(unsigned char *)data; if(paddr >= FLASH_BASE) paddr-=FLASH_BASE; int res = FLASH_ERR_OK; while (len > 0) { if(len >= PAGE_SIZE) tmp = PAGE_SIZE; else tmp = len; for(i=0;i<tmp;i++) { res = m25p20_page_program( (paddr+j*PAGE_SIZE+i), *(pdata+j*PAGE_SIZE+i), schip_en); } len -= PAGE_SIZE; j++; }; return res;}//void m25p20_page_program(UINT32 address, UINT8 data, UINT32 schip_en)static int m25p20_page_program(UINT32 address, UINT8 data, UINT32 schip_en){ UINT32 opcode; UINT32 status; UINT32 tmp, i, j=0 ; int res = FLASH_ERR_OK; //volatile FLASH_DATA_T* data_ptr = (volatile FLASH_DATA_T*) data; opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ_STATUS; #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } //middle delay_ms(130); status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); if((status&0x02)==0x02) { //middle delay_ms(100); m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en); } m25p20_write_cmd(M25P20_WRITE_ENABLE, schip_en); ////middle delay_ms(10); opcode = 0x80000000 | FLASH_ACCESS_ACTION_SHIFT_ADDRESS_DATA | M25P20_PAGE_PROGRAM; FLASH_CTRL_WRITE_REG(FLASH_ADDRESS_OFFSET, address); FLASH_CTRL_WRITE_REG(FLASH_WRITE_DATA_OFFSET, data); //status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); //while(status!=data) //{ // status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); // //middle delay_ms(10); //} #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } //opcode=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ_STATUS; #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); //while(status&0xfd) while(status&0x01) { //if((status&0x9c)!=0) // printf(" m25p20_page_program Protect Status = %x\n",status); FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); flash_delay(); //middle delay_ms(50); } //printf("status = %x, data = %x\n",status,data); if((status&0x02)==0x02) { //middle delay_ms(100); m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en); } //};//while (len > 0) return res;}static int m25p20_sector_erase(UINT32 address, UINT32 schip_en){ UINT32 opcode; UINT32 status; UINT32 tmp; int res = FLASH_ERR_OK; //printf("\n-->m25p20_sector_erase"); if(address >= FLASH_BASE) address-=FLASH_BASE; m25p20_write_cmd(M25P20_WRITE_ENABLE, schip_en); //printf("\n m25p20_sector_erase : after we-en"); opcode = 0x80000000 | FLASH_ACCESS_ACTION_SHIFT_ADDRESS | M25P20_SECTOR_ERASE; FLASH_CTRL_WRITE_REG(FLASH_ADDRESS_OFFSET, address); #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ_STATUS; #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); //while(status&0xfd) while(status&0x01) { //if((status&0x9c)!=0) // printf(" m25p20_sector_erase Protect Status = %x\n",status); FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); flash_delay(); //middle delay_ms(50); } if((status&0x02)==0x02) { //middle delay_ms(100); m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en); } //printf("\n<--m25p20_sector_erase"); return res;}void m25p20_bulk_erase(UINT32 schip_en){ UINT32 opcode; UINT32 status; UINT32 tmp; m25p20_write_cmd(M25P20_WRITE_ENABLE, schip_en); opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE | M25P20_BULK_ERASE; #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } //middle //middle delay_ms(2000); opcode = 0x80000000 | FLASH_ACCESS_ACTION_OPCODE_DATA | M25P20_READ_STATUS; #ifdef MIDWAY_DIAG opcode|=schip_en; #endif FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); //while(status&0xfd) while(status&0x01) { //if((status&0x9c)!=0) // printf(" m25p20_bulk_erase Protect Status = %x\n",status); FLASH_CTRL_WRITE_REG(FLASH_ACCESS_OFFSET, opcode); tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); while(tmp&0x80000000) { tmp=FLASH_CTRL_READ_REG(FLASH_ACCESS_OFFSET); flash_delay(); } status = FLASH_CTRL_READ_REG(FLASH_READ_DATA_OFFSET); flash_delay(); //middle //middle delay_ms(50); } if((status&0x02)==0x02) { //middle //middle delay_ms(100); m25p20_write_cmd(M25P20_WRITE_DISABLE, schip_en); }}//#endif //FLASH_TYPE_SERIAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -