получилось принять "запрос" и в зависимости от значения ответить. Но нужно еще раз отправить сообщение мастеру а как "дернуть" пин С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); //хз нужно ли, но без него бесконечный цикл
}