USMI

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Перевод JL чипов в uboot режим с помощью ардуино


Перевод JL чипов в uboot режим с помощью ардуино

Сообщений 1 страница 20 из 33

1

Чтобы перевести чип в режим прошивки нужно:
1. отключить чип от юсб компьютера
2. обесточить чип, т.е. напряжение питания на пинах чипа должно быть близко к 0.
3. подать напряжение питания на чип
4. сразу после этого (не позднее несколько мс) отправлять на  пины D+ D- 0х16EF, причем D+ = clock, D- = data
и проверять подтянул ли чип D+ и D- к земле (достаточно проверить один из них)
5. если да то подключить чип к юсб компьютера

Если чип не переходит в режим прошивки то см. п.1-4. В случае проблем удобно проверить работу анализатором логики за 10$.

Эта схема + скетч работают с 6905, 6956, 6925.

Код
Код:
#define PIN_DATA 11 // D- chip WHITE
#define PIN_CLOCK 10 // D+ chip GREEN 
#define PIN_CHIP_VCC A5 // 0=on 1=off
#define PIN_USB_CONNECT 2 // relay
#define PIN_PU 3 // external pull up
#define PIN_SW A0 // switch 1=NORMAL_MODE 0=BOOT_MODE
#define PIN_LED_R 5 // BOOT_MODE
#define PIN_LED_G 4 // NORMAL_MODE

#define BOOT_MODE 1
#define NORMAL_MODE 0

uint8_t mode = 255;
uint8_t boot_mode_ok=0;

void send_key()
{
  for(int8_t i = 15; i >= 0; i--)
  {    
    delayMicroseconds(15);
    digitalWrite(PIN_DATA, 0x16EF >> i & 0x1);
    digitalWrite(PIN_CLOCK, 0);
    delayMicroseconds(15);
    digitalWrite(PIN_CLOCK, 1);  
  }
}

void setup()
{  
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_CHIP_VCC, OUTPUT);
  pinMode(PIN_USB_CONNECT, OUTPUT);  
  pinMode(PIN_SW, INPUT_PULLUP);
  pinMode(PIN_CLOCK, INPUT);
  pinMode(PIN_DATA, INPUT);
  pinMode(PIN_PU, INPUT); 

  digitalWrite(PIN_LED_G, 0);
  digitalWrite(PIN_LED_R, 0);
  digitalWrite(PIN_CHIP_VCC, 1);
  digitalWrite(PIN_USB_CONNECT, 0);

  if(digitalRead(PIN_SW))   
    go_normal_mode();
  else  
    go_boot_mode();  
}

void go_boot_mode()
{
  if(mode != BOOT_MODE)
  {
    mode = BOOT_MODE;
    digitalWrite(PIN_LED_G, 0); // normal mode off
    digitalWrite(PIN_USB_CONNECT, 0); // disconnect usb
    digitalWrite(PIN_CHIP_VCC, 1); // chip power off    
    delay(1000);// discharge c on chip VCC
    digitalWrite(PIN_CHIP_VCC, 0); // chip power on
    delay(10); // wait for chip ready
    while(!boot_mode_ok)
    {
      pinMode(PIN_CLOCK, OUTPUT);
      pinMode(PIN_DATA, OUTPUT);
      send_key();   
      pinMode(PIN_CLOCK, INPUT);
      pinMode(PIN_DATA, INPUT);
      pinMode(PIN_PU, OUTPUT);
      digitalWrite(PIN_PU, 1); // external pull_up on
      if(!digitalRead(PIN_DATA))
      {      
        boot_mode_ok=1; // D- pulled down        
        pinMode(PIN_PU, INPUT);  // external pull_up off 
        digitalWrite(PIN_USB_CONNECT, 1); // connect usb
        digitalWrite(PIN_LED_R, 1); // boot_mode - red led on
      }
      pinMode(PIN_PU, INPUT);  // pull_up off 
      if(digitalRead(PIN_SW)) // abort
        break;
    }
  }
}

