Скажу сразу - делаю курсовик, поэтому выбор лпт порта и "изобретание велосипеда" - самому не особо нравиться, но теперь уже разбираюсь и пытаюсь с этим бороться.
Задача: Программа, написанная на одном из языков высокого уровня для ПК, которая осуществляет запись скомпилированной программы с использованием одного из стандартных портов (LPT) в микроконтроллер (ATMEGA16). Записанная программа должна быть представлена в HEX коде.
* программатор стк200
Ситуация на данный момент следующая:
1. Задача по прежнему - написать софтину, которая прошивает амегу16
2. Научился управлять ЛПТ, т.е 1-0 подавать могу на какой либо из ног
Локальная задача, которую необходимо решить:
Пытаяюсь эмулировать SPI интерфейс - но никак не получается, помогите разобраться плиз.
Алогритм входа в режим программирования (из даташита):
1. Подать питание, при этом RESЕT и SCK должны быть 0.
2. Подождать как минимум 20 мс затем включить режим SPI Serial Programming
[послать 4 байта на MOSI]:
Byte1: 1010 1100
Byte2: 0101 0011
Byte3: xxxx xxxx // не важно что посылается
Byte4: xxxx xxxx // не важно что посылается
3. Проверить вошел ли контроллер в режим программирования.(Проверить синхронизацию). Когда режим синхронизации установлен, то 2ой байт ответит назад $53 запрашивая при этом 3ий байт. Не зависимо от того был ли правильно получен ответ или нет - нужно обязательно передать все 4 байта. Если этого не произошло, то задать 1 на RESET и повторить заново.
Вот, т.е хорошей проверкой того правильно я сделал или нет - будет то что при посылке 3его байта я получу в ответ $53. Но увы, пока этого не происходит, с чем и прошу помочь разобраться.
Прошу посмотрите как делаю в коде, возможно логика не та у меня и делаю не правильно:
{
Решился писать в Дельфях, потому что удобную либо под лпт нашел, если у кого то неприязнь к паскалю - заранее сорри. Комментарии к коду справа, после //
Значение функций MOSI; SCK; RESET; VCC; - при вызове они инвертируют то что было на этой ноге перед вызовом. Т.е Если на ноге MOSI было 0 после вызова станет 1. и наоборот.
MISO - читает 1 или 0 с ноги.
}
Да и ещё, - по даташиту: Запись в контроллер происходит по фронту, а чтение из мк по спаду. Т.е если я правильно понял, чтобы мк считал 1 например - я сначала её выставляю, а потом подаю положительный импульс на SCK.
- Код: Выделить всё
Lpt.WritePort(GetCurrentPort,LPT_DATA_REG,0); // SCK = 0 MOSI = 0 RESET = 0 VCC = 0. Везде нули
VCC; // VCC = 1
Delay(40); // ждем 40мс с запасом
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 1
SCK; // SCK = 0
MOSI;
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
Memo1.Lines.Add(MISO); // читаю что на ноге MISO
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
SCK; // SCK = 1 MOSI = 0
SCK; // SCK = 0
В результате байт синхронизации не приходит, значение на MISO - постоянно 1.
Прошу проглядеть плиз, и пнуть меня в нужном направлении плиз. Также если у кого нибудь есть какие нароботки или исходники которые могут помочь по сабжу - буду мега благодарен.