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; }
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); }
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; }
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; }
/******************************************************************* * 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 }