void go_normal_mode()
{
  if(mode != NORMAL_MODE)
  {
    digitalWrite(PIN_LED_R, 0); // boot_mode off
    digitalWrite(PIN_USB_CONNECT, 0); // disconnect usb
    digitalWrite(PIN_CHIP_VCC, 1); // chip power off      
    delay(1000); // discharge c
    digitalWrite(PIN_CHIP_VCC, 0); // power on
    digitalWrite(PIN_USB_CONNECT, 1); // connect usb
    digitalWrite(PIN_LED_G, 1); // normal mode on - green led
    boot_mode_ok = 0;
    mode = NORMAL_MODE;
  }
}

void loop() 
{
  if(digitalRead(PIN_SW)) 
    go_normal_mode();
  else  
    go_boot_mode();
}
Схема

Сопротивления резисторов некритичны, работает все 2,2к-10к. Разве что R1 я бы оставил 1к.
В схеме Relay_VCC подключается на напряжение питания реле, т.е. если 5В то на 5В от ардуино, если к примеру 12В то от дополнительного источника 12В.

Порядок работы: подключить чип к схеме, подключить схему к пк. При разомкнутом выключателе - нормальный режим работы (горит зеленый светодиод), при замкнутом - режим прошивки(красный светодиод). При переключении режимов 1 сек. пауза для разряда конденсаторов на питании чипа.

Вот еще упрощенная схема, без реле, и с одним светодиодом. Работает с тем же скетчем.
Порядок работы: чип подключить к схеме, подать питание на ардуино, как загорится светодиод быстро подключить схему к пк. Работает с 6905, 6956, 6925. РАБОТАЕТ НЕ СО ВСЕМИ СЕРИЯМИ ЧИПОВ. К примеру с AC696N вроде бы не работает. https://usmi.mybb.ru/viewtopic.php?id=12&p=3#p342

Схема

Еще вариант схемы с ключом по питанию чипа на P-MOSFET.

Схема

Здесь в форуме есть около 10 вариантов скетчей, к сожалению без схем.

Вместо реле можно использовать аналоговые ключи с низким rds_on (у меня работало на 74HC4053) или специальные юсб ключи.

Вся информация взята из форума.

2

раз ты такой умный, скажи - будет ли такая схема работать на jl7018?

3

ender11 написал(а):

раз ты такой умный, скажи - будет ли такая схема работать на jl7018?

Понятия не имею  :D . На чем работает написал. А какая схема?

4

Вариант на 74HC4053. Дополнительная функция: переключение между пк и юсб флэш. Удобно для тестирования после прошивки.

Схема

https://forumupload.ru/uploads/001b/ca/8a/24/t483115.png

Код
Код:
#define PIN_DATA A4 // D- chip WHITE
#define PIN_CLOCK A5 // D+ chip GREEN 
#define PIN_CHIP_VCC 4 // 0=on 1=off
#define PIN_PU 2 // external pull up

#define PIN_SW_MODE 9 // switch between modes, 1 = normal, 0 = boot
#define PIN_LED_R 5 // BOOT MODE
#define PIN_LED_G 6 // NORMAL MODE

#define PIN_LED_B 8 // device=flash
#define PIN_4053_A A0 // 74HC4053:11
#define PIN_4053_B A1 // 74HC4053:10
#define PIN_4053_INH 3 // 74HC4053:6
#define PIN_SW_DEVICE 10 // switch between pc and usb flash 1 = pc, 

#define PC 0 // X0 Y0
#define USB_FLASH 1 // X1 Y1

#define BOOT_MODE 1 
#define NORMAL_MODE 0 

uint8_t connected_device = 255;
uint8_t mode = 255;
uint8_t boot_mode_ok = 0;

/*
74HC4053:
X - 14 - D+ CHIP GN
Y - 15 - D- CHIP WH

X0 - 12 - D+ PC GN
Y0 - 2 - D- PC WH

X1 - 13 - D+ USB FLASH GN
Y1 - 1 - D- USB FLASH WH

*/

void disconnect_devices()
{
  digitalWrite(PIN_4053_INH, 1);
  connected_device = 255;
  digitalWrite(PIN_LED_B, 0);
}

