Fixed Freescale byte reads (minus k64)

See:
https://mbed.org/questions/3181/Inconsistent-results-when-attempting-wri/
for the issue. Now every byte read is treated equal and ACKs/NACKs are
correctly generated
pull/288/head
Sissors 2014-04-30 10:46:23 +02:00
parent 62dcd84aa3
commit 2ec18a06d8
2 changed files with 11 additions and 45 deletions

View File

@ -48,8 +48,6 @@ static const uint16_t ICR[0x40] = {
2304, 2560, 3072, 3840
};
static uint8_t first_read;
void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
// determine the I2C to use
@ -70,8 +68,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
pinmap_pinout(sda, PinMap_I2C_SDA);
pinmap_pinout(scl, PinMap_I2C_SCL);
first_read = 1;
}
int i2c_start(i2c_t *obj) {
@ -83,7 +79,6 @@ int i2c_start(i2c_t *obj) {
obj->i2c->C1 |= I2C_C1_MST_MASK;
obj->i2c->C1 |= I2C_C1_TX_MASK;
}
first_read = 1;
return 0;
}
@ -98,7 +93,6 @@ int i2c_stop(i2c_t *obj) {
// code provided with the freedom board
for (n = 0; n < 100; n++)
__NOP();
first_read = 1;
return 0;
}
@ -279,30 +273,19 @@ void i2c_reset(i2c_t *obj) {
int i2c_byte_read(i2c_t *obj, int last) {
char data;
// set rx mode
obj->i2c->C1 &= ~I2C_C1_TX_MASK;
if(first_read) {
// first dummy read
i2c_do_read(obj, &data, 0);
first_read = 0;
}
if (last) {
// set tx mode
obj->i2c->C1 |= I2C_C1_TX_MASK;
return obj->i2c->D;
}
// Setup read
i2c_do_read(obj, &data, last);
return data;
// set tx mode
obj->i2c->C1 |= I2C_C1_TX_MASK;
return obj->i2c->D;
}
int i2c_byte_write(i2c_t *obj, int data) {
first_read = 1;
// set tx mode
obj->i2c->C1 |= I2C_C1_TX_MASK;

View File

@ -37,8 +37,6 @@ static const uint16_t ICR[0x40] = {
2304, 2560, 3072, 3840
};
static uint8_t first_read;
void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
// determine the I2C to use
@ -63,8 +61,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
pinmap_pinout(sda, PinMap_I2C_SDA);
pinmap_pinout(scl, PinMap_I2C_SCL);
first_read = 1;
}
int i2c_start(i2c_t *obj) {
@ -84,7 +80,6 @@ int i2c_start(i2c_t *obj) {
obj->i2c->C1 |= I2C_C1_MST_MASK;
obj->i2c->C1 |= I2C_C1_TX_MASK;
}
first_read = 1;
return 0;
}
@ -98,7 +93,6 @@ int i2c_stop(i2c_t *obj) {
// This wait is also included on the samples
// code provided with the freedom board
for (n = 0; n < 100; n++) __NOP();
first_read = 1;
return 0;
}
@ -284,26 +278,15 @@ int i2c_byte_read(i2c_t *obj, int last) {
// set rx mode
obj->i2c->C1 &= ~I2C_C1_TX_MASK;
if(first_read) {
// first dummy read
i2c_do_read(obj, &data, 0);
first_read = 0;
}
if (last) {
// set tx mode
obj->i2c->C1 |= I2C_C1_TX_MASK;
return obj->i2c->D;
}
// Setup read
i2c_do_read(obj, &data, last);
return data;
// set tx mode
obj->i2c->C1 |= I2C_C1_TX_MASK;
return obj->i2c->D;
}
int i2c_byte_write(i2c_t *obj, int data) {
first_read = 1;
// set tx mode
obj->i2c->C1 |= I2C_C1_TX_MASK;