R2A15220FP datasheet продолжение старой темы.
- Войдите на сайт для отправки комментариев
Хотелось бы закончить начатое в старой теме но т.к. местные флудеры ее зафлудили и она была заблокирована то создаю новую.
Предыстория такая: Было необходимо создать инструмент для реверс инжиниринга r2a15220fp, это микросхема широко применялась/применяется в ресиверах японского производства.
И так собственно сам даташит Тык!
Немного об инструменте который применялся для реверса данной микросхемы.
Управление производится из монитора порта arduino, но лучше использовать Terminal1.9b, там можно назначить макросы для быстрого управления программой.
Собственно само управление простое, пишем в консоль команды и наблюдаем за происходящим.
Пишем команды в нижнем регистре, все значения в десятичном представлении.
r - Запуск авто режима перебора и отправки в SPI данных
s - Остановка авто режима
d - В авто режиме данные будут уменьшатся на заданное значение
i - В авто режиме данные будут увеличиваться на заданное значение
t**** - (где **** значение от 0000...9999 миллисекунд) Время задержки между отправками пакетов в SPI
b** - (где ** значение от 01...32) Количество бит данных выводимых через SPI
q** - (где ** значение от 01...32) Начальный бит с которого будет стартовать авто режим
m********** - (где ********** значение от 0000000001...4294967295) Задаем маску для изменения сразу нескольких бит одновременно в авто режиме
0...4294967295 - Ну и собственно десятичное число для записи в регистр и отправки в SPI (можно писать сразу после всех выше описаных команд)
Все значения можно менять на лету и в любой последовательности. По умолчанию 8 пин MOSI, 9-SCK.
Ну и конечно сам скетч.
//определяем пины SPI #define MOSI_PIN PB0 // MOSI PORTB.0 (Pin 8 Arduino) #define SCK_PIN PB1 // CLK PORTB.1 (Pin 9 Arduino) unsigned long bitmask = 1; // битовая маска для возведения в степень unsigned long recievedByte2 = 0; // промежуточная переменная для хранения принятого из Serial unsigned long recievedByte3 = 0; // переменная для хранения данных для отправки в SPI unsigned int timeDelay = 1000; // Значение задержки при выводе в автоматическом режиме boolean dataOutFlag = false; // Флаг готовности данных к выводу через SPI и Serial boolean autoStart = false; // Флаг авто сканирования boolean incDec = false; // Флаг инкремента либо декремента byte bitIncDec = 1; // Начальный бит для авто режима byte byteSerialIn = 0; // определяем переменную для получаемого байта из Serial byte bitNumber = 16; // Переменная для хранения количества бит передаваемых через SPI void setup() { Serial.begin(115200); //инициализируем последовательное соединение pinMode(9, OUTPUT); pinMode(8, OUTPUT); digitalWrite(9, LOW); digitalWrite(8, LOW); } void loop() { while (Serial.available()) // Если есть доступные данные то читаем { byteSerialIn = Serial.read(); // Сохраняем принятые данные в переменную if (dataOutFlag == false) menu(); // Если мы приняли первый байт то проверяем есть ли в нем информация о изминении режима (r,s,d,i,t,b,q) if (byteSerialIn > 47 && byteSerialIn < 58) // Проверяем не содержит ли текущий байт цифр (0...9) { recievedByte2 = recievedByte2*10 + byteSerialIn -'0'; // Заполняем регистр для передачи данных recievedByte3 = recievedByte2; // Копируем в регистр для вывода } delay(100); // Задержка для чтения второго байта dataOutFlag=true; // Первый байт принят } if(Serial.available() == 0 && dataOutFlag) // Если данные приняты по Serial и готовы к отправке { dataout(); // Выводим данные на SPI infoOutSerial(); // Выводим информацию в терминал byteSerialIn = 0; // Обнуляем промежуточные переменные recievedByte2 = 0; dataOutFlag=false; // Данные отправлены } if (Serial.available() == 0 && autoStart) // Если включен режим авто то запускаем { if (incDec) recievedByte3 -=bitmask; // - к текущему значению байта для вывода в SPI else recievedByte3 += bitmask; // + к текущему значению байта для вывода в SPI dataout(); // Выводим данные на SPI infoOutSerial(); // Выводим информацию в терминал delay(timeDelay); // Формируем задержку для авто режима } } void menu() // Проверяем какой режим выбран { switch (byteSerialIn) { case 98: // Если символ 'b' то принимаем еще два байта значения bitNumber = 0; for (byte b=0; b<2; b++) { delay(100); bitNumber = bitNumber*10 + Serial.read() -'0'; } break; case 113: // Если символ 'q' то принимаем еще два байта значения bitIncDec = 0; for (byte b=0; b<2; b++) { delay(100); bitIncDec = bitIncDec*10 + Serial.read() -'0'; } bitmask=1; for (byte b=(bitIncDec-1); b!=0; b--) { bitmask <<= 1; } break; case 100: // Если символ 'd' incDec = true; // то в режиме авто данные в SPI будут уменьшаться break; case 105: // Если символ 'i' incDec = false; // то в режиме авто данные в SPI будут увеличиваться break; case 109: // Если символ 'm' то принимаем еще 11 байта значения bitmask = 0; for (byte b=0; b<10; b++) { delay(100); bitmask = bitmask*10 + Serial.read() -'0'; } bitIncDec = 0; break; case 114: // Если символ 'r' autoStart = true; // то включаем авто режим break; case 115: // Если символ 's' autoStart = false; // то выключаем авто режим break; case 116: // Если символ 't' то принимаем еще 4 байта значения timeDelay = 0; for (byte b=0; b<4; b++) { delay(100); timeDelay = timeDelay*10 + Serial.read() -'0'; } break; } } void infoOutSerial() // Выводим данные в Serial { Serial.print("BIN"); Serial.print("-"); print_binary((recievedByte3>>16),16); Serial.print("_"); print_binary(recievedByte3,16); Serial.print(" "); Serial.print("HEX"); Serial.print("-"); print_hex((recievedByte3>>16), 16); Serial.print("_"); print_hex(recievedByte3, 16); Serial.print(" "); Serial.print("DEC"); Serial.print("-"); Serial.print(recievedByte3,DEC); Serial.print("\t"); Serial.print("TrBit"); Serial.print("-"); Serial.print(bitNumber,DEC); if (incDec) { Serial.print(" "); Serial.print("Auto--"); } else { Serial.print(" "); Serial.print("Auto++"); } Serial.print(" "); Serial.print("Time ms"); Serial.print("-"); Serial.print(timeDelay,DEC); Serial.print(" "); Serial.print("StartBit"); Serial.print("-"); if (bitIncDec==0) Serial.print("Eigenvalue."); else Serial.print(bitIncDec,DEC); Serial.println(); } void dataout() // Выводим данные в SPI { for (byte i=(bitNumber-1); i!=255; i--) // Определяем количество бит данных (bitNumber-1) { if(recievedByte3&(1UL<<i)) PORTB |= (1<<MOSI_PIN); // Если бит (i) равен 1 то устанавливаем бит в регистре PORTB.0 (MOSI) else PORTB &= ~(1<<MOSI_PIN); // Иначе сбрасываем бит в регистре PORTB.0 (MOSI) delayMicroseconds(2); // Формируем задержку для CLK PORTB |= (1<<SCK_PIN); // Устанавливаем бит на шине CLK (PORTB.1) delayMicroseconds(2); PORTB &= ~(1<<MOSI_PIN); // Сбрасываем бит в регистре PORTB.0 (MOSI) if (i==0) // Проверяем не является ли текущий бит младшим { // Если бит младший: PORTB |= (1<<MOSI_PIN); // формируем защелку (устанавливаем бит в PORTB.0) delayMicroseconds(2); // формируем задержку для защелки } else // Если бит (i) не является младшим { delayMicroseconds(2); // Формируем задержку для CLK } PORTB &= ~(1<<SCK_PIN); // Сбрасываем бит на шине CLK (PORTB.1) } delayMicroseconds(2); // формируем задержку для сброса защелки PORTB &= ~(1<<MOSI_PIN); // Сбрасываем защелку PORTB.0 (MOSI) } void print_binary(int v, int num_places) // Вывод BIN { int mask=0, n; for (n=1; n<=num_places; n++) { mask = (mask << 1) | 0x0001; } v = v & mask; // truncate v to specified number of places while(num_places) { if (v & (0x0001 << num_places-1)) { Serial.print("1"); } else { Serial.print("0"); } --num_places; if(((num_places%4) == 0) && (num_places != 0)) { Serial.print("_"); } } } void print_hex(int v, int num_places) // Вывод HEX { int mask=0, n, num_nibbles, digit; for (n=1; n<=num_places; n++) { mask = (mask << 1) | 0x0001; } v = v & mask; // truncate v to specified number of places num_nibbles = num_places / 4; if ((num_places % 4) != 0) { ++num_nibbles; } do { digit = ((v >> (num_nibbles-1) * 4)) & 0x0f; Serial.print(digit, HEX); } while(--num_nibbles); }
https://drive.google.com/file/d/1549AUZB0ob-ALyLVXwvgwXOCnW8LoZi3/view?usp=sharing обновил ссылку на файл даташита.
Небольшая программа для согласования digital платы от RX-V475 c main от RX-V371.
Вход SPI 11-MOSI пин и 13-CLK (к этим пинам подключаем плату digital). Выход 8-MOSI пин и 9-CLK (Эти выводы подключаем к R2A).
Arduino 16 мГц. питание от 3,3 вольт для исключения согласования уровней.
Все основные функции работают, позже дополню код для активации выходов AV.
Код:
Efim, не вполне понтно, что за ардуина у вас?
Почему вы одни пины обозначаете PB0 PB1. а другие - номерами?
Если это обычная Про мини или Нано(на что намекают типичные для Атмеги168/328 номера пинов )- я не вполне понимаю, как работает такая конструкция:
если SCK_PIN_1 - это PB1
Или для обычной Атмеги тоже можно образаться к портам по символическим именам?
b707
Обычная Про мини, а конструкция такая используется для прямого обращения к порту т.к. если пользоватся стандартными средствами ардуино то скорость падает в разы. Просто плата работает в режиме буфера и необходима большая скорость обработки и отправки, прием идет на скорости 180 кГц.
Не знал, что в Про мини тоже определены макросы типа PB0 PB1. Или вы их сами где-то описали?
b707
Нет, ничего нигде не описывал, это вроде как стандартные средства языка СИ для данного микроконтроллера. Все брал из даташита на микросхему.
Стандартные средства языка СИ не при чём. PB0, PB1 и т.д. определены где-то в заголовочных файлах.
Jeka_M
Не хотел углубляться но вы правы! Все это определено в файлах portpin.h, io.h и iom328p.h в моем случае. Файлы лежат по пути C:\arduino-1.8.5\hardware\tools\avr\avr\include\avr. Среда ардуино подключает эти файлы автоматически при выборе платы. Поэтому я и указал что это стандартные средства для данного микроконтроллера. Вообще это все сделано для удобства чтоб не путаться. А товарищу выше разъяснять это нету желания т.к. он наговорил мне кучу гадостей, пел какой он крутой прогер, а такие простые вещи не знает.
Поэтому я и указал что это стандартные средства для данного микроконтроллера. Вообще это все сделано для удобства чтоб не путаться. А товарищу выше разъяснять это нету желания т.к. он наговорил мне кучу гадостей, пел какой он крутой прогер, а такие простые вещи не знает.
ну зачем же врать-то? :) О том, что я крутой прогер - я нигде не писал, не имею такой привычки. Извольте подкрепить свои слова цитатой.
Писать про вас гадости - это было, не отрицаю. Но себя не восхвалял.
Что касается того, что я чего-то не знаю -никогда не поздно учиться новому.
b707
Конечно, я могу вам напомнить эти моменты из темы http://arduino.ru/forum/programmirovanie/2xspi-na-arduino?page=1:
0) Пост 54 - Тут я понял, что вы владеете множеством языков и можете переводить технические документации на лету. Так же стало ясно что ваше мастерство по владению клавиатурой в набирание запросов гугл превзошло мое.
1) Пост 66 - первые предпосылки к тому что ваш мозг превзошел мой, вы написали GPS навигатор длиною 20 строк).
2) Пост 75 - вы раскритиковали некоторые мои наблюдения по недостатка платформы arduino, это говорит о том, что вы хорошо знаете эту платформу и знаете все тонкости и нюансы (мы сейчас не про Си чтоб вы понимали). По началу я даже в себе усомнился и все перепроверил но как оказалось ничего не изменилось. Так же из этого поста я понял что вы очень хорошо разбираетесь в библиотеках написанных для arduino.
3) Пост 77 - тут я узнал что вы большой специалист по циклу for.
4) Пост 78,81 - Дают понять что вы явно интеллектуально выше меня, хотя вы даже не понимаете что 2 строчки кода это образное выражение. Если хотите знать точно то там 487 строк кода переписанных с нуля.
И после этого вы спрашиваете про PA, PB, PC, PD,) Задаете просто глупейший вопрос. Скорее всего, вы даже не знаете, как напрямую обратится к порту или области памяти в программе вообще без всех этих улучшайзеров имея только даташит. А это ведь все из ассемблера пришло, а вы раскритиковали и это.
Во всех этих процитированных местах я нигде не писал о своей крутости - а всего лишь поплясал на вашей никчемности. Вряд ли это можно назвать моим самовосхвалением, ибо вы в той ветке показали себя полным нулем. Не так уж велика честь быть выше нуля...
[quote=Efim]
И после этого вы спрашиваете про PA, PB, PC, PD,) Задаете просто глупейший вопрос. Скорее всего, вы даже не знаете, как напрямую обратится к порту или области памяти в программе вообще без всех этих улучшайзеров имея только даташит
[\quote]
Когда я чего-то не знаю - я никогда не стыжусь этого признать. В данном случае я действительно не знал, что для отдельных битов каждого порта Атмеги328 определены макросы PB0 PB1 и тд. Я полагал, что подобные макросы есть только на других МК, в частности на СТМ32
А вот вы, похоже, крайне болезненно относитесь к любой критике. В прошлый свой приход вы в ответ нз поначалу довольно дружелюбные замечания устроили срач. Сейчас вы явно пришли с целью реванша - показать, как круто вы решили свою проблему без помощи форума. Но опять заходите неверно - на совершенно спокойный вопрос снова начинаете дрязгу.
b707
Для какого реванша? Это вы же развиваете тему в данном направлении. А я свои обещания выполняю.
Если вы еще не поняли, поясню. В той теме был хороший человек Alex_Ferrum, дал хорошие советы. И если вы не заметили именно по его советам и написан код. В посте 20 я подробно расписал что и как будет происходить дальше. За что Alex_Ferrum огромное спасибо!
На этом форуме очень много хороших и умных людей, которые так же без лишних понтов просто помогали советом, за что тоже спасибо. А про вас я понял что вы брехун и вы по сути и являетесь тем самым нулем. А все что было после 20 поста - это чистый стеб таких как ты.
ну я действительно не хочу провоцировать новый срач. Хорошо, что вы привели ссылку на ту ветку - каждый желающий может пойти и убедится самостоятельно, кто тут кто...
Конечно поэтому давайте не будем двигаться в данном направление, я давно призывал к взаимоуважению. А по изначальному вопросу могли бы и погуглить, вы ведь в этом мастер)
Забавно. Не понимаю, чего там вы не поделили.
Мне не понятна изначальная задача программы. Было несколько блоков от разных рессиверов и хотелось их соединить? Или как?
У меня самого RX-V475 и менять его на RX-V371 не вижу смысла. Лучше починю. Наоборот я бы понял.
mykaida
А у меня наоборот есть RX-V371 но сгорел процессор на плате digital, а т.к. валялась плата от RX-V475 то решил ее прикрутить) Появились допы в виде USB и интернет радио. Заодно сделал даташит для r2a15220fp, может самоделкиным пригодится. А покупать новую плату по цене ресивера не было желания.
mykaida
Заодно сделал даташит для r2a15220fp, может самоделкиным пригодится.
Дело нужное! А если сделаешь библиотеку, так и мировая известность. Удачи!
mykaida
Спасибо!