void connect_device(uint8_t device)
{
  if(connected_device != device)
  {
    digitalWrite(PIN_4053_INH, 1);
    digitalWrite(PIN_4053_A, device);
    digitalWrite(PIN_4053_B, device);
    delay(1000); 
    digitalWrite(PIN_4053_INH, 0);
    digitalWrite(PIN_LED_B, device);
    connected_device = device;
  }
}

void send_key()
{
  for(int8_t i = 15; i >= 0; i--)
  {    
    delayMicroseconds(15);
    digitalWrite(PIN_DATA, 0x16EF >> i & 0x1);
    digitalWrite(PIN_CLOCK, 0);
    delayMicroseconds(15);
    digitalWrite(PIN_CLOCK, 1);  
  }
}

void setup()
{
  pinMode(PIN_4053_A, OUTPUT);
  pinMode(PIN_4053_B, OUTPUT);
  pinMode(PIN_4053_INH, OUTPUT);
  pinMode(PIN_SW_DEVICE, INPUT_PULLUP);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);
  pinMode(PIN_CHIP_VCC, OUTPUT);  
  pinMode(PIN_SW_MODE, INPUT_PULLUP);
  pinMode(PIN_CLOCK, INPUT);
  pinMode(PIN_DATA, INPUT);
  pinMode(PIN_PU, INPUT); 

  digitalWrite(PIN_CHIP_VCC, 1);

  if(digitalRead(PIN_SW_MODE))   
    go_normal_mode();
  else  
    go_boot_mode();  
}

void go_boot_mode()
{
  if(mode != BOOT_MODE)
  {
    mode = BOOT_MODE;    
    digitalWrite(PIN_LED_G, 0); // normal mode off
    disconnect_devices();
    digitalWrite(PIN_CHIP_VCC, 1); // chip power off    
    delay(1000); // discharge c on chip VCC
    digitalWrite(PIN_CHIP_VCC, 0); // chip power on
    delay(10); // wait for chip ready
    while(!boot_mode_ok)
    {
      pinMode(PIN_CLOCK, OUTPUT);
      pinMode(PIN_DATA, OUTPUT);
      send_key();   
      pinMode(PIN_CLOCK, INPUT);
      pinMode(PIN_DATA, INPUT);
      pinMode(PIN_PU, OUTPUT);
      digitalWrite(PIN_PU, 1); // external pull_up on
      if(!digitalRead(PIN_DATA))
      {      
        boot_mode_ok=1; // D- pulled down        
        pinMode(PIN_PU, INPUT);  // external pull_up off 
        connect_device(PC);
        digitalWrite(PIN_LED_R, 1); // boot_mode - red led on
      }
      pinMode(PIN_PU, INPUT);  // pull_up off 
      if(digitalRead(PIN_SW_MODE)) // abort
        break;
    }
  }
}

void go_normal_mode()
{
  if(mode != NORMAL_MODE)
  {
    digitalWrite(PIN_LED_R, 0); // boot_mode off
    disconnect_devices();
    digitalWrite(PIN_CHIP_VCC, 1); // chip power off      
    delay(1000); // discharge c
    digitalWrite(PIN_CHIP_VCC, 0); // power on
    if(digitalRead(PIN_SW_DEVICE))
      connect_device(PC);
    else
     connect_device(USB_FLASH);
    digitalWrite(PIN_LED_G, 1); // normal mode on - green led
    boot_mode_ok = 0;
    mode = NORMAL_MODE;
  }
}

void loop() 
{
  if(mode == NORMAL_MODE)
    if(digitalRead(PIN_SW_DEVICE)) // 1 = pc
      connect_device(PC);  
    else
      connect_device(USB_FLASH);

  if(digitalRead(PIN_SW_MODE)) 
    go_normal_mode();
  else  
    go_boot_mode();
}

5

Ну еще вариант на 74HC4052. Схема немного другая. Скетч тот-же, просто названия пинов сделал в соответствии с новой схемой.

Схема
Код
Код:
#define PIN_DATA A4 // D- chip WHITE
#define PIN_CLOCK A5 // D+ chip GREEN 
#define PIN_CHIP_VCC 4 // 0=on 1=off
#define PIN_PU 2 // external pull up

