mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-22 23:56:13 +01:00
Temporarily use Wire for I2C.
This commit is contained in:
parent
bad9e866f8
commit
2469629cbb
|
@ -111,7 +111,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
//#define I2C_USE_WIRE
|
||||
#define I2C_USE_WIRE
|
||||
#ifndef I2C_NO_INTERRUPTS
|
||||
#define I2C_USE_INTERRUPTS
|
||||
#endif
|
||||
|
@ -235,7 +235,7 @@ private:
|
|||
// Mark volatile as they are updated by IRC and read/written elsewhere.
|
||||
static I2CRB * volatile queueHead;
|
||||
static I2CRB * volatile queueTail;
|
||||
static volatile uint8_t status;
|
||||
static volatile uint8_t state;
|
||||
|
||||
static I2CRB * volatile currentRequest;
|
||||
static volatile uint8_t txCount;
|
||||
|
|
|
@ -136,7 +136,7 @@ void I2CManagerClass::I2C_handleInterrupt() {
|
|||
} else { // Nothing left to send or receive
|
||||
TWDR = 0xff; // Default condition = SDA released
|
||||
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); // Send Stop
|
||||
status = I2C_STATUS_OK;
|
||||
state = I2C_STATUS_OK;
|
||||
}
|
||||
break;
|
||||
case TWI_MRX_DATA_ACK: // Data byte has been received and ACK transmitted
|
||||
|
@ -159,7 +159,7 @@ void I2CManagerClass::I2C_handleInterrupt() {
|
|||
bytesToReceive--;
|
||||
}
|
||||
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); // Send Stop
|
||||
status = I2C_STATUS_OK;
|
||||
state = I2C_STATUS_OK;
|
||||
break;
|
||||
case TWI_START: // START has been transmitted
|
||||
case TWI_REP_START: // Repeated START has been transmitted
|
||||
|
@ -175,7 +175,7 @@ void I2CManagerClass::I2C_handleInterrupt() {
|
|||
case TWI_MTX_DATA_NACK: // Data byte has been transmitted and NACK received
|
||||
TWDR = 0xff; // Default condition = SDA released
|
||||
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); // Send Stop
|
||||
status = I2C_STATUS_NEGATIVE_ACKNOWLEDGE;
|
||||
state = I2C_STATUS_NEGATIVE_ACKNOWLEDGE;
|
||||
break;
|
||||
case TWI_ARB_LOST: // Arbitration lost
|
||||
// Restart transaction from start.
|
||||
|
@ -185,7 +185,7 @@ void I2CManagerClass::I2C_handleInterrupt() {
|
|||
default:
|
||||
TWDR = 0xff; // Default condition = SDA released
|
||||
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWEA)|(1<<TWSTO); // Send Stop
|
||||
status = I2C_STATUS_TRANSMIT_ERROR;
|
||||
state = I2C_STATUS_TRANSMIT_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
void I2CManagerClass::_initialise()
|
||||
{
|
||||
queueHead = queueTail = NULL;
|
||||
status = I2C_STATE_FREE;
|
||||
state = I2C_STATE_FREE;
|
||||
I2C_init();
|
||||
}
|
||||
|
||||
|
@ -60,8 +60,8 @@ void I2CManagerClass::_setClock(unsigned long i2cClockSpeed) {
|
|||
void I2CManagerClass::startTransaction() {
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
||||
I2CRB *t = queueHead;
|
||||
if ((status == I2C_STATE_FREE) && (t != NULL)) {
|
||||
status = I2C_STATE_ACTIVE;
|
||||
if ((state == I2C_STATE_FREE) && (t != NULL)) {
|
||||
state = I2C_STATE_ACTIVE;
|
||||
currentRequest = t;
|
||||
rxCount = txCount = 0;
|
||||
// Copy key fields to static data for speed.
|
||||
|
@ -135,7 +135,7 @@ void I2CManagerClass::checkForTimeout() {
|
|||
unsigned long currentMicros = micros();
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
||||
I2CRB *t = queueHead;
|
||||
if (t && timeout > 0) {
|
||||
if (state==I2C_STATE_ACTIVE && t!=0 && timeout > 0) {
|
||||
// Check for timeout
|
||||
if (currentMicros - startTime > timeout) {
|
||||
// Excessive time. Dequeue request
|
||||
|
@ -148,7 +148,7 @@ void I2CManagerClass::checkForTimeout() {
|
|||
// Try close and init, not entirely satisfactory but sort of works...
|
||||
I2C_close(); // Shutdown and restart twi interface
|
||||
I2C_init();
|
||||
status = I2C_STATE_FREE;
|
||||
state = I2C_STATE_FREE;
|
||||
|
||||
// Initiate next queued request
|
||||
startTransaction();
|
||||
|
@ -178,7 +178,7 @@ void I2CManagerClass::handleInterrupt() {
|
|||
// Experimental -- perform the post processing with interrupts enabled.
|
||||
//interrupts();
|
||||
|
||||
if (status!=I2C_STATUS_PENDING) {
|
||||
if (state!=I2C_STATE_ACTIVE && state != I2C_STATE_FREE) {
|
||||
// Remove completed request from head of queue
|
||||
I2CRB * t;
|
||||
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
||||
|
@ -187,10 +187,10 @@ void I2CManagerClass::handleInterrupt() {
|
|||
queueHead = t->nextRequest;
|
||||
if (!queueHead) queueTail = queueHead;
|
||||
t->nBytes = rxCount;
|
||||
t->status = status;
|
||||
t->status = state;
|
||||
}
|
||||
// I2C state machine is now free for next request
|
||||
status = I2C_STATE_FREE;
|
||||
state = I2C_STATE_FREE;
|
||||
}
|
||||
// Start next request (if any)
|
||||
I2CManager.startTransaction();
|
||||
|
@ -201,7 +201,7 @@ void I2CManagerClass::handleInterrupt() {
|
|||
I2CRB * volatile I2CManagerClass::queueHead = NULL;
|
||||
I2CRB * volatile I2CManagerClass::queueTail = NULL;
|
||||
I2CRB * volatile I2CManagerClass::currentRequest = NULL;
|
||||
volatile uint8_t I2CManagerClass::status = I2C_STATE_FREE;
|
||||
volatile uint8_t I2CManagerClass::state = I2C_STATE_FREE;
|
||||
volatile uint8_t I2CManagerClass::txCount;
|
||||
volatile uint8_t I2CManagerClass::rxCount;
|
||||
volatile uint8_t I2CManagerClass::operation;
|
||||
|
|
Loading…
Reference in New Issue
Block a user