Professional Documents
Culture Documents
char flags = 0;
sbit WriteData at flags.B0;
/* Envia uma resposta ao PC */
void Ack( char cmd )
{
HidWriteBuff[0] = STX;
//Start
HidWriteBuff[1] = cmd;
//Comando
while( !HID_Write( &HidWriteBuff, 64) ); //envia 64 bytes para o PC
}
/* Verifica um comando recebido */
void CheckCmd()
{
if( CmdCode == cmdNONE )
{
if( HidReadBuff[0] != STX )
return;
CmdCode = HIDReadBuff[1]; //Comando
Hi(Address) = HidReadBuff[2]; //Address
Lo(Address) = HidReadBuff[3]; //Address
}
}
/* Aguarda a conexo com o software */
char EnterBootloader()
{
unsigned timer = 7000; //Tempo que permanece esperando a conexo
while( timer-- )
{
USB_Polling_Proc();
if( HID_Read() ) //Byte(s) recebido(s)
{
CheckCmd(); //verifica o comando recebido
/* Foi requisitado para enviar as inoformaes ao PC */
if( CmdCode == cmdINFO )
{
//Carrega a variavel 'mcuBootInfo' em 'HidWriteBuff'
*(BootInfo*)( &HidWriteBuff+2) = mcuBootInfo;
Ack( cmdINFO ); //Envia a resposta
CmdCode = cmdNONE;
return 1; //OK
}
}
Delay_ms(1);
}
return 0; //Tempo esgotado
}
/* Inicia a comunicao com o software */
void StartBootloader()
{
while(1)
{
USB_Polling_Proc();
if( HID_Read() )
{
CheckCmd();
if( CmdCode == cmdWRITE ) //Escrever na Flash
{
if( !WriteData )
{
WriteData = 1;
}
else
{
if( Address < BOOTLOADER_START )
Flash_Write_32( Address, &HidReadBuff[4] );
}
Ack( cmdWRITE );
CmdCode = cmdNONE;
}
else if( CmdCode == cmdERASE ) //Apagar Flash
{
unsigned EraseBlocks;
unsigned long blockAddress;
for( EraseBlocks = 0; EraseBlocks < EraseBlockSize; EraseBlocks++ )
{
blockAddress = EraseBlocks * _FLASH_ERASE;
if( blockAddress < BOOTLOADER_START )
Flash_Erase_64( blockAddress );
}
Ack( cmdERASE );
CmdCode = cmdNONE;
}
else if( CmdCode == cmdSTART ) //Encerra a rotina
{
Ack( cmdSTART );
return;
}
}
}
}
void StartProgram()
{
asm sleep;
}
void main()
{
&HidReadBuff,