Универсальный программатор

Предлагаю вашему вниманию небольшой проект универсального
Лего-программатора. Всем нам известно, что из конструктора Лего можно собрать
все, что угодно. Во многом все зависит лишь от вашей фантазии.

Иногда в практике электронщика
появляется проблема, связанная с программированием какой нибудь микросхемы флеш
памяти. Как поступить? Покупать программатор – дорого, да, и пройдет время и он
не поймет какую нибудь новую микросхему. Отдать кому нибудь – но кому  и опять
деньги платить надо. Думаю, что в данной ситуации лучше всего собрать универсальный
программатор самому. Ведь на самом деле задача программирования микросхемы
памяти является достаточно примитивной. Необходимо на определенные выводы
микросхемы подать определенные сигналы в определенной последовательности. То
есть надо создать цифровой автомат. Если у вас есть минимальный опыт в работе с
микроконтроллерами, то потратив не особенно много времени на реализацию это
проекта, вы сделаете устройство, которое с легкостью сможете использовать для
программирования чего угодно, внося при этом лишь небольщие изменения в
конструкцию и программы. Необходимо лишь взглянуть на документацию по микросхеме,
которую вы хотите запрограммировать.  А для управления программатором будем
использовать компьютер. Что для этого надо – сущие пустяки.

  • Колодка в которую можно вставить микросхему для
    программирования (самый важный компонент нашей системы).
  • То, к чему подключим колодку – любой микроконтроллер,
    имеющий достаточное количество выводов для подключения, и с которым вы
    имеете достаточный опыт работы.
  • Макетная плата, кому какая будет удобней.
  • Несколько всяких деталек.
  • Компьютер, имеющий последовательный порт, с подключенным
    интернетом  для  управления программатором и развлечения, пока идет
    процесс программирования.
  • Установленная на компьютере система программирования.
  • Конечно же, комплект документации на все эти штуки,
    который вы найдете в интернете.
  • В моем случае была необходимость
    запрограммировать микросхему SST49LF004B. Эта микросхема используется в качестве BIOS на
    многих системных платах. Для реализации проекта были выбраны:

    Колодка от старой системной платы, выпаяная феном. К колодке
    аккуратно припаяна гребенка проводов, взятых из шлейфа жесткого диска. В
    качестве микроконтроллера использован 40- выводной корпус AVR микроконтроллера
     ATMEGA16 c кварцевым резонатором на
    11.0592 МГц. Макетная плата для монтажа без пайки. Несколько навесных
    компонентов, таких как резисторы, конденсаторы, регулятор напряжения.

    При монтаже особое внимание надо
    уделить качеству разводки питания и установке блокирующих конденсаторов. Настоятельно
    рекомендую распаять один керамический конденсатор непосредственно на колодке
    для программирования микросхемы. Да, ещё понадобится переходник для коммуникационного
    порта. Я использовал готовый, оставшийся от бог знает, какого разобранного
    устройства. Его можно собрать на паре транзисторов  или на микросхеме типа MAX232. Стабилизатор напряжения, собранный на регуляторе,
    имеет перемычку, определяющую выходное напряжение 3.3 В или 5.0 В.
    Микроконтроллер программируется на 5 В, далее работает и программирует  SST49LF004B на 3.3 В. Собираем все собранные штучки на монтажной плате и, соблюдая
    полярность, подключаем питание. Полную принципиальную схему не привожу, ибо
    макет, показанный на фотографии достаточно нагляден и собирается из того, что
    есть в наличии. Обращаю внимание лишь на то, что в соединении коммуникационных
    портов используются линии GND, RXD, TXD , а также RTS со стороны программатора (CTS со
    стороны компьютера). Ниже привожу фотографии готового программатора, не правда
    ли, простенько выглядит?

    Собственно программатор …

                                                 …и то, что к
    нему ещё надо добавить.

    Программное обеспечение
    создавалость по принципу Copy – Paste для решения конкретной задачи в кратчайшее время, поэтому отнестесь к качеству
    кода с пониманием. Программа для микроконтроллера писалась на Си в среде WinAVR под AVR Studio 4. При компиляции
    использовался ключ оптимизации –О1. Если вы используете другой кварц,
    необходимо изменить соответствующие значения, в зависимости от скорости обмена
    по последовательному интерфейсу.

    #define F_CPU 11059200UL
    UBRRH = 0; // Baud rate 38400 (for CPU clock 11.0592 MHz)
    UBRRL = 17;

    Запуск программатора происходит при посылке на
    последовательный порт (USART) соответствующего байта:

                1 — прочитать идентификатор микросхемы (для SST49LF004B два байта)

                2 — считать данные

                3 – стереть данные

                4 – записать данные

                5 —  прочитать 1к байт (для отладки)

    Процедура wait1() используется для внесения небольшой
    дополнительной задержки, уж больно длинные проводочки использовались в схеме
    программатора. Звуковой сигнал используется как индикатор готовности,  да и
    просто прикольно. Все остальное закоментировано в тексте программы или
    достаточно очевидно. Далее, полный исходный текст программы, реализующий
    алгоритм программирования микросхемы SST49LF004B. Такой алгоритм имеют многие
    микросхемы, например W39V040A, 49LF040A, firmwsre hub SST49LF004A и др. Чаще всего они используются для реализации BIOS или Firmware различных устройств. Извиняюсь за коменты на
    английском языке, просто у меня тут все на английском.

    /*
    ————————————————————————
    Flash programming for SST49LF004B in parallel Programming mode

    Version 1.0
    Date 12-nov-2011
    MCU AVR ATMEGA16
    MCU clock 11.0592 MHz, Communication — Baud rate 38400, 8-N-1

    Pins
    Port A — address A7-A0
    Port C — Address A10-A8
    Port B — data
    Port D — control
    ————————————————————————
    */
    #define F_CPU 11059200UL
    #define BytesQty 524288

    #include
    //#include
    //#include
    #include
    #include
    #include

    //control pins (PortD)
    #define SPEAKER 7
    #define RTS_ 6
    #define RST_ 5
    #define RC_ 4
    #define OE_ 3
    #define WE_ 2
    // TXD 1
    // RXD 0

    //old my frienfs from assembler — sbi and cbi
    #define sbi(var, mask) ((var) |= (uint8_t)(1 11);
    PORTC = (uint8_t)( _Address>>19);
    wait1();
    cbi(PORTD, WE_);
    wait1();
    PORTB = d;
    wait1();
    sbi(PORTD, RC_); //Lock Column address
    wait1();
    sbi(PORTD, WE_);
    DDRB = 0b00000000;
    wait1();
    }

    //——————————————
    uint8_t ReadByte(uint32_t A){
    _Address = A;
    PORTB = 0b11111111;
    DDRB = 0b00000000;
    PORTA = (uint8_t) _Address;
    PORTC = (uint8_t)( _Address>>8);
    wait1();
    cbi(PORTD, OE_); //Flash Output enable
    cbi(PORTD, RC_);
    wait1();
    PORTA = (uint8_t)( _Address>>11);
    PORTC = (uint8_t)( _Address>>19);
    wait1();
    sbi(PORTD, RC_);
    wait1();
    sbi(PORTD, OE_); //Flash Output desable
    return PINB;
    }

    //——————————————
    //Reading of data block
    static void ReadBlock (uint32_t bytes){
    for (Address=0; Address<bytes; Address++) {
    buff[0] = ReadByte(Address);
    USART_SendByte(buff[0]);
    }
    }

    //——————————————
    //Chip erase
    static void ChipErase () {
    WriteByte(0x5555,0xAA);
    WriteByte(0x2AAA,0x55);
    WriteByte(0x5555,0x80);
    WriteByte(0x5555,0xAA);
    WriteByte(0x2AAA,0x55);
    WriteByte(0x5555,0x10);
    for (i=0; i

    Добавить комментарий

    Ваш адрес email не будет опубликован.