Пример #1
0
UBYTE flash_read(UDWORD addr)
{
    UBYTE buff_addr;
	UDWORD page;
	
	//make address correct
	buff_addr=addr & 0xFF;
	page=addr & FLASH_MAX_PAGES; 
	page=page<<1;
	
	//printf_P(PSTR("addr %lX page %lX %X\n\r",addr,page,buff_addr);
	//send read command
	flash_wait();
	FLASH_CS(0);
	spi_write(0xD2);
	spi_write(MAKE8(page,2));
	spi_write(MAKE8(page,1));
	spi_write(buff_addr);
	//send 4 don't care bytes
	spi_write(0);
	spi_write(0);
	spi_write(0);
	spi_write(0);
	buff_addr=spi_write(0);
	FLASH_CS(1);
	return buff_addr;
}
Пример #2
0
int mmc_cmd(int8 cmd,int32 address,int8 tries,int8 valid,int8 invalid)
{
	int i,r1;
	for( i=0;i<16;i++) 
		SPI_READ(0xFF);// digest prior operation
	// commands
	// 7 6 5 4 3 2 1 0
	// 0 1 b b b b b b    bbbbbb=cmd
	// 16=0x50 set blocklength
	// 17=0x51 read block
	// 24=0x58 write block
#ifdef TRACE
//	TRACE2("\r\ncmd=%2X, address=%lu",cmd, address);
#endif

	SPI_READ(cmd);
	SPI_READ(MAKE8(address,3));
	SPI_READ(MAKE8(address,2));
	SPI_READ(MAKE8(address,1));
	SPI_READ(MAKE8(address,0));
	SPI_READ(0x95);
	// card comes up in MMC mode and requires a valid MMC cmd to switch to SPI mode
	// valid crc for MMC 0x40 cmd only
	// spi mode doesn't require the CRC to be correct just there

	for(i=0;i< tries;i++) 
	{
		r1=SPI_READ(0xFF);
		if (r1==valid)  break;
		if (r1==invalid)  break;
	}

	return(r1);
}
Пример #3
0
UBYTE flash_put(UDWORD address, UBYTE data)
{
	UBYTE buff_addr;
	UDWORD page;
	
	//make address correct
	buff_addr=address & 0xFF;
	page=address & FLASH_MAX_PAGES; 
	page=page<<1;
	//addr=addr | buff_addr;


	//read page into buffer
	//transfer main memory into buffer #1
	FLASH_CS(0);  //drive chip select low
	spi_write(0x53);
	spi_write(MAKE8(page,2));
	spi_write(MAKE8(page,1));
	spi_write(buff_addr);
	FLASH_CS(1);

    flash_wait();

	//write byte to buffer
	FLASH_CS(0);  //drive chip select low
	spi_write(0x84);
	spi_write(0);
	spi_write(0);
	spi_write(buff_addr);
	spi_write(data);
	FLASH_CS(1);
	delay_ms(1);
	flash_wait();

	//we need to write buffer to page
	FLASH_CS(0);  //drive chip select low
	spi_write(0x83);
	spi_write((page>>16) & 0xFF);
	spi_write((page>>8) & 0xFF);
	spi_write((page) & 0xFF);
	FLASH_CS(1);

	delay_ms(20);

	flash_wait();
  


	return 0;
}
Пример #4
0
UBYTE flash_buf_read(UDWORD address)
{
	UBYTE buff_addr;
	UDWORD page;
	
	//make address correct
	buff_addr=MAKE8(address,0);
	page=address & FLASH_MAX_PAGES; 
	page=page<<1;
	//addr=addr | buff_addr;
	
	//read page into buffer
	//transfer main memory into buffer #1
	FLASH_CS(0);
	spi_write(0xD4);
	spi_write(0);
	spi_write(0);
	spi_write(buff_addr);
	spi_write(0);
	buff_addr=spi_write(0);
	FLASH_CS(1);	
	return buff_addr;
}
Пример #5
0
/*******************************************************************
 *  FUNCTION: Flash_serial_program
 *  AUTHOR 		= 	TRAMPAS STERN
 *  FILE 		=	flash.c
 *  DATE		=   1/26/2003  5:17:39 PM
 *
 *  PARAMETERS: Destination address
 *
 *  DESCRIPTION: gets xmodem packet and programs to flash
 *
 *  RETURNS: 	0 - pass,
 *				1 - Flash write failed
 *				
 *
 *
 *******************************************************************/
