Hallo Christoph,
ich habe noch etwas aufgeräumt, den Code durchgesehen. TinyWireS ist nicht sehr sauber programmiert, einen unschönen Fehler habe ich hier gefixt:
case USI_SLAVE_GET_DATA_AND_SEND_ACK:
// put data into buffer
// Not necessary, but prevents warnings
rxHead = ( rxHead + 1 ) & TWI_RX_BUFFER_MASK;
// check buffer size
if (rxHead == rxTail) {
// overrun
rxHead = (rxHead + TWI_RX_BUFFER_SIZE - 1) & TWI_RX_BUFFER_MASK;
} else {
rxBuf[ rxHead ] = USIDR;
}
// next USI_SLAVE_REQUEST_DATA
overflowState = USI_SLAVE_REQUEST_DATA;
SET_USI_TO_SEND_ACK( );
break;
Das kommt ganz am Schluss von usiTwiSlave.c hin und stellt sicher, dass der Ringbuffer nicht sich selbst überholt. Eigentlich müsste man ein NACK zurückgeben, wenn der interne Buffer voll ist, aber das lassen wir mal für zukünftige Versionen.
Sehr unschön ist auch, dass der onReceive-Handler sowohl aus dem Interrupt-Kontext, als auch aus dem normalen loop()-Kontext aufgerufen wird. Das verhindert eigentlich eine saubere Programmierung. Bei uns ist das aber (im Moment) nicht relevant.
Ich habe auch noch etwas Debugging-Code eingebaut, die Geschwindigkeit etwas hochgeschraubt und festgestellt, dass die "Huster" bei der Übertragung über I2C passieren, der Master kriegt dann auch ein NACK zurück, könnte also die Übertragung nochmals wiederholen. Wie und warum es dazu kommt, ist mir noch nicht ganz klar, das untersuche ich aber noch.