USMI

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

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


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


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

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

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();
}

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