Warning: touch() [function.touch]: Unable to create file /home/starterkit/starterkit.ru/html/error.log because Permission denied in /home/starterkit/starterkit.ru/html/errorhandler.php on line 51
Не корректная работа с IAP интерфейсом... - MLPC23XX - SK - Форум - starterkit.ru
Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Старый форум » SK-MLPC23XX
Не корректная работа с IAP интерфейсом...
modiffer (Guest)
Добавлено 30.11.1999 00:00 Редактировалось 24.03.2009 08:19
0
Сообщение: 1
modiffer (Guest)

Topic opened
Спуститься к концу Подняться к началу
modiffer (Guest)
Добавлено 25.12.2008 12:03 Редактировалось 25.12.2008 12:03 Сообщение: 2
modiffer (Guest)

Как узнать версию bootloader-a на плате SK-MLPC2378?..
Проблема в том что не удалось по IAP интерфейсу программировать (с внутренней программы) flush память чипа,
Проведя неделю по многим форумам пришел к выводу что возможно
это проблема загрузчика чипа, но новую прошивку еще не нашел...

Исходники прилагаются, вопрос: в чем собственно проблема?
это некорректный код IAP или проблема загрузчика, или в что не так?..

И еще есть исходник под эту плату (чип) USB флешки?

(Программирую в Keil, отладка через j-link6)

Исходник IAP:

Код
#include <LPC23xx.H>


// Clock Frequency

#define XTAL 12000000 // Oscillator Frequency

#ifdef BYPASS_PLL
#define CPUCLK XTAL // CPU Clock without PLL
#else
#define CPUCLK (XTAL*5) // CPU Clock with PLL
#endif

#define CCLK (CPUCLK / 1000) // CPU Clock in kHz


// Phase Locked Loop (PLL) definitions
#define PLL_BASE 0xE01FC080 // PLL Base Address
#define PLLCON_OFS 0x00 // PLL Control Offset
#define PLLSTAT_OFS 0x08 // PLL Status Offset
#define PLLFEED_OFS 0x0C // PLL Feed Offset
#define PLLCON_PLLE 0x01 // PLL Enable
#define PLLCON_PLLD 0x00 // PLL Disable
#define PLLCON_PLLC 0x03 // PLL Connect
#define PLLSTAT_PLOCK 0x0400 // PLL Lock Status


struct iap_in {
unsigned int cmd;
unsigned int par[4];
};

typedef void (*IAP)(struct iap_in *in, unsigned int *result);
#define iap_entry ((IAP) 0x7FFFFFF1) // IAP Entry Point


/* Default Interrupt Function: may be called when interrupts are disabled */
void def_isr (void) __irq {
;
}


#ifdef BYPASS_PLL

