реклама на сайте
подробности

 
 
> Самопрограммирование накристальной флеш виснет, Стирание всей флеши и запись первого байта дают зависание
Bom_Shankar
сообщение Nov 6 2007, 13:29
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 15-12-06
Пользователь №: 23 554



И так, задача: МК перезаписывает свою флеш. Здесь все функции RAM.
Стирание всей флеши и запись первого байта (ПРОВЕРЕНО, МК ВИСНЕТ ИМЕННО ПОСЛЕ ЗАПИСИ 1го байта) дают зависание, вот код, помогите пожалуйста...

void Ram_Func_Program_Flash (void)
{
_DINT();
IE1 &= ~BIT0;//asm ("clr.b &0") ; // 0 = IE1 блокировка NMI, ACCV и OF прерываний
UINT8 Buffer_1_Byte;
// Стереть сразу всю флеш
WDTCTL = WDTPW + WDTHOLD; // Выключим WDT
//FCTL2 = ( FWKEY | FSSEL_1 | 16 ); // частота тактового генератора flash
FCTL2 = ( FWKEY | FSSEL_1 | 16 ); // частота тактового генератора flash
FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание
FCTL1 = FWKEY | MERAS; // Стереть сразу всю флеш
*(UINT16*)(0x4000 ) = 0; // фиктивная запись для запуска процедуры стирания сегмента
while ( (FCTL3 & BIT0)==1 ) _NOP(); //wait while busy flag is 1
FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно
for (UINT8 Block_Num=0; Block_Num<6; Block_Num++)
{
//Пришла команда,
// Пишем блоки со 2-го по шестой
// использльзовать в RAM доступ к плис, ram-версия драйвера плис
// Вычитываем из плис 8КБ данных и побайтно пишем их в
// блоки, предварительно их стирая
// использльзовать в RAM доступ к плис, ram-версия методов записи и чтения драйвера плис
for (UINT16 i = 0; i <= 8192 - 1; i++) // Читаем из BAR1 очередную порцию(8К) от прошивки
{

Buffer_1_Byte = Read_From_FPGA_Byte_RAM_Ptr_Global(DPM_MEMORY_WINDOW_OFFSET
+offsetof( DPM_DATA_PACKET, ExtData)
+offsetof (DPM_TM_WRITE_MEM_IN,Data)
+ i );
FCTL2 = ( FWKEY | FSSEL_1 | 16 ); // частота тактового генератора flash
FCTL3 = FWKEY; // очистим LOCK разрешим программирование-стирание
FCTL1 = FWKEY | WRT; // разрешение записи
*(BYTE*)(0x4000 + Block_Num*8192 + i) = Buffer_1_Byte; // пишем байт
//<------------------------------(ПРОВЕРЕНО, МК ВИСНЕТ ИМЕННО ПОСЛЕ ЗАПИСИ 1го байта)
while ( (FCTL3 & BIT0)==1 ) _NOP(); //wait while busy flag is 1
FCTL1 = FWKEY; // выполнено, очистка WRT
FCTL3 = FWKEY | LOCK; // выполнено, установим LOCK обратно
}
Write_To_FPGA_Byte_RAM_Ptr_Global(DPM_MEMORY_WINDOW_OFFSET +
offsetof(DPM_DATA_PACKET, byExtDataStructType)
,EST_NONE);
Write_To_FPGA_Byte_RAM_Ptr_Global(DPM_MEMORY_WINDOW_OFFSET ,DPM_STATUS_OK);
// Выдать IRQ через ПЛИС к PCI-E
Write_To_FPGA_Byte_RAM_Ptr_Global(DPM_CPU_INTERRUPT_ADDR, COMMAND_PROGRAMM_MCU_FLASH + Block_Num + 1);
// Ожидание инкремнированной команды
UINT8 Com = Read_From_FPGA_Byte_RAM_Ptr_Global(DPM_MCU_INTERRUPT_ADDR);
while (Com != COMMAND_PROGRAMM_MCU_FLASH + Block_Num )
Com = Read_From_FPGA_Byte_RAM_Ptr_Global(DPM_MCU_INTERRUPT_ADDR);
}
[size=1]
Спасибо Вам!

Сообщение отредактировал Bom_Shankar - Nov 6 2007, 13:58
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Nov 6 2007, 17:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А вы контролировали в асм-овом исходнике как эта команда
Код
*(BYTE*)(0x4000 + Block_Num*8192 + i) = Buffer_1_Byte;

компилируется? И нельзя ли ее записать "по-человечески", с использованием указателя? Что-то типа
Код
BYTE *ptr_block=(BYTE *)0x4000;
ptr_block+=(BYTE *)(Block_Num*8192);
ptr_block[i]=Buffer_1_Byte;
Go to the top of the page
 
+Quote Post
Bom_Shankar
сообщение Nov 7 2007, 08:27
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 15-12-06
Пользователь №: 23 554



Цитата(rezident @ Nov 6 2007, 20:22) *
А вы контролировали в асм-овом исходнике как эта команда
Код
*(BYTE*)(0x4000 + Block_Num*8192 + i) = Buffer_1_Byte;

компилируется? И нельзя ли ее записать "по-человечески", с использованием указателя? Что-то типа
Код
BYTE *ptr_block=(BYTE *)0x4000;
ptr_block+=(BYTE *)(Block_Num*8192);
ptr_block[i]=Buffer_1_Byte;


Компилируется
*(BYTE*)(0x4000 + Block_Num*8192 + i) = Buffer_1_Byte; // пишем байт
в
MOV.B R10, R12
AND.W #0xff, R12
MOV.W #0x2000, R14
CALL #?Mul16
ADD.W #0x4000, R12
ADD.W R9, R12
MOV.B R8, 0(R12)
А на счёт формы записи - так у меня просто компактно в одну строчку, по сути тоже самое. Ваш примерчик попробовал - не помогло, тоже самое . Видно здесь какой-то скрытый ньюанс именно с флеш. В предыдущем варианте реализации этой же задачи у меня тоже не получилось полностью, но что интересно, там я делал поблочное стирание флешки, а не как здесь целиком, и вот где-то условно в середине флешки тоже всё зависало, но при этом часть флешки удавалось записать, во всяком случае запись не подвешивала МК(до какого-то места в середине флеш).
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 7 2007, 11:35
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Bom_Shankar @ Nov 7 2007, 13:27) *
MOV.B R10, R12
AND.W #0xff, R12
MOV.W #0x2000, R14
CALL #?Mul16
ADD.W #0x4000, R12
ADD.W R9, R12
MOV.B R8, 0(R12)

Замените умножение на сдвиги, а то этот вызов функции из Flash вам все и подвешивает.
Вместо Block_Num*8192 Block_Num<<13
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 23:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016