ICM-20948 Wake on Motion功能开发全过程(5)

接前一篇文章: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功能应该就能正常实现了。结果反复试了多次,都无法触发中断。笔者又仔细检查了代码,并且将以上设置中的值又读了出来,确保设置成功了。结果仍然没有中断产生。

这是为什么?难道还有笔者没有看到的地方?到底还有哪些寄存器与此功能相关?请看下回。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值