接前一篇文章:ICM-20948 Wake on Motion功能开发全过程(4)
探索工作
初步探索
上一回讲到,笔者认为ICM-20948的功能应该是在基础功能的基础上加入Wake on Motion的相关功能就可以了。为此,笔者搜索了手册中与“wake”相关的地方,一共找到12处。经过上一回的分析,最终确定3处与Wake on Motion功能的寄存器和代码密切相关。
再来回顾一下都是哪些寄存器。
可以看到,分别是INT_ENABLE、INT_STATUS、ACCEL_WOM_THR寄存器。
笔者尝试在之前基础功能代码之后,加入INT_ENABLE和ACCEL_WOM_THR寄存器的配置(INT_STATUS寄存器是只读寄存器,用于读取状态的,无需配置)。
代码分别如下:
- INT_ENABLE寄存器配置代码
ret = icm20948_set_motion_int(icm20948, 1);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_set_motion_int failed");
return ret;
}
static esp_err_t icm20948_set_motion_int(icm20948_handle_t sensor, bool enable)
{
esp_err_t ret;
uint8_t tmp;
ret = icm20948_set_bank(sensor, 0);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_set_bank failed");
return ret;
}
ret = icm20948_read(sensor, ICM20948_INT_ENABLE, &tmp, 1);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_read failed");
return ret;
}
//bit3 (WOM_INT_EN): 1 - Enable interrupt for wake on motion to propagate to interrupt pin 1
if (enable)
tmp |= 0x08;
else
tmp &= 0xF7;
ret = icm20948_write(sensor, ICM20948_INT_ENABLE, &tmp, 1);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_write failed");
return ret;
}
return ESP_OK;
}
代码的功能是置位INT_ENABLE寄存器中的WOM_INT_EN位,即使能Wake on Motion中断。
- ACCEL_WOM_THR寄存器配置代码
ret = icm20948_set_motion_threshold(icm20948, 100);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_set_motion_threshold failed");
return ret;
}
static esp_err_t icm20948_set_motion_threshold(icm20948_handle_t sensor, uint8_t threshold)
{
esp_err_t ret;
ret = icm20948_set_bank(sensor, 2);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_set_bank failed");
return ret;
}
ret = icm20948_write(sensor, ICM20948_WOM_THR, &threshold, 1);
if (ret != ESP_OK)
{
ESP_LOGE(TAG, "icm20948_write failed");
return ret;
}
ESP_LOGI(TAG, "ICM-20948 WOM_THRESHOLD = %d", threshold);
return ESP_OK;
}
代码的功能是设置ACCEL_WOM_THR寄存器中的门限值。
加入了以上两处代码后,笔者满心以为Wake on Motion功能应该就能正常实现了。结果反复试了多次,都无法触发中断。笔者又仔细检查了代码,并且将以上设置中的值又读了出来,确保设置成功了。结果仍然没有中断产生。
这是为什么?难道还有笔者没有看到的地方?到底还有哪些寄存器与此功能相关?请看下回。