Arduino и CD-ROM с ATAPI шиной

MrTransistor
MrTransistor аватар
Offline
Зарегистрирован: 04.01.2018

Здравствуйте! Решил сделать управление 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 интерфейс или делал подобное на голом МК - подскажите как правильно реализовать общение. Еще есть другая проблема - дисковод если берет эти команды, то не больше трех, потом как-будто заканчивается лимит и его надо перезагружать в слейв режиме, а потом еще раз, но в режиме мастера, только после этого он начнет работать.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Все удалить до 516 строки.

MrTransistor
MrTransistor аватар
Offline
Зарегистрирован: 04.01.2018

DetSimen пишет:

Все удалить до 516 строки.

Пробовал, не помогает))) (шутка)

kazakoff
Offline
Зарегистрирован: 07.06.2013

Удалось что-то запустить?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MrTransistor

1. Мне кажется, сиграл записи обычно активный "0", а у Вас, судя по коду, "1". Или именно это Вы хотели сказать комментарием "inverted"? Проверьте это.

2. Советую для начала вынести запись всех 16 разрядов в порт в отдельную процедуру, а затем вызывать только ее.

3. Аналогично поступить с адресом (насколько я понял, 0x0170 устанавливается на шине адреса аппаратно?).

4. Собственно, раз не хватает пинов, их надо добавлять. Например, сдвиговым регистром. Переделайте шину адреса на сдвиговый регистр, который будете подключать к А2-А4. Это - 8 разрядов, если мало - включите 2 каскадом - будет 16 разрядов. 

5. Шину данных я бы тоже подключил через сдвиговые регистры. Лучше на аппаратный SPI - на пины с 11 по 13. А освободившиеся пины использовал для входных сигналов.

MrTransistor
MrTransistor аватар
Offline
Зарегистрирован: 04.01.2018

Все заработало уже давно, пускал проигрывание музыки, дергал лоток туда-сюда и т п, про сдвиговые регистры знаю, но проект заброшен в дальнюю папку по причине лени и под давлением других дел. Inverted означало что сигнал "0" - активен, а не выключен, как обычно.

Запись в порт сделаю если буду продолжать - благо есть 16-битная стм32 с 16 битными регистрами. А вопрос был закрыт уже давно, просто сам забыл, что задавал на форум

kazakoff
Offline
Зарегистрирован: 07.06.2013

Поделитесь пожалуйста исходниками проекта.