Hi,
I am going through various sensors on my custom board and integrating them one by one. I've got "i2c0" peripheral setup and can talk with BME680, LIS2DS12 no problem. I am having some issues with LIS2DS12 but I am not troubleshooting it yet.
What is strange, is that the thread that is requesting data from the INA219 run, but I see no I2C traces using my logic analyser. I can see I2C traffic for the BME680 and LIS2DS12, so I should see the INA219 since they are all on the same bus.
I have ruled out these issues:
- Physical connection. Yes it exists, I've "beeped it out", but not really relevant since I don't see trace on LA.
- Device address - not relevant since I cannot even see the I2C traces on the logic analyser.
- Thread starvation - the thread never runs. It does, I've used Debugger to confirm that it is executing.
- Error from Zephyr - could be, but I am logging the response from "sensor_channel_get" and it always returns 0.
- Device is not ready - it is, I see no error log that it is not ready.
- DTS config is incorrect - I took DTS config directly from the zephyr/samples/sensors/ina219 project in v2.2.0 Nordic SDK
Here is my .overlay which works for the BME680 and LIS2DS12, but not INA219
&i2c0 { compatible = "nordic,nrf-twim"; status = "okay"; pinctrl-0 = <&i2c0_default>; pinctrl-1 = <&i2c0_sleep>; pinctrl-names = "default", "sleep"; ina219: ina219@40 { status = "okay"; compatible = "ti,ina219"; reg = <0x40>; brng = <0>; pg = <0>; sadc = <13>; badc = <13>; shunt-milliohm = <100>; lsb-microamp = <10>; }; kt2027ewe: kt2027ewe@30{ compatible = "i2c-device"; reg = <0x30>; }; kt2027bewe: kt2027bewe@31{ compatible = "i2c-device"; reg = <0x31>; }; bme680: bme680@76 { compatible = "bosch,bme680"; reg = <0x76>; }; lis2ds12: lis2ds12@1e { compatible = "st,lis2ds12"; reg = <0x1E>; irq-gpios = < &gpio0 7 GPIO_ACTIVE_HIGH>,<&gpio0 31 GPIO_ACTIVE_HIGH>; }; };
Here is the code that is supposed to fetch data from INA219. You will see that it is almost the same as sample code + use of thread in Zephyr.
#include <zephyr/kernel.h> #include <zephyr/device.h> #include <zephyr/sys/util.h> #include <zephyr/sys/printk.h> #include <zephyr/logging/log.h> #include <zephyr/drivers/sensor.h> #include "hw_pwr_monitor.h" LOG_MODULE_REGISTER(pwr_monitor, LOG_LEVEL_DBG); const struct device *pwr_mon_i2c = DEVICE_DT_GET_ONE(ti_ina219); struct sensor_value v_bus, power, current; static void fetch_and_display(const struct device *sensor) { int ret = sensor_channel_get(pwr_mon_i2c, SENSOR_CHAN_VOLTAGE, &v_bus); if(ret > 0) { LOG_ERR("Failed to retrieve Voltage from %s",pwr_mon_i2c->name); } ret = sensor_channel_get(pwr_mon_i2c, SENSOR_CHAN_POWER, &power); if(ret > 0) { LOG_ERR("Failed to retrieve Power from %s",pwr_mon_i2c->name); } ret = sensor_channel_get(pwr_mon_i2c, SENSOR_CHAN_CURRENT, ¤t); if(ret > 0) { LOG_ERR("Failed to retrieve Current from %s",pwr_mon_i2c->name); } LOG_INF("Bus: %f [V] -- " "Power: %f [W] -- " "Current: %f [A]", sensor_value_to_double(&v_bus), sensor_value_to_double(&power), sensor_value_to_double(¤t)); } void hw_pwr_mon_thread(void) { if (pwr_mon_i2c == NULL) { LOG_ERR("No device found"); return; } if (!device_is_ready(pwr_mon_i2c)) { LOG_ERR("Device %s is not ready", pwr_mon_i2c->name); return; } LOG_INF("Device %p name is %s", pwr_mon_i2c, pwr_mon_i2c->name); while (1) { fetch_and_display(pwr_mon_i2c); k_sleep(K_MSEC(3000)); } } K_THREAD_DEFINE(hw_pwr_mon_thread_id, CONFIG_PWR_MONITOR_THREAD_STACK_SIZE, hw_pwr_mon_thread, NULL, NULL, NULL, CONFIG_PWR_MONITOR_THREAD_PRIORITY, 0, 0);
Here is the LA trace.
This is the output I am seeing.
00> *** Booting Zephyr OS build v3.2.99-ncs1 *** 00> [00:00:01.302,368] <inf> buttons: Set up button at gpio@50000000 pin 11, mask 2048 00> [00:00:01.302,429] <inf> buttons: Set up button at gpio@50000000 pin 24, mask 16777216 00> [00:00:01.302,490] <inf> buttons: Set up button at gpio@50000000 pin 25, mask 33554432 00> [00:00:01.302,551] <inf> buttons: Set up button at gpio@50000000 pin 12, mask 4096 00> [00:00:01.302,581] <inf> buttons: Set up LED at gpio@50000000 pin 13 00> [00:00:01.302,581] <inf> buttons: Starting timer 00> [00:00:01.302,673] <inf> pwr_monitor: Device 0xb4d4 name is ina219@40 00> [00:00:01.302,734] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:04.302,825] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:07.302,947] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:10.303,070] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:13.303,192] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:16.303,314] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:19.303,436] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:22.303,558] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:25.303,680] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:28.303,802] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:31.303,924] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:34.304,046] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:37.304,168] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:40.304,290] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:43.304,412] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:48.811,859] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A] 00> [00:00:53.172,821] <inf> pwr_monitor: Bus: 0.000000 [V] -- Power: 0.000000 [W] -- Current: 0.000000 [A]