эмулятор для I2C помогите со скетчем

Cho1s
Offline
Зарегистрирован: 26.07.2017

Добрый день.

Хочу сделать эмулятор кассетоприемника для магнитолы, в нем стоит philips 83c751 с I2C. Вместо него будет стоять Leonardo. С этим протоколом и программированием очень туго, помогите пожалуйста написать скетч 

при играющей кассете идут след. данные (DEC):

R/W     Addres             DATA              ASK

W       18            19                            Y

R        18            4  32  4  3  39           N

при отключенном кассетоприемнике только запрос (как я понял):

R/W     Addres             DATA              ASK

W       18            19                            Y

пробовал вот такой скетч, но ардуино молчит в ответ на запрос.


#include <Wire.h>


void setup() 
{ 
Wire.begin(24); // подсоединение к шине I2C с адресом #18 
Wire.onRequest(requestEvent); // регистрация события 
} 

void loop() 
{ 
delay(10); 
} 
// функция, которая выполняется всякий раз, когда данные запрашивает устройство 
//в режиме «Master» 
// эта функция зарегистрирована как событие, см. setup() 
void requestEvent() 
{ 
byte buffer[6];
buffer[0] = 4;
buffer[1] = 32;
buffer[2] = 4;
buffer[3] = 5;
buffer[4] = 41;
Wire.write(buffer, 6);
Wire.endTransmission ();
  // ответ с сообщением в 6 байт 
// как ожидает устройство в режиме «Master» 
}

 

Заранее благодарен

Glinka0
Offline
Зарегистрирован: 13.03.2017

Есле ты хочешь музыку слушать,то не проще припаять к FM выходам AUX?

Cho1s
Offline
Зарегистрирован: 26.07.2017

Проще конечно. Но выкинуть кассетник, все равно нужно.
А музыка и так играет☺

GarryC
Offline
Зарегистрирован: 08.08.2016

4 32 4 3 39 (наверное шестнадцариричное) в протоколе и
4 32 4 5 41 (точно десятиричное) у Вас в прошивке - так и надо ?

Cho1s
Offline
Зарегистрирован: 26.07.2017

извиняюсь, должно быть 39 (в прошивке ошибка). на осциллографе в формате декодирования выставлен режим DEC. в режиме HEX выглядит вот так ( R 18    04 20 04 03 27  N)

GarryC
Offline
Зарегистрирован: 08.08.2016

А 5 в прошивке вместо 3 в протоколе?

Cho1s
Offline
Зарегистрирован: 26.07.2017

3 вместо 5, не могу изменить первое сообщение

вместо магнитолы подключил UNO, с ним ответ есть

запрограммирован как мастер

#include <Wire.h>
void setup() 
{ 
Wire.begin(); // подсоединение к шине I2C 
//адрес для устройства в режиме «Master» опционально 
Serial.begin(9600); 
// включаем и настраиваем скорость передачи данных последовательного 
//порта 
} 
void loop() 
{ 
Wire.requestFrom(24, 5); 
//запросить 6 байтов с устройства в режиме «slave», адрес - #2 
while(Wire.available()) 
// устройство в режиме «slave» может отправить меньше чем запрошено 
{ 
char c = Wire.read(); // вернуть байт как символ 
Serial.println(c); // передать в последовательный порт символ 
} 
delay(500); 
}

 

Cho1s
Offline
Зарегистрирован: 26.07.2017

наконец сделал скринштот сообщений на шине, когда вставляю кассету :

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Cho1s, с таким мутным сигналом нет гарантии что считалось правильно. Вот так должно быть.

Cho1s
Offline
Зарегистрирован: 26.07.2017

Cпасибо! сегодня поиграюсь с настройками 

Cho1s
Offline
Зарегистрирован: 26.07.2017

Dimax, вроде все правильно было считано (максимально приближенно к вашему изображению http://prntscr.com/gitlfx и http://prntscr.com/gitpbz )

не могу понять почему Leonardo не отвечает, толи не видит запрос, толи не может отправить сообщение..  

Cho1s
Offline
Зарегистрирован: 26.07.2017

нашел PDF на кассетоприемник  там есть контакт CRQ (что за он, google мне не подскал) вот осцоллограмма с ним (3-й розовый канал)  1  2  3

но как это реализоваьт ? как его подключить к ардуино ?

Cho1s
Offline
Зарегистрирован: 26.07.2017

получилось принять "запрос" и в зависимости от значения ответить. Но нужно еще раз отправить сообщение мастеру а как "дернуть" пин СRQ еще раз не знаю, да и время когда он от минуса опять в плюс переходит не то что нужно. Так нужно, а так Не нужно на картинках видно, что поднимается в 5вольт на середине сообщения. delay не подходит чтобы управлять CRQ, так как вешает отправку между addres и data. millis не работает (не умею им пользоваться).

Подскажите как быть? куда копать?

собственно скетч

#include <Wire.h>
const byte SlaveDeviceId = 24;
const int CRQ = 8; //"прижимает" к минусу
enum {
  CMD_TAPE = 19,
  CMD_TUNNER = 25
     };
char command;

void setup()
{
  command = 0;
  Wire.begin(SlaveDeviceId); // Start I²C bus as a slave
  Wire.onReceive(receiveCallback); //ждем данных от мастера, функция возвращает int число байт данных
  Wire.onRequest(requestCallback);
  pinMode(CRQ, OUTPUT); //пин CRQ как вывод
}

void loop(){}

void receiveCallback(int numbytes)
{
  command = Wire.read (); //запоминаем команду на запрос
  digitalWrite(CRQ, LOW); 
}

void requestCallback()
{
 switch (command)
    {
      case CMD_TAPE: //значение на шине при нажатии Tape
      byte buffer[5]; //первое сообщение
      buffer[0] = 4;
      buffer[1] = 32;
      buffer[2] = 4;
      buffer[3] = 3;
      buffer[4] = 39;
      Wire.write(buffer, 5);
      break;
      {
        digitalWrite (CRQ, LOW); // не работает
      }
       byte buffer1[5]; //второе сообщение - не отправляется
      buffer1[0] = 4;
      buffer1[1] = 32;
      buffer1[2] = 5;
      buffer1[3] = 3;
      buffer1[4] = 40;
      Wire.write(buffer1, 5);
      break;
      
      case CMD_TUNNER: // значение на шине при нажатии Tunner
      byte buffer2[5]; //первый байт сообщения
      buffer2[0] = 4;
      buffer2[1] = 32;
      buffer2[2] = 5;
      buffer2[3] = 3;
      buffer2[4] = 40;
      Wire.write(buffer2, 5);
      break;
      }
    
    digitalWrite(CRQ, HIGH); //хз нужно ли, но без него бесконечный цикл 
}