/** * @brief 擦除芯片指定有扇区 * @param\n * @retval\n NULL * @remarks 对于EPCS4每个扇区512字节,发送0x0000 ~ 0x01FF内任意地址均可以擦除 0x0000 ~ 0x01FF的空间,对于不同的EPCSxx要在应用层计算实际需要擦除的大小,避免 芯片不一样导致多擦、少擦。具体芯片型号扇区大小查阅芯片手册 */ void epcs_erase_sector(unsigned int addr) { //使能写入 epcs_write_enable(); //启动 SPI_SS = 0; epcs_delay(20); SPI_CLK = 0; epcs_delay(10); //发送擦除扇区命令 epcs_write(EPCS_ERASE_SECTOR); //发送地址 epcs_write(addr >> 16); epcs_write(addr >> 8); epcs_write(addr); //复位 SPI_CLK = 1; epcs_delay(10); SPI_SS = 1; epcs_delay(20); }
/** * @brief 在一页里写入数据 * @param addr 页地址 * @param data 数据内容 * @param len 写入数据的长度 * @retval\n NULL * @remarks 应用层在调用epcs_write_page前必须调用epcs_read_statue读取芯片状态, 当芯片状态“非0”时表示可以写入,最长一次可写入长度是从该Page大小,如果addr不是 该也得起始地址,len超出该页末地址,多余的数据将被忽略 */ void epcs_write_page(unsigned int addr,unsigned char *data,unsigned int len) { //使能写入 epcs_write_enable(); //启动 SPI_SS = 0; epcs_delay(20); SPI_CLK = 0; epcs_delay(10); //写入命令后, epcs_write(EPCS_WRITE_BYTE); //写入24位地址 epcs_write(addr >> 16); epcs_write(addr >> 8); epcs_write(addr); for(int i = 0;i < len;++i) { epcs_write(*(data + i)); } //复位 SPI_CLK = 1; epcs_delay(10); SPI_SS = 1; epcs_delay(20); }
/** * @brief 擦除芯片所有扇区 * @param\n * @retval\n NULL * @remarks 芯片手册说擦除时间在5~10S,测试EPCS4擦除时间大约5S,猜测EPCS128应该是10S。 当发送 */ void epcs_erase_bulk() { epcs_write_enable(); //启动 SPI_SS = 0; epcs_delay(20); SPI_CLK = 0; epcs_delay(10); epcs_write(EPCS_ERASE_BULK); //复位 SPI_CLK = 1; epcs_delay(10); SPI_SS = 1; epcs_delay(20); }
/* * * Erase the selected erase block ("sector erase", from the POV * of the EPCS data sheet). */ int alt_epcs_flash_erase_block(alt_flash_dev* flash_info, int block_offset) { int ret_code = 0; alt_flash_epcs_dev *f = (alt_flash_epcs_dev*)flash_info; ret_code = alt_epcs_test_address(flash_info, block_offset); if (ret_code >= 0) { /* Execute a WREN instruction */ epcs_write_enable(f->register_base); /* Send the Sector Erase command, whose 3 address bytes are anywhere * within the chosen sector. */ epcs_sector_erase(f->register_base, block_offset); } return ret_code; }