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 битными регистрами. А вопрос был закрыт уже давно, просто сам забыл, что задавал на форум
Поделитесь пожалуйста исходниками проекта.