/*
* PLL Feed Sequence
*/
void feed_pll (void) {
unsigned int adr, r1, r2;

adr = PLL_BASE;
__asm {
MOV r1, #0xAA
MOV r2, #0x55
STR r1, [adr, #PLLFEED_OFS]
STR r2, [adr, #PLLFEED_OFS]
}
}

/*
* Switch CPU to PLL clock
*/
void start_pll (void) {

PLLCON = PLLCON_PLLE;
feed_pll();
while ((PLLSTAT & PLLSTAT_PLOCK) == 0);
PLLCON = PLLCON_PLLC;
feed_pll();
}

/*
* Switch CPU to standard XTAL
*/
void stop_pll(void) {

PLLCON = PLLCON_PLLD;
feed_pll();
}

#endif


/*
* Convert 'addr' to Sector Number
*/
unsigned int get_secnum (unsigned int addr) {
unsigned int n;

n = ((unsigned int) addr >> 13) & 0x1F; // Pseudo Sector Number

if (n >= (0x30000 >> 13)) {
n -= 14; // High Small 8kB Sectors
}
else if (n >= (0x10000 >> 13)) {
n = 7 + (n >> 3); // Large 64kB Sectors
}
return (n); // Sector Number
}


/*
* Erase Sector between 'start' and 'end'
* Return: IAP Error Code (0 when OK)
*/
unsigned int erase (unsigned int start, unsigned int end) {
struct iap_in iap; // IAP Input Parameters
unsigned int result[16]; // IAP Results

#ifdef BYPASS_PLL
stop_pll(); // IAP requires to run without PLL
#endif

iap.cmd = 50; // IAP Command: Prepare Sectors for Write
iap.par[0] = get_secnum (start); // Start Sector
iap.par[1] = get_secnum (end); // End Sector
iap_entry (&iap, result); // Call IAP Function
if (result[0]) goto exit; // Error occured?

iap.cmd = 52; // IAP Command: Erase Flash
iap.par[0] = get_secnum (start); // Start Sector
iap.par[1] = get_secnum (end); // End Sector
iap.par[2] = CCLK; // CPU Clock
iap_entry (&iap, result); // Call IAP Function

exit:

#ifdef BYPASS_PLL
start_pll(); // Start PLL
#endif

return (result[0]);
}


/*
* Program *data to addr, number of bytes specified by size
* Return: IAP Error Code (0 when OK)
* NOTES: size should be 512, 1024, 4096 or 8192
*/
unsigned int program (unsigned int addr, unsigned char *data, unsigned int size) {
struct iap_in iap; // IAP Input Parameters
unsigned int result[16]; // IAP Results

#ifdef BYPASS_PLL
stop_pll(); // IAP requires to run without PLL
#endif

iap.cmd = 50; // IAP Command: Prepare Sectors for Write
iap.par[0] = get_secnum (addr); // Start Sector
iap.par[1] = iap.par[0]; // End Sector
iap_entry (&iap, result); // Call IAP Function
if (result[0]) goto exit; // Error occured?

iap.cmd = 51; // IAP Command: Copy RAM to Flash
iap.par[0] = addr; // Destination Address
iap.par[1] = (unsigned int) data; // Source Address
iap.par[2] = size; // Number of Bytes
iap.par[3] = CCLK; // CPU Clock
iap_entry (&iap, result); // Call IAP Function

exit:

#ifdef BYPASS_PLL
start_pll(); // Start PLL
#endif

return (result[0]);
}


unsigned char vals[512];


void main (void) {
unsigned int i;

unsigned int volatile start;

for (start = 0; start < 1000000; start++) {
; // wait for debugger connection (about 0.3 sec)
}

for (i = 0; i < sizeof (vals); i++) {
vals[i] = (unsigned char) i;
}

erase (0x30000, 0x33FFF);
program (0x30000, vals, sizeof (vals));
program (0x31000, vals, sizeof (vals));
program (0x32000, vals, sizeof (vals));

while (1);
}
Спуститься к концу Подняться к началу
starterkit (Guest)
Добавлено 25.12.2008 12:20 Редактировалось 25.12.2008 12:20 Сообщение: 3
starterkit (Guest)

Пару лет назад, еще на безревизионных чипах, пользовался IAP aфунциями для перепрограммирования самих LPC2378, особых проблем не испытывал.
Выложить исходники не могу, сори, не моя собственность, так что ищите причину ...
Спуститься к концу Подняться к началу
modiffer (Guest)
Добавлено 25.12.2008 18:18 Редактировалось 25.12.2008 18:18 Сообщение: 4
modiffer (Guest)

Удалось выяснить в чем ошибка, в каждом чипе разные размеры секторов памяти, в результате чиста и резервирование
flush происходит в одном секторе, а запись совершенно в другом :(
Ушел искать инфоу размеров секторов в lpc2378...
Спуститься к концу Подняться к началу
starterkit (Guest)
Добавлено 25.12.2008 18:36 Редактировалось 25.12.2008 18:36 Сообщение: 5
starterkit (Guest)

Далеко искать не надо, это все в юзер мануале есть в разделе Flash memory programming firmware

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно starterkit 25.12.2008 г. в 18:36:52
Спуститься к концу Подняться к началу
Boris (Guest)
Добавлено 23.03.2009 15:35 Редактировалось 23.03.2009 15:35 Сообщение: 6
Boris (Guest)

modiffer!
Большое СПС за код!
Работает!!!
Спуститься к концу Подняться к началу
Boris (Guest)
Добавлено 24.03.2009 08:19 Редактировалось 24.03.2009 08:19 Сообщение: 7
Boris (Guest)

Вопрос!
Размеры секторов:
// Specify Size and Address of Sectors
0x001000, 0x000000, // Sector Size 4kB ( 8 Sectors)
0x008000, 0x008000, // Sector Size 32kB (14 Sectors)
0x001000, 0x078000, // Sector Size 4kB ( 5 Sectors)

как пишутся полностью 32КБ сектора, если размер однократной записи

* NOTES: size should be 512, 1024, 4096 or 8192
Спуститься к концу Подняться к началу
Форум » starterkit.ru » Старый форум » SK-MLPC23XX