【问题标题】:How to format I2C data from device data sheet?如何格式化设备数据表中的 I2C 数据?
【发布时间】:2019-08-23 16:18:11
【问题描述】:

我最近使用 Nordic NRF52832 DK 开始了一个项目。我在这块板上连接了一个 DRV2605 线性谐振执行器驱动器。在我搬到北欧开发板之前,我正在使用为 DRV2605 提供的库在 Arduino 上进行原型设计,所以这非常简单。

现在,我正在尝试通过从device setup guide 写入指定的寄存器来自行初始化和控制 DRV2605。

Section 1.6.2 是我一直在看的。假设我要写入反馈控制寄存器。我知道地址是 0x1A 并且我需要写一个与列出的四个设置相对应的值。我坚持的是如何实际创建我需要编写的数据。该表有一列我假设我将为每个设置修改的位范围?

通过查看图表(使用默认设置),我假设我需要写入的数据是 13331122。如果我将该值插入 dec 到 hex 转换器,我会得到 CB6AB2。该值的“B6”部分与图表中的“值(十六进制)”列相关还是巧合?

这是我用来写入 FC reg 的代码:

#define DRV_ADDR 0x5A
uint8_t fc_reg[2] = {0x1A, 13331122};
nrf_drv_twi_tx(&m_twi, DRV_ADDR, fc_reg, sizeof(fc_reg), false);

从做一些research 看来,位掩码可能是我所缺少的?这仍然不能真正解释图表中的值不匹配。

非常感谢我能在这方面获得任何帮助,谢谢!

【问题讨论】:

  • 每个 I²C 事务不能发送超过一个字节 (0-255)。有 SMBus 协议,支持 byte 包(块传输)。
  • @0andriy I2C 可以在地址帧之后有任意数量的数据帧。
  • @ThomasJager,是的,我表述错误。它不能发送超过一个字节作为数据帧的要点。如果需要 16 位值,那么它将是 2 个数据帧。
  • @0andriy 啊,完美,我明白你的意思了
  • @SpinBower 我认为您不太了解位的工作原理。默认位似乎是1_011_01_10(由字段分隔),这是您期望的0xB6。 13331122 远大于单个字节。

标签: c i2c bitmask


【解决方案1】:

根据提供的屏幕截图,您可以看到反馈控制寄存器的地址为 0x1A,更重要的是,该寄存器包含 1 个字节的信息。它有效地用作位标志,其中每个位代表不同的东西。例如,只有第 7 位代表 LRA。因此,如果您要将 0x80(DEC 128)写入该寄存器,它将打开 LRA,如果您想启用/配置其他东西,它只是 0x80 的按位或。您对构建的框架有正确的想法,但是对于 LRA,它应该看起来像这样。

uint8_t fc_reg[2] = {0x1A, 0x80};

显然,将 0x80 替换为您想要设置的任何标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多