get mostly one directional comms working
This commit is contained in:
@@ -84,41 +84,81 @@ void mcp3550_spi_init()
|
||||
// return value;
|
||||
// }
|
||||
|
||||
// int32_t mcp3550_read(uint8_t cs_pin)
|
||||
// {
|
||||
// uint8_t rx_buf[4] = {0};
|
||||
// uint32_t timeout_us = MCP3550_TIMEOUT_MS * 1000;
|
||||
// int64_t start = esp_timer_get_time();
|
||||
|
||||
// // Start conversion
|
||||
// mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 0); // CS LOW
|
||||
|
||||
// // Wait until MISO/SDO goes LOW = DR ready
|
||||
// while (gpio_get_level(MCP3550_MISO_GPIO)) {
|
||||
// if ((esp_timer_get_time() - start) > timeout_us) {
|
||||
// ESP_LOGW(TAG_MICS, "Timeout waiting for MISO=0 on CS %u", cs_pin);
|
||||
// mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 1); // CS HIGH
|
||||
// return INT32_MIN;
|
||||
// }
|
||||
// esp_rom_delay_us(10); // micro delay
|
||||
// }
|
||||
|
||||
// // Data is ready, do full SPI read
|
||||
// spi_transaction_t trans = {
|
||||
// .length = 25, // 25 bits
|
||||
// .rx_buffer = rx_buf,
|
||||
// };
|
||||
// esp_err_t err = spi_device_transmit(mcp3550_handle, &trans);
|
||||
|
||||
// mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 1); // CS HIGH to start next conversion
|
||||
|
||||
// if (err != ESP_OK) {
|
||||
// ESP_LOGE(TAG_MICS, "SPI transmit failed");
|
||||
// return INT32_MIN;
|
||||
// }
|
||||
|
||||
// // Extract 22-bit result
|
||||
// uint32_t raw = ((rx_buf[0] & 0x3F) << 16) | (rx_buf[1] << 8) | rx_buf[2];
|
||||
|
||||
// // Sign-extend 22-bit value
|
||||
// int32_t value = raw;
|
||||
// if (value & (1 << 21)) value |= 0xFFC00000;
|
||||
|
||||
// return value;
|
||||
// }
|
||||
|
||||
int32_t mcp3550_read(uint8_t cs_pin)
|
||||
{
|
||||
uint8_t rx_buf[4] = {0};
|
||||
uint32_t timeout_us = MCP3550_TIMEOUT_MS * 1000;
|
||||
uint32_t data = 0;
|
||||
int64_t start = esp_timer_get_time();
|
||||
uint32_t timeout_us = MCP3550_TIMEOUT_MS * 1000;
|
||||
|
||||
// Start conversion
|
||||
mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 0); // CS LOW
|
||||
// CS LOW
|
||||
mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 0);
|
||||
|
||||
// Wait until MISO/SDO goes LOW = DR ready
|
||||
// Wait for DR (MISO LOW)
|
||||
while (gpio_get_level(MCP3550_MISO_GPIO)) {
|
||||
if ((esp_timer_get_time() - start) > timeout_us) {
|
||||
ESP_LOGW(TAG_MICS, "Timeout waiting for MISO=0 on CS %u", cs_pin);
|
||||
mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 1); // CS HIGH
|
||||
return INT32_MIN;
|
||||
}
|
||||
esp_rom_delay_us(10); // micro delay
|
||||
vTaskDelay(pdMS_TO_TICKS(10)); // Wait 1 tick (e.g., 1ms)
|
||||
}
|
||||
|
||||
// Data is ready, do full SPI read
|
||||
spi_transaction_t trans = {
|
||||
.length = 25, // 25 bits
|
||||
.rx_buffer = rx_buf,
|
||||
};
|
||||
esp_err_t err = spi_device_transmit(mcp3550_handle, &trans);
|
||||
|
||||
mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 1); // CS HIGH to start next conversion
|
||||
|
||||
if (err != ESP_OK) {
|
||||
ESP_LOGE(TAG_MICS, "SPI transmit failed");
|
||||
return INT32_MIN;
|
||||
// Clock out 25 bits
|
||||
for (int i = 0; i < 25; i++) {
|
||||
gpio_set_level(MCP3550_SCK_GPIO, 1);
|
||||
esp_rom_delay_us(5); // small delay to simulate clock high
|
||||
data = (data << 1) | gpio_get_level(MCP3550_MISO_GPIO);
|
||||
gpio_set_level(MCP3550_SCK_GPIO, 0);
|
||||
esp_rom_delay_us(5); // small delay to simulate clock low
|
||||
}
|
||||
|
||||
// Extract 22-bit result
|
||||
uint32_t raw = ((rx_buf[0] & 0x3F) << 16) | (rx_buf[1] << 8) | rx_buf[2];
|
||||
mcp23018_set_pin(MCP23018_DEV_HANDLE, cs_pin, 1); // CS HIGH
|
||||
|
||||
// Extract 22-bit value (bits [23:2])
|
||||
uint32_t raw = (data >> 2) & 0x3FFFFF;
|
||||
|
||||
// Sign-extend 22-bit value
|
||||
int32_t value = raw;
|
||||
|
Reference in New Issue
Block a user