i2c_master: fix writing function to cope with read function now including a stop
This commit is contained in:
parent
29226246f6
commit
4b1651a1a3
|
@ -670,22 +670,39 @@ enum i2c_master_rc i2c_master_address_read(uint32_t i2c, uint16_t slave, bool ad
|
||||||
if (I2C_MASTER_RC_NONE != rc) {
|
if (I2C_MASTER_RC_NONE != rc) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
rc = i2c_master_read(i2c, data, data_size); // read memory
|
rc = i2c_master_read(i2c, data, data_size); // read memory (includes stop)
|
||||||
if (I2C_MASTER_RC_NONE != rc) {
|
if (I2C_MASTER_RC_NONE != rc) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
i2c_master_stop(i2c); // sent stop condition
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = I2C_MASTER_RC_NONE; // all went well
|
rc = I2C_MASTER_RC_NONE;
|
||||||
error:
|
error:
|
||||||
i2c_master_stop(i2c); // sent stop condition
|
if (I2C_MASTER_RC_NONE != rc) { // only send stop on error
|
||||||
|
i2c_master_stop(i2c); // sent stop condition
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum i2c_master_rc i2c_master_address_write(uint32_t i2c, uint16_t slave, bool address_10bit, const uint8_t* address, size_t address_size, const uint8_t* data, size_t data_size)
|
enum i2c_master_rc i2c_master_address_write(uint32_t i2c, uint16_t slave, bool address_10bit, const uint8_t* address, size_t address_size, const uint8_t* data, size_t data_size)
|
||||||
{
|
{
|
||||||
cm3_assert(I2C1 == i2c || I2C2 == i2c);
|
cm3_assert(I2C1 == i2c || I2C2 == i2c);
|
||||||
|
if (SIZE_MAX - address_size < data_size) { // prevent integer overflow
|
||||||
|
return I2C_MASTER_RC_OTHER;
|
||||||
|
}
|
||||||
|
if (address_size + data_size > 10 * 1024) { // we won't enough RAM
|
||||||
|
return I2C_MASTER_RC_OTHER;
|
||||||
|
}
|
||||||
|
if (address_size > 0 && NULL == address) {
|
||||||
|
return I2C_MASTER_RC_OTHER;
|
||||||
|
}
|
||||||
|
if (data_size > 0 && NULL == data) {
|
||||||
|
return I2C_MASTER_RC_OTHER;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t buffer[address_size + data_size];
|
||||||
enum i2c_master_rc rc = I2C_MASTER_RC_NONE; // to store I²C return codes
|
enum i2c_master_rc rc = I2C_MASTER_RC_NONE; // to store I²C return codes
|
||||||
rc = i2c_master_start(i2c); // send (re-)start condition
|
rc = i2c_master_start(i2c); // send (re-)start condition
|
||||||
if (I2C_MASTER_RC_NONE != rc) {
|
if (I2C_MASTER_RC_NONE != rc) {
|
||||||
|
@ -696,20 +713,21 @@ enum i2c_master_rc i2c_master_address_write(uint32_t i2c, uint16_t slave, bool a
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// write address
|
// we can't send the address then the data size short address will cause a stop (because of how crappy the STM32F10x I²C peripheral is)
|
||||||
if (NULL != address && address_size > 0) {
|
if (address) {
|
||||||
rc = i2c_master_write(i2c, address, address_size); // send memory address
|
for (size_t i = 0; i < address_size; i++) {
|
||||||
if (I2C_MASTER_RC_NONE != rc) {
|
buffer[i] = address[i];
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// read data
|
if (data) {
|
||||||
if (NULL != data && data_size > 0) {
|
for (size_t i = 0; i < data_size; i++) {
|
||||||
rc = i2c_master_write(i2c, data, data_size); // write memory
|
buffer[address_size + i] = data[i];
|
||||||
if (I2C_MASTER_RC_NONE != rc) {
|
|
||||||
goto error;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rc = i2c_master_write(i2c, buffer, address_size + data_size); // send memory address
|
||||||
|
if (I2C_MASTER_RC_NONE != rc) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
rc = i2c_master_stop(i2c); // sent stop condition
|
rc = i2c_master_stop(i2c); // sent stop condition
|
||||||
|
|
Loading…
Reference in New Issue