Go Down

Topic: I2C Drive CD (Read 229 times) previous topic - next topic

pitpod77

Oct 22, 2019, 05:49 pm Last Edit: Oct 22, 2019, 05:56 pm by pitpod77
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.

Code: [Select]

#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:

Code: [Select]

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:

Code: [Select]

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.


Go Up