Support retries for samd and touchwheel i2c
This commit is contained in:
+6
-2
@@ -65,8 +65,12 @@ I2CTransaction::~I2CTransaction() {
|
|||||||
free(buffer_);
|
free(buffer_);
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t I2CTransaction::Execute(i2c_port_t port) {
|
esp_err_t I2CTransaction::Execute(int num_retries) {
|
||||||
return i2c_master_cmd_begin(port, handle_, kI2CTimeout);
|
esp_err_t res;
|
||||||
|
do {
|
||||||
|
res = i2c_master_cmd_begin(I2C_NUM_0, handle_, kI2CTimeout);
|
||||||
|
} while (res == ESP_ERR_TIMEOUT && num_retries-- > 0);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
I2CTransaction& I2CTransaction::start() {
|
I2CTransaction& I2CTransaction::start() {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class I2CTransaction {
|
|||||||
* ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode.
|
* ESP_ERR_INVALID_STATE I2C driver not installed or not in master mode.
|
||||||
* ESP_ERR_TIMEOUT Operation timeout because the bus is busy.
|
* ESP_ERR_TIMEOUT Operation timeout because the bus is busy.
|
||||||
*/
|
*/
|
||||||
esp_err_t Execute(i2c_port_t port = I2C_NUM_0);
|
esp_err_t Execute(int num_retries = 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enqueues a start condition. May also be used for repeated start
|
* Enqueues a start condition. May also be used for repeated start
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ Samd::Samd() {
|
|||||||
.write_addr(kAddress, I2C_MASTER_READ)
|
.write_addr(kAddress, I2C_MASTER_READ)
|
||||||
.read(&raw_res, I2C_MASTER_NACK)
|
.read(&raw_res, I2C_MASTER_NACK)
|
||||||
.stop();
|
.stop();
|
||||||
ESP_ERROR_CHECK(transaction.Execute());
|
ESP_ERROR_CHECK(transaction.Execute(1));
|
||||||
ESP_LOGI(kTag, "samd firmware rev: %u", raw_res);
|
ESP_LOGI(kTag, "samd firmware rev: %u", raw_res);
|
||||||
|
|
||||||
UpdateChargeStatus();
|
UpdateChargeStatus();
|
||||||
@@ -78,7 +78,7 @@ auto Samd::UpdateChargeStatus() -> void {
|
|||||||
.write_addr(kAddress, I2C_MASTER_READ)
|
.write_addr(kAddress, I2C_MASTER_READ)
|
||||||
.read(&raw_res, I2C_MASTER_NACK)
|
.read(&raw_res, I2C_MASTER_NACK)
|
||||||
.stop();
|
.stop();
|
||||||
esp_err_t res = transaction.Execute();
|
esp_err_t res = transaction.Execute(1);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ auto Samd::UpdateUsbStatus() -> void {
|
|||||||
.write_addr(kAddress, I2C_MASTER_READ)
|
.write_addr(kAddress, I2C_MASTER_READ)
|
||||||
.read(&raw_res, I2C_MASTER_NACK)
|
.read(&raw_res, I2C_MASTER_NACK)
|
||||||
.stop();
|
.stop();
|
||||||
esp_err_t res = transaction.Execute();
|
esp_err_t res = transaction.Execute(1);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -141,7 +141,7 @@ auto Samd::ResetToFlashSamd() -> void {
|
|||||||
.write_addr(kAddress, I2C_MASTER_WRITE)
|
.write_addr(kAddress, I2C_MASTER_WRITE)
|
||||||
.write_ack(Registers::kUsbControl, 0b100)
|
.write_ack(Registers::kUsbControl, 0b100)
|
||||||
.stop();
|
.stop();
|
||||||
ESP_ERROR_CHECK(transaction.Execute());
|
ESP_ERROR_CHECK(transaction.Execute(3));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Samd::PowerDown() -> void {
|
auto Samd::PowerDown() -> void {
|
||||||
@@ -150,7 +150,7 @@ auto Samd::PowerDown() -> void {
|
|||||||
.write_addr(kAddress, I2C_MASTER_WRITE)
|
.write_addr(kAddress, I2C_MASTER_WRITE)
|
||||||
.write_ack(Registers::kPowerControl, 0b1)
|
.write_ack(Registers::kPowerControl, 0b1)
|
||||||
.stop();
|
.stop();
|
||||||
ESP_ERROR_CHECK(transaction.Execute());
|
ESP_ERROR_CHECK(transaction.Execute(3));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Samd::CreateReadPending() -> SemaphoreHandle_t {
|
auto Samd::CreateReadPending() -> SemaphoreHandle_t {
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ void TouchWheel::WriteRegister(uint8_t reg, uint8_t val) {
|
|||||||
.write_addr(kTouchWheelAddress, I2C_MASTER_WRITE)
|
.write_addr(kTouchWheelAddress, I2C_MASTER_WRITE)
|
||||||
.write_ack(reg, val)
|
.write_ack(reg, val)
|
||||||
.stop();
|
.stop();
|
||||||
esp_err_t res = transaction.Execute();
|
esp_err_t res = transaction.Execute(1);
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
ESP_LOGW(kTag, "write failed: %s", esp_err_to_name(res));
|
ESP_LOGW(kTag, "write failed: %s", esp_err_to_name(res));
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@ uint8_t TouchWheel::ReadRegister(uint8_t reg) {
|
|||||||
.write_addr(kTouchWheelAddress, I2C_MASTER_READ)
|
.write_addr(kTouchWheelAddress, I2C_MASTER_READ)
|
||||||
.read(&res, I2C_MASTER_NACK)
|
.read(&res, I2C_MASTER_NACK)
|
||||||
.stop();
|
.stop();
|
||||||
if (transaction.Execute() == ESP_OK) {
|
if (transaction.Execute(1) == ESP_OK) {
|
||||||
return res;
|
return res;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user