#define PIN_SW_MODE 9 // switch between modes, 1 = normal, 0 = boot
#define PIN_LED_R 5 // BOOT MODE
#define PIN_LED_G 6 // NORMAL MODE

#define PIN_LED_B 8 // device=flash
#define PIN_4052_A0 A0 // 74HC4052:10
#define PIN_4052_A1 A1 // 74HC4052:9
#define PIN_4052_EN 3 // 74HC4052:6
#define PIN_SW_DEVICE 10 // switch between pc and usb flash 1 = pc, 

#define PC 0 // X0 Y0
#define USB_FLASH 1 // X1 Y1

#define BOOT_MODE 1 
#define NORMAL_MODE 0 

uint8_t connected_device = 255;
uint8_t mode = 255;
uint8_t boot_mode_ok = 0;

/*
74HC4052:
X - 13 - D+ CHIP GN
Y - 3 - D- CHIP WH

X0 - 12 - D+ PC GN
Y0 - 1 - D- PC WH

X3 - 11 - D+ USB FLASH GN
Y3 - 4 - D- USB FLASH WH
*/

void disconnect_devices()
{
  digitalWrite(PIN_4052_EN, 1);
  connected_device = 255;
  digitalWrite(PIN_LED_B, 0);
}

void connect_device(uint8_t device)
{
  if(connected_device != device)
  {
    digitalWrite(PIN_4052_EN, 1);
    digitalWrite(PIN_4052_A1, device);
    digitalWrite(PIN_4052_A0, device);
    delay(1000); 
    digitalWrite(PIN_4052_EN, 0);
    digitalWrite(PIN_LED_B, device);
    connected_device = device;
  }
}

void send_key()
{
  for(int8_t i = 15; i >= 0; i--)
  {    
    delayMicroseconds(15);
    digitalWrite(PIN_DATA, 0x16EF >> i & 0x1);
    digitalWrite(PIN_CLOCK, 0);
    delayMicroseconds(15);
    digitalWrite(PIN_CLOCK, 1);  
  }
}

void setup()
{
  pinMode(PIN_4052_A0, OUTPUT);
  pinMode(PIN_4052_A1, OUTPUT);
  pinMode(PIN_4052_EN, OUTPUT);
  pinMode(PIN_SW_DEVICE, INPUT_PULLUP);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);
  pinMode(PIN_CHIP_VCC, OUTPUT);  
  pinMode(PIN_SW_MODE, INPUT_PULLUP);
  pinMode(PIN_CLOCK, INPUT);
  pinMode(PIN_DATA, INPUT);
  pinMode(PIN_PU, INPUT); 

  digitalWrite(PIN_CHIP_VCC, 1);

  if(digitalRead(PIN_SW_MODE))   
    go_normal_mode();
  else  
    go_boot_mode();  
}

void go_boot_mode()
{
  if(mode != BOOT_MODE)
  {
    mode = BOOT_MODE;    
    digitalWrite(PIN_LED_G, 0); // normal mode off
    disconnect_devices();
    digitalWrite(PIN_CHIP_VCC, 1); // chip power off    
    delay(1000); // discharge c on chip VCC
    digitalWrite(PIN_CHIP_VCC, 0); // chip power on
    delay(10); // wait for chip ready
    while(!boot_mode_ok)
    {
      pinMode(PIN_CLOCK, OUTPUT);
      pinMode(PIN_DATA, OUTPUT);
      send_key();   
      pinMode(PIN_CLOCK, INPUT);
      pinMode(PIN_DATA, INPUT);
      pinMode(PIN_PU, OUTPUT);
      digitalWrite(PIN_PU, 1); // external pull_up on
      if(!digitalRead(PIN_DATA))
      {      
        boot_mode_ok=1; // D- pulled down        
        pinMode(PIN_PU, INPUT);  // external pull_up off 
        connect_device(PC);
        digitalWrite(PIN_LED_R, 1); // boot_mode - red led on
      }
      pinMode(PIN_PU, INPUT);  // pull_up off 
      if(digitalRead(PIN_SW_MODE)) // abort
        break;
    }
  }
}

