int commandClearFlash(uint8_t *buffer) { uint8_t state = getProcessStatus(); if( (state == 1) || (state == 3) ) *buffer = 0x0E; else { EventBits_t flags = xEventGroupGetBits(xEventGroup); if( flags & FLAG_FLASH_CLEARING ) { *buffer++ = 0x0d; //устройство занято *buffer = 0x04; //устройство зянято стиранием памяти return 7; } else { memset((void*)flashMap, 0xff, sizeof(flashMap)); memset((void*)headerList, 0xff, sizeof(headerList)); countProc = 0; spiChipErase(); xEventGroupSetBits(xEventGroup, FLAG_FLASH_CLEARING); //стартуем таймер на 22 сек, после которого state сменим с 4 на 2. xTimerStart(timerClearFlash, 500); } } return 6; }
void main( ) { char cmd, blockSize, exit = 0; long addr; init(); #asm("sei") if (PRGE) { #ifdef __DEBUG__ printf("Program enable\r\n"); #endif /*__DEBUG__*/ do { cmd = receiveByte(); switch(cmd) { case LC_ERASE: spiWriteEnable(); spiChipErase(); putchar(0x55); //ack break; case LC_LOAD: blockSize = receiveByte(); addr = receiveByte(); //low address byte addr |= ((long)receiveByte()) << 8; //high address byte flushRxBuffer(); putchar(0x55); //ack while (g_uRxCount < blockSize) ; spiWriteEnable(); spiWriteBlock(addr, g_pbRxBuffer, blockSize); flushRxBuffer(); putchar(0x55); //ack break; case LC_RESET_CHIP: putchar(0x55); //ack exit = 1; break; case LC_BLANK_CHECKING: putchar(spiBlankChecking()? 0x55: 0xff); break; case LC_READ: addr = receiveByte(); //low address byte addr |= ((long)receiveByte()) << 8; //high address byte putchar(0x55); //ack putchar(spiRead8(addr)); break; default: flushRxBuffer(); putchar(0xfe); //error putchar(cmd); break; } } while (!exit); } else { #ifdef __DEBUG__ printf("Program disable\r\n"); #endif /*__DEBUG__*/ } #asm("cli"); //idle mode resetBlackfin(); //TODO: sleep mode after running blackfin while (1) { } }