Arduino и CD-ROM с ATAPI шиной
- Войдите на сайт для отправки комментариев
Здравствуйте! Решил сделать управление CD-ROM дисководом NEC MultiSpin 8V 1997 года рождения с помощью Ардуино Уно. Два дня гугления принесли кое-какой результат, но простейшие прошивки для управления на digitalWrit-ах и delay-ах то работают, то нет. Вот одна из них:
#define DATA0 0//пины шины
#define DATA1 1
#define DATA2 2
#define DATA3 3
#define DATA4 4
#define DATA5 5
#define DATA6 6
#define DATA7 7
#define DATA8 8
#define DATA9 9
#define DATA10 10
#define DATA11 11
#define DATA12 12
#define DATA13 13
#define DATA14 A0
#define DATA15 A1
#define ADDRES_0 A2
#define ADDRES_1 A3
#define ADDRES_2 A4
#define WRITE_STROBE A5/ / inverted
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
digitalWrite(A5, 1);//на всякий, мне надо, чтобы он не считал мусор из пустой шины
pinMode(A5, OUTPUT);
digitalWrite(A5, 1);//на всякий, мне надо, чтобы он не считал мусор из пустой шины
}
void loop() {
digitalWrite(ADDRES_0, 0);//регистр 0x176
digitalWrite(ADDRES_1, 1);
digitalWrite(ADDRES_2, 1);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 0);// DRV = 0 - выбор устройства master в 4 бите (нумерация с нуля)
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 1);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 1);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(ADDRES_0, 1);//регистр 0x177
digitalWrite(ADDRES_1, 1);
digitalWrite(ADDRES_2, 1);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 0);// 0xA0 - запрос на передачу пакета из 6 слов по 2 байта
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 1);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 1);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(10);
digitalWrite(ADDRES_0, 0);//регистр 0x170
digitalWrite(ADDRES_1, 0);
digitalWrite(ADDRES_2, 0);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 1);// первое слово команды - 0x0047
digitalWrite(DATA1, 1);
digitalWrite(DATA2, 1);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 1);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
digitalWrite(ADDRES_0, 0);//регистр 0x170
digitalWrite(ADDRES_1, 0);
digitalWrite(ADDRES_2, 0);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 0);// 0x0100 - второе
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 1);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
digitalWrite(ADDRES_0, 0);//регистр 0x170
digitalWrite(ADDRES_1, 0);
digitalWrite(ADDRES_2, 0);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 1);// 0x0001 - третье
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
digitalWrite(ADDRES_0, 0);//регистр 0x170
digitalWrite(ADDRES_1, 0);
digitalWrite(ADDRES_2, 0);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 1);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);// 0x0202 - четвертое
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 1);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
digitalWrite(ADDRES_0, 0);//регистр 0x170
digitalWrite(ADDRES_1, 0);
digitalWrite(ADDRES_2, 0);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 0);// 0x0002 - пятое
digitalWrite(DATA1, 1);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
digitalWrite(ADDRES_0, 0);//регистр 170h
digitalWrite(ADDRES_1, 0);
digitalWrite(ADDRES_2, 0);
delay(10);
digitalWrite(WRITE_STROBE, 0);
digitalWrite(DATA0, 0);// 0x0000 - шестое
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
delay(1);
digitalWrite(WRITE_STROBE, 1);
delay(2);
digitalWrite(DATA0, 0);
digitalWrite(DATA1, 0);
digitalWrite(DATA2, 0);
digitalWrite(DATA3, 0);
digitalWrite(DATA4, 0);
digitalWrite(DATA5, 0);
digitalWrite(DATA6, 0);
digitalWrite(DATA7, 0);
digitalWrite(DATA8, 0);
digitalWrite(DATA9, 0);
digitalWrite(DATA10, 0);
digitalWrite(DATA11, 0);
digitalWrite(DATA12, 0);
digitalWrite(DATA13, 0);
digitalWrite(DATA14, 0);
digitalWrite(DATA15, 0);
pinMode(0, INPUT);// уход пинов в высокоимпедансное состояние
pinMode(1, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
while(true);//останавливаемся навсегда
}
Считывание регистров ошибок и подобное сделать нет возможности - пины на дуне закончились. Если кто знает про ATAPI интерфейс или делал подобное на голом МК - подскажите как правильно реализовать общение. Еще есть другая проблема - дисковод если берет эти команды, то не больше трех, потом как-будто заканчивается лимит и его надо перезагружать в слейв режиме, а потом еще раз, но в режиме мастера, только после этого он начнет работать.
Все удалить до 516 строки.
Все удалить до 516 строки.
Пробовал, не помогает))) (шутка)
Удалось что-то запустить?
MrTransistor,
1. Мне кажется, сиграл записи обычно активный "0", а у Вас, судя по коду, "1". Или именно это Вы хотели сказать комментарием "inverted"? Проверьте это.
2. Советую для начала вынести запись всех 16 разрядов в порт в отдельную процедуру, а затем вызывать только ее.
3. Аналогично поступить с адресом (насколько я понял, 0x0170 устанавливается на шине адреса аппаратно?).
4. Собственно, раз не хватает пинов, их надо добавлять. Например, сдвиговым регистром. Переделайте шину адреса на сдвиговый регистр, который будете подключать к А2-А4. Это - 8 разрядов, если мало - включите 2 каскадом - будет 16 разрядов.
5. Шину данных я бы тоже подключил через сдвиговые регистры. Лучше на аппаратный SPI - на пины с 11 по 13. А освободившиеся пины использовал для входных сигналов.
Все заработало уже давно, пускал проигрывание музыки, дергал лоток туда-сюда и т п, про сдвиговые регистры знаю, но проект заброшен в дальнюю папку по причине лени и под давлением других дел. Inverted означало что сигнал "0" - активен, а не выключен, как обычно.
Запись в порт сделаю если буду продолжать - благо есть 16-битная стм32 с 16 битными регистрами. А вопрос был закрыт уже давно, просто сам забыл, что задавал на форум
Поделитесь пожалуйста исходниками проекта.