в связи с этим вопрос.
с компа даю команду на чтение внутренней памяти микроконтроллера и прочитанные данные отправляю назад.
CODE
if(cBuffer[0]==20)
{
//unlock memory
error = FLASHD_Unlock(AT91C_IFLASH, AT91C_IFLASH+AT91C_IFLASH_SIZE,0,0);
//address of tube config file
PageAddress = AT91C_IFLASH + AT91C_IFLASH_SIZE - iTubeNumber * AT91C_IFLASH_PAGE_SIZE;
//address with first data
pPageData = (volatile unsigned int*) PageAddress;
//function read memory, send data to PC, add data to array
//read memory
cBuffer[2] = (pPageData[iCntMemory]>>8);
cBuffer[1] = pPageData[iCntMemory];
pBuffer[iCntMemory] = pPageData[iCntMemory];
FLASHD_Lock(PageAddress, PageAddress + iTubeNumber * AT91C_IFLASH_PAGE_SIZE, 0,0);
iCntMemory++;
//send data to PC
while((temp=USART_WriteBuffer(AT91C_BASE_US0, cBuffer, sizeof(cBuffer)))==0);
}
{
//unlock memory
error = FLASHD_Unlock(AT91C_IFLASH, AT91C_IFLASH+AT91C_IFLASH_SIZE,0,0);
//address of tube config file
PageAddress = AT91C_IFLASH + AT91C_IFLASH_SIZE - iTubeNumber * AT91C_IFLASH_PAGE_SIZE;
//address with first data
pPageData = (volatile unsigned int*) PageAddress;
//function read memory, send data to PC, add data to array
//read memory
cBuffer[2] = (pPageData[iCntMemory]>>8);
cBuffer[1] = pPageData[iCntMemory];
pBuffer[iCntMemory] = pPageData[iCntMemory];
FLASHD_Lock(PageAddress, PageAddress + iTubeNumber * AT91C_IFLASH_PAGE_SIZE, 0,0);
iCntMemory++;
//send data to PC
while((temp=USART_WriteBuffer(AT91C_BASE_US0, cBuffer, sizeof(cBuffer)))==0);
}
вроде все работает
потом хочу записать данные по команде
CODE
if(cBuffer[0]==15)
{
if((error = FLASHD_Unlock(AT91C_IFLASH, AT91C_IFLASH + AT91C_IFLASH_SIZE , 0, 0))==0)
{
// Performs tests on last page (to avoid overriding existing program).
PageAddress = AT91C_IFLASH + AT91C_IFLASH_SIZE - iTubeNumber * AT91C_IFLASH_PAGE_SIZE;
//pPageData = (volatile unsigned int *) PageAddress;
//------------------------
error = FLASHD_Write(PageAddress, pBuffer, iCnt*4);//AT91C_IFLASH_PAGE_SIZE
//----------------
// Lock page
error = FLASHD_Lock(PageAddress, PageAddress + iTubeNumber * AT91C_IFLASH_PAGE_SIZE, 0, 0);
//---------------------------------------------
}
}
{
if((error = FLASHD_Unlock(AT91C_IFLASH, AT91C_IFLASH + AT91C_IFLASH_SIZE , 0, 0))==0)
{
// Performs tests on last page (to avoid overriding existing program).
PageAddress = AT91C_IFLASH + AT91C_IFLASH_SIZE - iTubeNumber * AT91C_IFLASH_PAGE_SIZE;
//pPageData = (volatile unsigned int *) PageAddress;
//------------------------
error = FLASHD_Write(PageAddress, pBuffer, iCnt*4);//AT91C_IFLASH_PAGE_SIZE
//----------------
// Lock page
error = FLASHD_Lock(PageAddress, PageAddress + iTubeNumber * AT91C_IFLASH_PAGE_SIZE, 0, 0);
//---------------------------------------------
}
}
и ничего не пишется
pBuffer наполняю раньше, проверял с ним все в порядке.
комментировал по очереди все функции и оказалось что проблема в flashd_write.
пробовал запретить прерывания от com-порта, т.к. во время записи могли приходить очередные данные с компьютера, но и это не помогло.
может кто подскажет, как можно добиться работоспособности этих функций?