UBYTE Flash_serial_program(UDWORD address)
{
    UWORD i;
    UBYTE data[XMODEM_PACKET_SIZE];
	UBYTE ret;
	UBYTE done;
	UBYTE packet;
	UBYTE buff_addr;
	UDWORD page;
	UDWORD bytes;

	packet=1;		//first packet is 1
    bytes=0;	 

	//make address correct
	buff_addr=MAKE8(address,0);
	page=address & FLASH_MAX_PAGES; 
	page=page<<1;
	//addr=addr | buff_addr;


	//read page into buffer
	//transfer main memory into buffer #1
	FLASH_CS(1);
	spi_write(0x53);
	spi_write(MAKE8(page,2));
	spi_write(MAKE8(page,1));
	spi_write(buff_addr);
	FLASH_CS(1);
	flash_wait();

	//send request to start transimission
	// we will retry 40 times for slow users
	i=0;
	done=0;
	do {
		Xmodem_start();
		ret=Xmodem_get_packet(data,packet);	  //Get a packet of information	
	}while(ret==XERROR_SOH && i++<300);
	   		
	while(!done)
	{				
		UBYTE i;
		//then we need to program the data into flash
		for(i=0; i<XMODEM_PACKET_SIZE; i++)
		{
			//write each byte to buffer
			FLASH_CS(0);
			spi_write(0x84);
			spi_write(0);
			spi_write(0);
			spi_write(buff_addr);
			spi_write(data[i]);
			FLASH_CS(1);
			flash_wait();

 
			buff_addr++;
			//if buffer full write buffer to page 
			// and read next buffer
			if (buff_addr==0x00)
			{
				//we need to write buffer to page
				FLASH_CS(0);
				spi_write(0x83);
				spi_write(MAKE8(page,2));
				spi_write(MAKE8(page,1));
				spi_write(buff_addr);
				FLASH_CS(1);
				delay_ms(20);
				flash_wait();


				//read next page into buffer
				page=page+0x00200;
				FLASH_CS(0);
				spi_write(0x53);
				spi_write(MAKE8(page,2));
				spi_write(MAKE8(page,1));
				spi_write(buff_addr);
				FLASH_CS(1);
				flash_wait();

			}
			bytes++;
		}	
		packet++;
		//send request for next packet 
		if (ret==NO_ERRORS)
		{
			Xmodem_send_next();
			ret=Xmodem_get_packet(data,packet);	  //Get a packet of information
		}else 
		{
		  Xmodem_goodbye();	
		  done=1;
		}
			

	};

	//we need to write buffer to page
	FLASH_CS(0);
	spi_write(0x83);
	spi_write(MAKE8(page,2));
	spi_write(MAKE8(page,1));
	spi_write(buff_addr);
	FLASH_CS(1);
	delay_ms(20);
	flash_wait();

	if (ret==NO_ERRORS || ret==RECV_EOT)
	{
		Xmodem_goodbye();	
		delay_ms(500);
		printf_P(PSTR("\n\rFlashed %lu Bytes\n\r"),bytes);
		printf_P(PSTR("Flash Program completed\n\r"));
		return NO_ERRORS;
	}
   	
	Xmodem_send_cancel();	//tell host to cancel
	delay_ms(1000); //wait for host to give up
	while(uart_kbhit())
		uart_getchar();
	printf_P(PSTR("Flash Program ERROR %X packet=%d\n\r"),ret,packet);
	//printf_P(PSTR("Packet expect %d, got %d comp %d\n\r",expected,Xpacket,Xpacket_comp);
	printf_P(PSTR("Press x to exit\n\r"));
	while( uart_getchar()!='x'); 
   	return ret;				//else lets return the xmodem error
}