some more progress, but still can't see devices
This commit is contained in:
@@ -645,7 +645,7 @@ static int cci_write_burst(uint16_t start, uint16_t word_len, uint16_t *buf)
|
||||
int i;
|
||||
|
||||
size_t bufSize = sizeof(*buf) * (1 + word_len);
|
||||
buffer = malloc(bufSize);
|
||||
unsigned char *buffer = (unsigned char *)malloc(bufSize);
|
||||
|
||||
// Create the i2c transaction buffer
|
||||
buffer[0] = start >> 8;
|
||||
@@ -656,15 +656,16 @@ static int cci_write_burst(uint16_t start, uint16_t word_len, uint16_t *buf)
|
||||
buffer[i * 2 + 1] = *buf++ & 0xFF;
|
||||
}
|
||||
|
||||
esp_err_t ret = i2c_master_transmit(LEPTON_DEV_HANDLE, buffer, sizeof(buffer), I2C_TIMEOUT_MS_VALUE);
|
||||
esp_err_t ret = i2c_master_transmit(LEPTON_DEV_HANDLE, buffer, bufSize, I2C_TIMEOUT_MS_VALUE);
|
||||
free(buffer);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
ESP_LOGV(TAG_CCI, "Burst write to register 0x%04X successful (Value: 0x%04X)", reg_addr, value);
|
||||
ESP_LOGV(TAG_CCI, "Burst write to register 0x%04X successful", start);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGE(TAG_CCI, "Burst write to register 0x%04X failed: %s", reg_addr, esp_err_to_name(ret));
|
||||
ESP_LOGE(TAG_CCI, "Burst write to register 0x%04X failed: %s", start, esp_err_to_name(ret));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -684,11 +685,12 @@ uint16_t cci_read_register(uint16_t reg_addr)
|
||||
{
|
||||
uint8_t buffer[2];
|
||||
|
||||
esp_err_t ret = i2c_master_transmit_receive(LEPTON_DEV_HANDLE, ®_addr, sizeof(reg_addr), buffer, sizeof(buffer), I2C_TIMEOUT_MS_VALUE);
|
||||
esp_err_t ret = i2c_master_transmit_receive(LEPTON_DEV_HANDLE, (uint8_t *)®_addr, sizeof(reg_addr), buffer, sizeof(buffer), I2C_TIMEOUT_MS_VALUE);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
ESP_LOGV(TAG_CCI, "Read from register 0x%04X successful (Value: 0x%04X)", reg_addr, *value);
|
||||
return (((uint16_t)(buffer[0] & 0xFF)) << 8) | (buffer[1] & 0xFF);
|
||||
uint16_t value = (((uint16_t)(buffer[0] & 0xFF)) << 8) | (buffer[1] & 0xFF);
|
||||
ESP_LOGV(TAG_CCI, "Read from register 0x%04X successful (Value: 0x%04X)", reg_addr, value);
|
||||
return value;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -713,24 +715,30 @@ int cci_read_burst(uint16_t start, uint16_t word_len, uint16_t *buf)
|
||||
return -1;
|
||||
}
|
||||
size_t bufSize = word_len * sizeof(*buf);
|
||||
buffer = malloc(bufSize);
|
||||
esp_err_t ret = i2c_master_transmit_receive(LEPTON_DEV_HANDLE, ®_addr, sizeof(reg_addr), buffer, bufSize, I2C_TIMEOUT_MS_VALUE);
|
||||
unsigned char *buffer = (unsigned char *)malloc(bufSize);
|
||||
esp_err_t ret = i2c_master_transmit_receive(LEPTON_DEV_HANDLE, (uint8_t *)&start, sizeof(start), buffer, bufSize, I2C_TIMEOUT_MS_VALUE);
|
||||
if (ret == ESP_OK)
|
||||
{
|
||||
ESP_LOGV(TAG_CCI, "Read from register 0x%04X successful (Value: 0x%04X)", reg_addr, *value);
|
||||
ESP_LOGV(TAG_CCI, "Read from register 0x%04X successful", start);
|
||||
for (int i = 0; i < word_len; i++)
|
||||
{ // CHECK IF THIS IS NEEDED
|
||||
*buf++ = buffer[i * 2] << 8 | buffer[i * 2 + 1];
|
||||
}
|
||||
free(buffer);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGE(TAG_CCI, "Read from register 0x%04X failed: %s", reg_addr, esp_err_to_name(ret));
|
||||
ESP_LOGE(TAG_CCI, "Read from register 0x%04X failed: %s", start, esp_err_to_name(ret));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for busy to be clear in the status register
|
||||
* Returns the 16-bit STATUS
|
||||
* Returns 0x00010000 if there is a communication failure
|
||||
*/
|
||||
/**
|
||||
* Wait for busy to be clear in the status register
|
||||
* Returns the 16-bit STATUS
|
||||
@@ -739,12 +747,13 @@ int cci_read_burst(uint16_t start, uint16_t word_len, uint16_t *buf)
|
||||
static uint32_t cci_wait_busy_clear()
|
||||
{
|
||||
bool err = false;
|
||||
uint8_t buf[2] = {0x00, 0x07};
|
||||
uint8_t tx_buf[2]; // Register address to read from
|
||||
uint8_t rx_buf[2]; // Value buffer
|
||||
|
||||
int t = 0; // maximum tick count
|
||||
uint16_t reg_addr = 0x0002; // STATUS register
|
||||
int t = 0;
|
||||
|
||||
// Wait for booted, not busy
|
||||
while (((buf[1] & 0x07) != 0x06) && !err)
|
||||
while (!err)
|
||||
{
|
||||
if (t++ >= CCI_MAX_WAIT_TICKS)
|
||||
{
|
||||
@@ -752,32 +761,33 @@ static uint32_t cci_wait_busy_clear()
|
||||
break;
|
||||
}
|
||||
|
||||
// Write STATUS register address
|
||||
buf[0] = 0x00;
|
||||
buf[1] = 0x02;
|
||||
// Prepare register address in big-endian
|
||||
tx_buf[0] = (reg_addr >> 8) & 0xFF;
|
||||
tx_buf[1] = reg_addr & 0xFF;
|
||||
|
||||
esp_err_t ret = i2c_master_transmit_receive(LEPTON_DEV_HANDLE, ®_addr, sizeof(reg_addr), buf, sizeof(buf), I2C_TIMEOUT_MS_VALUE);
|
||||
if (ret == ESP_OK)
|
||||
esp_err_t ret = i2c_master_transmit_receive(LEPTON_DEV_HANDLE, tx_buf, sizeof(tx_buf), rx_buf, sizeof(rx_buf), I2C_TIMEOUT_MS_VALUE);
|
||||
if (ret != ESP_OK)
|
||||
{
|
||||
ESP_LOGV(TAG_CCI, "Read from register 0x%04X successful (Value: 0x%04X)", reg_addr, *value);
|
||||
ESP_LOGE(TAG_CCI, "Failed to read STATUS register: %s", esp_err_to_name(ret));
|
||||
return 0x00010000;
|
||||
}
|
||||
else
|
||||
|
||||
uint16_t status = ((uint16_t)rx_buf[0] << 8) | rx_buf[1];
|
||||
|
||||
ESP_LOGV(TAG_CCI, "STATUS register read: 0x%04X", status);
|
||||
|
||||
// Check bits [2:0] == 0b110 (0x06)
|
||||
if ((rx_buf[1] & 0x07) == 0x06)
|
||||
{
|
||||
ESP_LOGE(TAG_CCI, "Read from register 0x%04X failed: %s", reg_addr, esp_err_to_name(ret));
|
||||
return -1;
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
if (err)
|
||||
{
|
||||
return 0x00010000;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (buf[0] << 8) | buf[1];
|
||||
}
|
||||
// Timed out
|
||||
return 0x00010000;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Wait for busy to be clear in the status register and check the result
|
||||
* printing an error if detected
|
||||
|
Reference in New Issue
Block a user