void go_normal_mode()
{
  if(mode != NORMAL_MODE)
  {
    digitalWrite(PIN_LED_R, 0); // boot_mode off
    disconnect_devices();
    digitalWrite(PIN_CHIP_VCC, 1); // chip power off      
    delay(1000); // discharge c
    digitalWrite(PIN_CHIP_VCC, 0); // power on
    if(digitalRead(PIN_SW_DEVICE))
      connect_device(PC);
    else
     connect_device(USB_FLASH);
    digitalWrite(PIN_LED_G, 1); // normal mode on - green led
    boot_mode_ok = 0;
    mode = NORMAL_MODE;
  }
}

void loop() 
{
  if(mode == NORMAL_MODE)
  {
    if(digitalRead(PIN_SW_DEVICE)) // 1 = pc
      connect_device(PC);  
    else
      connect_device(USB_FLASH);
  }

  if(digitalRead(PIN_SW_MODE)) 
    go_normal_mode();
  else  
    go_boot_mode();
}

6

Между линиями портов Arduino и +D/-D линиями ACxxxx не должно быть резисторов. Я сам так попадал, ставил резисторы 150 Ом для защиты (которая оказалась лишней) от перегрузки портов. И получилось так, что одни чипы переходили в режим программирования, а другие ни в какую. После удаления резисторов стали все переключаться в BOOT.

7

по хорошему надо шифтер на 3.3v  если логика 5в у донгла.Так например у ардуино, атмега 5в уровни логики,  у оригинальных донглов 3.3. И не знаю , толерантны ли входы у JL  к 5 волльтам. По ходу нет. По крайней мере не видел упоминания, ну и логика перефирия уJL 3.3а.

Подпись автора

By Admin

8

Alcest написал(а):

Между линиями портов Arduino и +D/-D линиями ACxxxx не должно быть резисторов. Я сам так попадал, ставил резисторы 150 Ом для защиты (которая оказалась лишней) от перегрузки портов. И получилось так, что одни чипы переходили в режим программирования, а другие ни в какую. После удаления резисторов стали все переключаться в BOOT.

Ну здесь требуется обяснение, почему? Чем конкретно и чему помешали резисторы? И что без них стало лучше?  Чудес не бывает, все физика.
А с какими чипами были проблемы? Чипы одной серии и с одинаковой обвязкой?

9

BIOS написал(а):

по хорошему надо шифтер на 3.3v  если логика 5в у донгла.Так например у ардуино, атмега 5в уровни логики,  у оригинальных донглов 3.3. И не знаю , толерантны ли входы у JL  к 5 волльтам. По ходу нет. По крайней мере не видел упоминания, ну и логика перефирия уJL 3.3а.

Конечно было бы грамотнее использовать ардуино на 3,3В но цель была сделать самый бюджетный донгл, который надежно и безопасно работает. 5В - ардуины мне кажется более распространены. Кстати в схеме на реле и упрощенных схемах можно тоже использовать 3,3В - ардуины без изменений. Резисторы я бы оставил просто на всякий пожарный. (если конечно против них не появятся аргументы по существу:))

10

Донглы в собранном виде:)

Медиа спойлер

11

Да ничего против резисторов и не имею, можно до 100 ом макс. Вообще 22Ом по стандарту.
У меня вообще идея - а не сделать ли нам шилд для ардуинки мини и уно?
Можно запилить темку. Опенсурс донгл, я заморочусь и сделаю наверное печатку.

Подпись автора

By Admin

12

BIOS написал(а):

У меня вообще идея - а не сделать ли нам шилд для ардуинки мини и уно?
Можно запилить темку. Опенсурс донгл, я заморочусь и сделаю наверное печатку.

Можно, но для начала выяснить со всеми ли чипами работает и если нет то почему.

BIOS написал(а):

Да ничего против резисторов и не имею, можно до 100 ом макс. Вообще 22Ом по стандарту.

Ты какие резисторы имеешь в виду? Мне показалось последовательные в цепи юсб? Так там их нет (кроме rds_on в ключах). А те по 2,2к то они чтобы не мучить чипы.

