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:
Sonst niergends!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;
Das Resultat ist der TWI Error 0x30.
Wenn ich in meiner neuen, angepassten Funktion:
Das no_rep_start auf 1 setze, ist alles wie vorher...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); }
Muss eventuell noch irgendwas (ein TWSTO) mit no_rep_start gesetzt oder ergänzt werden?
Danke und
Viele Grüße
teamohnename







Zitieren

Lesezeichen