Найти в Дзене

Cкетч для считывания прошивки из MLT-BT05 cc2541

1.Берем прошивку программатора по ссылке тут 2. удаляем функцию loop() - в конце программы 3. Вставляем в конец эту часть программы: // выводит число в 10 ой системе счисления, 16-ричном формате и двоичном String code_int(int a){ return String(a) + " (0x" + String(a,HEX) + ") = (" + String(a,BIN) + ")"; } // основной цикл выполнения void loop() { unsigned char chip_id = 0; unsigned char debug_config = 0; unsigned char Continue = 0; unsigned char Verify = 0; String inStr; while(!Continue) // Ожидаем команду START { if(Serial.available()==2) // Проверяем доступны ли данные в последовательном порту { inStr = Serial.readStringUntil('\n'); // читаем строку из порта // Если START - то выйдем из цикла и продолжим дальше - это надо для нормального ожидания и готовности программы на компьютере if(inStr == "START") { Continue = 1; } else { Serial.read(); /* Clear RX buffer*/ } } } Serial.print("read Chip_id... "); // выводим строку в тер

1.Берем прошивку программатора по ссылке тут

2. удаляем функцию loop() - в конце программы

3. Вставляем в конец эту часть программы:

// выводит число в 10 ой системе счисления, 16-ричном формате и двоичном

String code_int(int a){

return String(a) + " (0x" + String(a,HEX) + ") = (" + String(a,BIN) + ")";

}

// основной цикл выполнения

void loop()

{

unsigned char chip_id = 0;

unsigned char debug_config = 0;

unsigned char Continue = 0;

unsigned char Verify = 0;

String inStr;

while(!Continue) // Ожидаем команду START

{

if(Serial.available()==2) // Проверяем доступны ли данные в последовательном порту

{

inStr = Serial.readStringUntil('\n'); // читаем строку из порта

// Если START - то выйдем из цикла и продолжим дальше - это надо для нормального ожидания и готовности программы на компьютере

if(inStr == "START") { Continue = 1; } else { Serial.read(); /* Clear RX buffer*/ }

}

}

Serial.print("read Chip_id... "); // выводим строку в терминал

debug_init(); // переходим в режим debug

chip_id = read_chip_id(); // посылаем в cc2541 команду chip_id

Serial.print(" .. ");

if(chip_id == 0) // если 0 - то значит чип не подключен

{

Serial.println("No chip detected");

return; // No chip detected, run loop again.

}

Serial.println(" ..");

Serial.println("chip_id = " + code_int(chip_id)); // выводим chip_id в терминал

Serial.println("");

while(1)

{

if(Serial.available()==2) // если что-то есть для чтения в порте, то есть пришла команда

{

inStr = Serial.readStringUntil('\n'); // Считываем строку с командой

if(inStr == "GET CHIPID") { // Если команда получения ид чипа

Serial.println("Commant GET CHIPID");

chip_id = read_chip_id();

Serial.println("chip_id = " + code_int(chip_id) );

}

if(inStr == "GET REV") { // Если команда получения ревизии чипа

Serial.println("Commant GET CHIPID");

int rev = read_rev();

Serial.println("rev = " + code_int(rev));

}

if(inStr == "GET CHIPINFO0") { // Получение значения регистра chipinfo0

Serial.println("Commant GET CHIPINFO0");

int inf = read_xdata_memory(0x6276);

Serial.println("CHIPINFO0 = " + code_int(inf));

}

if(inStr == "GET CHIPINFO1") { // Получение значения регистра chipinfo0

Serial.println("Commant GET CHIPINFO1");

int inf = read_xdata_memory(0x6277);

Serial.println("CHIPINFO0 = " + code_int(inf));

}

if(inStr == "READ FLASH") { // Если команда чтения прошивки из чипа

Serial.println("Commant READ FLAS");

Serial.println("addr : value (HEX)");

unsigned int addr = 0x0000; // начинаем читать прошивку с 0 адреса

int next = 1;

while (addr/128 <= 512 && next) // крутимпся до тех пор пока не прочитали все 512 блоков и до тех пор пока идет команда NEXT

{ // берем окно в 512 байт и посылаем команду на чтение блока прошивки

unsigned char bank = addr / (512 * 16);

unsigned int offset = (addr % (512 * 16)) * 4;

unsigned char read_data[512];

read_flash_memory_block(bank, offset, 512, read_data); // Bank,addr,count,dest

for(unsigned int i = 0; i < 512; i++) // проходим по каждому байту полученных данных и выводим отдельной строчкой в терминал

{

Serial.println(String(addr*4+i,HEX) + " : " + String(read_data[i],HEX) + " :: " + String(read_data[i]));

}

addr += (unsigned int)128; // сдвигаем окно считывания прошивки

while (Serial.available()!=2) { } // Ждем команду NEXT

inStr = Serial.readStringUntil('\n');

if(inStr == "NEXT") next = 1; else next = 0;

}

}

}

}

}