Hallo,
no_rep_start wird jetzt in allen I2C Transmit Funktionen über der TWCR Zuweisung auf 1 gesetzt, außer in einer Funktion I2CTWI_transmitByteREPEATED_START(0x00,0x07);), dort wird es über TWCR auf 0 gesetzt. Auf 1 gesetzt wird es in der task_I2CTWI in if(TWI_operation).
Diese Variable wird dann nur in Zeile 381 der I2CMaster Libs TWSTO zugewiesen:
Code:
case TWI_MTX_DATA_ACK: // Data byte has been transmitted and ACK received
if (TWI_bufPos < TWI_msgSize) {
TWDR = I2CTWI_buf[TWI_bufPos++];
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to send byte
(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| //
(0<<TWWC); //
} else { // Send STOP after last byte
TWI_statusReg.lastTransOK = 1; // Set status bits to completed successfully.
TWCR = (1<<TWEN)| // TWI Interface enabled
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interrupt and clear the flag
(0<<TWEA)|(0<<TWSTA)|(no_rep_start<<TWSTO)| // Initiate a STOP/REP_START condition.
(0<<TWWC); //
}
break;
Sonst niergends!
Das Resultat ist der TWI Error 0x30.
Wenn ich in meiner neuen, angepassten Funktion:
Code:
void I2CTWI_transmitByte_RepeatedStart(uint8_t targetAdr, uint8_t data)
{
while(I2CTWI_isBusy() || TWI_operation != I2CTWI_NO_OPERATION) task_I2CTWI();
I2CTWI_delay();
TWI_msgSize = 2;
I2CTWI_buf[0] = targetAdr;
I2CTWI_buf[1] = data;
TWI_statusReg.all = 0;
no_rep_start = 0;
TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO);
}
Das no_rep_start auf 1 setze, ist alles wie vorher...
Muss eventuell noch irgendwas (ein TWSTO) mit no_rep_start gesetzt oder ergänzt werden?
Danke und
Viele Grüße
teamohnename
Lesezeichen