【问题标题】:ReadWords instead of BytesReadWords 而不是 Bytes
【发布时间】:2017-08-01 20:47:03
【问题描述】:

我正在使用 I2C 通信,我需要读取单词而不是字节,但我被卡住了。 要读取字节,我会这样做:

void I2CReadBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *value)
{
    uint8_t i=0;
    I2C_MasterSendStart(devAddr, I2C_WRITE_XFER_MODE);
    I2C_MasterWriteByte(regAddr);
    I2C_MasterSendRestart(devAddr, I2C_READ_XFER_MODE);
    while (i++ < (length-1)) {
        *value++ = I2C_MasterReadByte(I2C_ACK_DATA);
    }
    *value = I2C_MasterReadByte(I2C_NAK_DATA);
    I2C_MasterSendStop();
}

如果我想阅读单词怎么办?我必须使用 int16_t *value 但之后我被困住了

while (i++ < (length-1)) {
            *value++ = I2C_MasterReadByte(I2C_ACK_DATA);
        }
        *value = I2C_MasterReadByte(I2C_NAK_DATA);

谢谢

【问题讨论】:

  • 最简单的做法是根据您现有的字节读取函数编写一个单词读取函数,如下所示:void I2CReadWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *value) { I2CReadBytes(devAddr, regAddr, length * 2, (uint8_t *)value); }。但是您可能会遇到字节排序问题。

标签: c byte i2c words


【解决方案1】:

大写的

uint16_t ReadWord(void)
{
    uint16_t result = 0;
    uint8_t b;
    b = I2C_MasterReadByte(I2C_ACK_DATA);
    result = b + I2C_MasterReadByte(I2C_ACK_DATA) << 8;
    return result; 
}

它不检查任何错误,因为我不知道你的是否这样做

【讨论】:

  • b 是 LSB?应该是 MSB 在前吧?
  • 取决于总线的另一侧。 I2C 是面向字节的,其他设备决定字节顺序。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2017-01-12
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多