Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись во внутреннюю flash ADuC7060
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Croman13n3c
Пытаюсь записать во flash контроллера

Код
void Write2Flash (void)
{
unsigned short i=0;
unsigned short *tempd= (unsigned short*)&uCalibrate; //указатель на структуру данных
unsigned short data;
unsigned short     AppStartAddr =0x7400; //адресс начала данных во flash


for(i = AppStartAddr; i < 0x7800; i += 0x200)   //очистим 2 блока по 512 байт
    {
    FEEMOD =0x0108;//разрешить запись
    FEEADR = AppStartAddr;                 // set data address
    FEECON = 0x05;                         // erase page command
    while (!(FEESTA & 0x03)){ }
    }

for(i=0;i<(sizeof(struct CalibrateStruct));i+=2)
            {
            data = (*(tempd+i));
             FEEMOD = 0x0108;                     //разрешить запись
            FEEADR = AppStartAddr;        // set data address
            FEEDAT = data;                // set data value (16 bit register)
            FEECON = 0x02;            // single Write command
            while (!(FEESTA&0x03)){ }
                
            AppStartAddr += 1;                
            }
}


И считать при старте:

Код
void ReadFlash (void)
{

unsigned short i=0;
unsigned short *tempd= (unsigned short*)&uCalibrate;
unsigned short     AppStartAddr =0x7400;

for(i=0;i<(sizeof(struct CalibrateStruct));i+=2)
            {
                FEEMOD = 0x0100;
                FEEADR = AppStartAddr;  
                FEECON = 0x01;              //Single Read
                *(tempd+i)=FEEDAT;
                 AppStartAddr += 2;                                
            }

}


В результате имеем чистую структуру (что совсем не то, что ожидалось), или считаны/записаны (проверить не могу из-за отсутствия jtag ) только первые 2 байта.

Собственно вопрос - как писать и читать с флэша ?
AHTOXA
Цитата(Croman13n3c @ May 4 2011, 06:13) *
Собственно вопрос - как писать и читать с флэша ?

Читать - совсем просто:

uCalibrate = *(struct CalibrateStruct*)AppStartAddr;

Ну или memcpy().

А насчёт записи - во-первых, вы стираете только первую страницу:
CODE
for(i = AppStartAddr; i < 0x7800; i += 0x200) //очистим 2 блока по 512 байт
{
FEEMOD =0x0108;//разрешить запись
FEEADR = AppStartAddri; // set data address

и во-вторых, при записи наращиваете адрес побайтно:
Код
            AppStartAddr += 1;

, а надо по полслова.
Croman13n3c
Эти ошибки исправил, спасибо.

Но результат тотже, считываются 2 байта.
AHTOXA
Вот мой рабочий вариант: Нажмите для просмотра прикрепленного файла
Croman13n3c
Спасибо большое, теперь всё работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.