13

amateur написал(а):

Чем конкретно и чему помешали резисторы?

Вероятно крутизне фронтов импульсов.

amateur написал(а):

А с какими чипами были проблемы? Чипы одной серии и с одинаковой обвязкой?

По разному. Тогда еще различные экземпляры AC6925A себя по разному вели с резисторами. От случая к случаю переходя в режим BOOT, или не переходя. AC6925C четко переходила в режим программирования, а перемаркированные в MH-M18 чипы AC6925D и вовсе не переключались в BOOT. Убрал резисторы и все стало переключаться с пол пинка без плясок с бубном.

14

Alcest написал(а):

Вероятно крутизне фронтов импульсов.

По разному. Тогда еще различные экземпляры AC6925A себя по разному вели с резисторами. От случая к случаю переходя в режим BOOT, или не переходя. AC6925C четко переходила в режим программирования, а перемаркированные в MH-M18 чипы AC6925D и вовсе не переключались в BOOT. Убрал резисторы и все стало переключаться с пол пинка без плясок с бубном.

Но что там на самом деле происходит ты не смотрел.

Я бы ради интереса посмотрел бы что на выводах чипа (и атмеги) происходит и как поднимается VDDI если ты 5в впихиваешь в 3,3в-чип без резисторов.

Вот пара картинок.

Осциллограмма при резисторах 3,3к.
Симуляция при емкости входов 1n и 10n и резисторе 150 Ом

В общем теория о фронтах так себе.

15

amateur написал(а):

Я бы ради интереса посмотрел бы что на выводах чипа (и атмеги)

У меня ардуины нет, и атмеги тоже. У меня PIC микроконтроллер генерировал последовательность которая переводит асишку в режим boot. Микроконтроллер питался от 3,3 В.

16

Не догадался тогда осциллом ткнуть в линии D+/D-. На столе тогда жуткий бардак был, несколько макеток с разными проектами и куча плат к ним подключенных, как-то не до того было. Я тогда просто убрал резисторы и все четко заработало с разными сериями АСишек. На том и успокоился.

Сейчас прошиваю АСишки программатором на том же МК PIC, с питанием 5 вольт. Пока ничего не сжег из AC6905, 6925, 6965. Далеко за сотню чипов прошил, ни один не повредился. Это без резисторов.

17

Alcest написал(а):

Не догадался тогда осциллом ткнуть в линии D+/D-. На столе тогда жуткий бардак был, несколько макеток с разными проектами и куча плат к ним подключенных, как-то не до того было. Я тогда просто убрал резисторы и все четко заработало с разными сериями АСишек. На том и успокоился.

Сейчас прошиваю АСишки программатором на том же МК PIC, с питанием 5 вольт. Пока ничего не сжег из AC6905, 6925, 6965. Далеко за сотню чипов прошил, ни один не повредился. Это без резисторов.

Супер, кидай схему)

18

priradio585 написал(а):

Супер, кидай схему)

Увидел схему, прошу прощения.

19

В 4 и 5 постах обнаружил ошибку. Нужно изменить соединение резистора внешней подтяжки

https://forumupload.ru/uploads/001b/ca/8a/24/t675988.png

или изменить в коде

if(!digitalRead(PIN_DATA))

на

if(!digitalRead(PIN_CLOCK))

Перевод JL чипов  в uboot режим с помощью ардуино
Перевод JL чипов  в uboot режим с помощью ардуино

А так же советую применять короткие и хорошего качества ЮСБ кабели во избежание глюков.

20

Подскажите, пожалуйста, подходит ли предпоследняя схема из головного поста (которая без реле, на биполярнике, с одним светодиодом) для чипов AC6901?
Пытаюсь использовать её, но не загорается светодиод.
На осцилле вижу, что D- не подтягивается к земле. Значит, видимо, чип не отвечает.
Что можно попробовать?
Спасибо.

Отредактировано amironof (2025-05-28 15:30:46)


Вы здесь » USMI » MCU, SoC, CPU Микроконтроллеры » Перевод JL чипов в uboot режим с помощью ардуино