Saludos,
Estoy utilizando un chip Atmega1284P-PU para controlar un Drive Blue-Tiger CD-80 que funciona con comunicacion I2C; en este momento yo puedo enviar datos utilizando el Interface de Arduino Uno sin problemas. Ahora mi problema es que en el programa deseo que el Drive me envie la informacion para posteriormente procesarla y saber el contenido del CD, pero desafortunadamente no he podido saber como poder procesar dicha informacion que entrega el Drive.
De antemano mucha gracias y quedo atento a sus comentarios y Feliz Dia.
#include <Wire.h>
char x = 0;
byte parameter;
byte opcode;
int actualSeconds;
int actualMinutes;
int numberOfTracks;
int actualTitle;
bool paused;
void setup() {
Serial.begin(9600); // start serial for output
Serial.println();
Serial.print(" CD-80 ");
delay(2000);
Wire.begin(); // join i2c bus (address optional for master)
module();
}
void module(){
// Module initialization
Wire.beginTransmission(0x31); // I2C Address Drive CD-80
Wire.write(byte(0x65)); // AC_Set_Loader_Type
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x14)); // AC_Stop
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x2d)); // AC_Get_FW_Version
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x21)); // AC_Get_Disc_Contents
Wire.endTransmission();
}
void loop()
{
bluetiger();
}
void bluetiger() {
Wire.requestFrom(0x31,6);
while (Wire.available()== 0);
byte x = Wire.read();
Serial.print(x,HEX);
parameter = 0;
bool validCommand = true;
switch (Serial.read()) {
case 'p': //play
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x21)); // AC_Get_Disc_Contents
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x26)); // AC_Get_Tag_XY
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
opcode = 0x11; // AC_Play
Wire.write(byte(opcode));
parameter = 1; // first track
actualSeconds = 0;
actualMinutes = 0;
Wire.endTransmission();
break;
case 's': //stop
Wire.beginTransmission(0x31); // I2C Address
opcode = 0x14; // AC_Stop
Wire.write(byte(opcode));
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x21)); // AC_Get_Disc_Contents
numberOfTracks = 0;
actualTitle = 0;
actualMinutes = 0;
actualSeconds = 0;
Wire.endTransmission();
Wire.beginTransmission(0x31); // I2C Address
Wire.write(byte(0x26)); // AC_Get_Tag_XY
Wire.endTransmission();
break;
case 'o': //Open
Wire.beginTransmission(0x31); // I2C Address
opcode = 0x31; // AC_Tray_Open
Wire.write(byte(opcode));
Wire.endTransmission();
break;
case 'c': //Close
Wire.beginTransmission(0x31); // I2C Address
opcode = 0x32; // AC_Tray_Close
Wire.write(byte(opcode));
Wire.endTransmission();
break;
parameter = actualTitle - 1;
if (parameter == 0)
parameter = numberOfTracks;
break;
default:
validCommand = false;
break;
}
if (validCommand) {
Serial.println();
Serial.print("Command [");
Serial.print(byte(opcode),HEX);
Serial.print("]/[");
Serial.print(parameter);
Serial.print("]");
Serial.println();
}
Serial.print(">> [");
Serial.print(byte(opcode),HEX);
Serial.print("]/[");
Serial.print(parameter);
Serial.print("]");
Serial.println();
}
Tambien para mas info el puerto Serial me arroja la respuesta del Drive:
A1>> [0]/[0] significa 0xa1 State
AD>> [0]/[0] significa 0xad Toc_info
AE>> [0]/[0] significa 0xae Disc_Stopped
AE>> [0]/[0]
AE>> [0]/[0]
AE>> [0]/[0]
AE>> [0]/[0]
Como esta parado sigue enviando el ultimo estado que quiere decir que el disco esta en estado Stop y cuando le doy en la instruccion de p (Play) envia:
Command [11]/[1]
>> [11]/[1]
A1>> [11]/[0] significa 0xa1 State
A1>> [11]/[0]
A0>> [11]/[0] significa 0xa0 Change_Indicator
A0>> [11]/[0]
A0>> [11]/[0]
Como esta en modo Play sigue enviando el ultimo estado que quiere decir que sigue funcionando el disco hasta que cambie a otro estado o comando.