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

 
 
> IAP. Лыжи не едут или как...
EXeGLuMATOR
сообщение Apr 2 2008, 08:51
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



В общем надо записывать флэш.
Определения:
Код
#define IAP_LOCATION 0x7FFFFFF1
typedef void (*IAP)(unsigned int [], unsigned int []);
#define iap_entry ((IAP) IAP_LOCATION)

unsigned int    command[5];
unsigned int    result[2];


Собственно функция стирания секторов:
Код
unsigned int erase (unsigned int start, unsigned int end)
{

  command[0]= IAP_PREPARE_SECTOR;              // IAP Command: Prepare Sectors for Write (50)
  command[1] = 3;//Get_sector(start);              // Start Sector
  command[2] = 3; //Get_sector(end-1);     // End Sector
  iap_entry(command, result);               // Call IAP Function
  if (result[0]==0)
  {
       u0putstr("Preparing sector`s ok. Erasing...\r\n");
    command[0] = IAP_ERASE_SECTOR;           // IAP Command: Erase Flash (52)
      command[1] = Get_sector (start);         // Start Sector
      command[2] = Get_sector (end-1);            // End Sector
      command[3] = PCLK/1000;                  // CPU Clock
      iap_entry(command,result);           // Call IAP Function
  }
}

При вызове IAP_PREPARE_SECTOR возвращает ошибку 7: INVALID_SECTOR. Я уже по всякому и объявлять пытался и т.п. - ни в какую. И номера секторов ручками пишу и по всякому. Результат один.
массив команд заполнен вроде как верно. Примеры смотрел, документацию читал. Все вроде как там. И не работает.
Камень LPC2106, LPC2103. PLL и т.п. отключены. Кварц 14.7456
Может гитьки какие есть? Если когда-то была установлена защита - она стирается при полнеом стирании флэша? И влияет ли она на эти процедуры?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 2 2008, 12:28
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(EXeGLuMATOR @ Apr 2 2008, 11:51) *
command[0]= IAP_PREPARE_SECTOR; // IAP Command: Prepare Sectors for Write (50)
а чему равно IAP_PREPARE_SECTOR? Бывает указывают 0x50... Прерывания не забываете запрещать? В конце ОЗУ не забыли зарезервировать область 32 байта для IAP чтобы в нее случайно стек не залез?

Код
// (Philips) Status Codes
enum iap_status_t
{
    CMD_SUCCESS, INVALID_CMD,
    SRC_ADDR_ERROR, DST_ADDR_ERROR, SRC_ADDR_NOT_MAPPED, DST_ADDR_NOT_MAPPED,
    COUNT_ERROR, INVALID_SECTOR, SECTOR_NOT_BLANK, SECTOR_NOT_PREPARED,
    COMPARE_ERROR, BUSY, PARAM_ERROR, ADDR_ERROR, ADDR_NOT_MAPPED,
    CMD_LOCKED, INVALID_CODE, INVALID_BAUD_RATE, INVALID_STOP_BIT, CODE_READ_PROT_ENABLED, OUT_OF_MEMORY, MAX_ERROR
};

enum iap_cmd_t
{
    PREPARE = 50, COPY, ERASE, BLANK_CHECK, GET_PART_ID, GET_BOOT_VER, COMPARE,
    SIZE_ALIGN = 0xFFFFFFFF // make iap_cmd_t 4-bytes width
};

struct iap_command_t
{
    iap_cmd_t    Command;
    uint32_t        Param[4];
};
struct iap_result_t
{
    iap_status_t    Status;
    uint32_t        Result[4];
};

extern "C" __thumb void IAP(iap_command_t *params, iap_result_t *result); // IAP объявлено в скрипте линкера, компилится более эффективный вызов, чем по указателю.

iap_status_t Erase (uint_fast8_t start_sector, uint_fast8_t end_sector)
{
    iap_command_t Cmd;
    iap_result_t Res;

    Cmd.Command = PREPARE;
    Cmd.Param[0] = start_sector;
    Cmd.Param[1] = end_sector;

    critical_t cs;
    IAP(&Cmd, &Res);
    
    if (Res.Status == CMD_SUCCESS)
    {
        Cmd.Command = ERASE;
        Cmd.Param[0] = start_sector;
        Cmd.Param[1] = end_sector;
        Cmd.Param[2] = CCLK / 1000;

        IAP(&Cmd, &Res);
    }
    return Res.Status;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
lebiga
сообщение Jan 22 2009, 12:30
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292



Цитата(Сергей Борщ @ Apr 2 2008, 15:28) *
Код
extern "C" __thumb void IAP(iap_command_t *params, iap_result_t *result); // IAP объявлено в скрипте линкера, компилится более эффективный вызов, чем по указателю.
}

А как в скрипте линкера (.icf - IAR520) объявить IAP?
Это не работает:
define symbol IAP = 0x7FFFFFF1;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- EXeGLuMATOR   IAP. Лыжи не едут или как...   Apr 2 2008, 08:51
- - YAM   У меня вот так все работает, правда для LPC2136: ...   Apr 2 2008, 09:44
- - EXeGLuMATOR   Эффект тот-же. Абсолютно. И еще, если command, re...   Apr 2 2008, 10:53
- - EXeGLuMATOR   Так... А как резервировать область? Подозреваю что...   Apr 2 2008, 13:15
|- - Сергей Борщ   Цитата(EXeGLuMATOR @ Apr 2 2008, 16:15) Т...   Apr 2 2008, 13:22
- - EXeGLuMATOR   Попробовал определения как описал - результат тот-...   Apr 2 2008, 13:54
|- - lebiga   Цитата(EXeGLuMATOR @ Apr 2 2008, 16:54) П...   Apr 2 2008, 14:12
- - EXeGLuMATOR   Да там и не стояло их отродясь. Причем и на новых ...   Apr 2 2008, 17:33
|- - SeregaB   Цитата(EXeGLuMATOR @ Apr 2 2008, 20:33) Д...   Apr 3 2008, 06:26
- - EXeGLuMATOR   Да у меня 512 и стоит. В общем закомментил все, к...   Apr 3 2008, 07:04
- - EXeGLuMATOR   Подключил. Все заработало. Причем все в том виде ...   Apr 3 2008, 15:35
|- - Сергей Борщ   Цитата(EXeGLuMATOR @ Apr 3 2008, 18:35) Т...   Apr 3 2008, 19:34
- - EXeGLuMATOR   Да вот почти также все. Привел типы все и вроде ок...   Apr 3 2008, 22:03


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

 


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


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