Чтобы перевести чип в режим прошивки нужно:
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) или специальные юсб ключи.
Вся информация взята из форума.