2015-12-13 10 views
1

Я использую ATTiny85, работающий с библиотекой TinyWire, для связи с Arduino Uno, использующим библиотеку Wire, из соединения I2C. Я могу передать один байт за один раз отлично, так как столько запросов, сколько я хочу, однако проблема возникает, когда я пытаюсь отправить два байта за раз. Ниже приведен код, который я использую (обратите внимание - я использую популярную модифицированную версию библиотеки TinyWire, в которой реализован метод OnRequest). Вот мой код для ведомого устройства:I2C прекращает передачу через 7 запросов с Arduino

#include "TinyWireS.h"     // wrapper class for I2C slave routines 
    #define I2C_SLAVE_ADDR 0x27   // i2c slave address 

    void setup() 
    { 
     TinyWireS.begin(I2C_SLAVE_ADDR);  // init I2C Slave mode 
     TinyWireS.onRequest(requestEvent); 
    } 

    void loop() 
    { 
    } 

    void requestEvent() 
    { 
     int16_t bigNum = analogRead(3); 
     byte myArray[2]; 

     myArray[0] = (bigNum >> 8) & 0xFF; 
     myArray[1] = bigNum & 0xFF; 
     TinyWireS.send(myArray[0]); 
     TinyWireS.send(myArray[1]); 
    } 

и для мастера:

#include <Wire.h> 
#define DEVICE_2 0x27 

void setup() 
{ 
    Wire.begin(); 
    Serial.begin(9600); 
} 

void loop() 
{ 
    delay(2000); 

    int16_t bigNum; 
    byte a,b; 

    // read 2 bytes, from address 0x27 
    Serial.println("Request Start"); 
    Wire.requestFrom(DEVICE_2, 2); 

    a = Wire.read(); 
    b = Wire.read(); 

    bigNum = a; 
    bigNum = bigNum << 8 | b; 

    Serial.print(bigNum); 
    Serial.print("\n"); 
} 

Независимо от времени задержки, я всегда могу получить только ровно 7 запросов. Я пробовал много значений без задержки до 5 секундных задержек между вызовами. Если я отключу ATTiny, то снова подайте питание, пока Uno все еще подключен к последовательному порту, я могу получить еще 7 запросов перед остановкой снова. Серийный монитор всегда показывает, что основной цикл Uno каким-то образом приостанавливается сразу после вызова requestFrom(), что делает его похожим на то, что он чего-то ждет, но я не могу понять, что. Когда я отсоединяю ATTiny, Uno печатает на последовательном порту -28412. Я также пробовал поместить следующее перед чтением из буфера:

if(Wire.available() > 0) { 
     a = Wire.read(); 
     b = Wire.read(); 
} 

Спасибо за помощь.

ответ

0

В соответствии с этим Issue вы можете отправлять только один байт из функции обратного вызова onRequest. Он вызывается из ISR, поэтому он действительно не должен делать очень много. Он предлагает вспомнить, какой байт был отправлен, затем отправить следующий, когда произойдет другое событие request. См. Это example.

+0

Спасибо, отличный ответ. –