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