Exemplo n.º 1
0
/**
 * @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);
}
Exemplo n.º 2
0
/**
 * @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);
}
Exemplo n.º 3
0
/**
 * @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;
}