This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:将 MSP430FR2355用作 I2C 从设备时、可进行多字节寄存器寻址

Guru**** 2516170 points
Other Parts Discussed in Thread: MSP430FR2355

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/965739/msp430fr2355-multiple-bytes-register-addressing-when-using-the-msp430fr2355-as-an-i2c-slave

器件型号:MSP430FR2355

我一直关注 msp430fr235x_eusci_standard_master 和 msp430fr235x_eusci_standard_slave、以打造 MSP430FR2355 i2c 从器件。 我已经读取了 slva704 "了解 i2c 总线"、并且是否可能有一个长度为2个或更多字节的寄存器地址? 不是器件地址、而是寄存器地址或命令。

在代码中:

void I2C_Slave_ProcessCMD (uint8_t cmd)

void I2C_Slave_TransactionDone (uint8_t cmd)

cmd 可以是 uint16t、甚至更长? 或者 i2c 协议是否禁止它、数据包中的命令/寄存器字节最大可为8位?

此致、

CAN

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I2C 本身(UM10204)对寄存器没有任何评价。 它只知道读取和写入。

    出现的惯例(通用但非通用)是、从器件将写入的第一个字节解释为寄存器编号或指针、这会导致状态存储在从器件中、以便后续读取根据该状态返回数据。 写操作中的后续字节将被解释为基于该保存状态(这可能会影响该状态、例如自动递增)要存储的数据。

    VL53L3被视为具有2字节寄存器编号的从机。 (大) I2C EEPROM 可能具有一个3字节的寄存器编号(在这种情况下更恰当地称为"指针")。

    也就是说、您需要回顾您感兴趣的特定代码、以确保它不会对1字节寄存器编号产生任何隐式/意外依赖关系。 例如、需要注意的一点是:如果主控方进行1字节写入、会发生什么情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bruce、您好!

    我想从2个字节寄存器中读取数据。 下面是我的 I2C0接收函数:

    uint32_t I2C0Receive (uint32_t slave_addr、uint8_t reg){

       I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、false);
       I2CMasterDataPut (I2C0_BASE、reg);
       I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
       while (I2CMasterBusy (I2C0_BASE));

       I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_addr、TRUE);
       I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
       while (I2CMasterBusy (I2C0_BASE));
       返回 I2CMasterDataGet (I2C0_BASE);

    第一部分、我向从器件发送我要读取的寄存器地址。 (reg)。 遗憾的是、在 API 中、I2CMasterDataPut 仅接受 uint8_t。 我可以在这里重复代码、并可能发送两次? 我还可以如何解决这个问题?

    因此、我基本上希望从一个2字节地址读取多个字节。

    此致、

    C.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不熟悉您使用的 API、但假设它用于 Tiva/MSP432E (8字节 FIFO)、我怀疑您可以执行以下操作:

    >  I2CMasterDataPut (I2C0_BASE、reg);

    使用

    > I2CMasterDataPut (I2C0_BASE、(reg >> 8)&0xFF); // MSB 优先

    >I2CMasterDataPut (I2C0_BASE、(reg >> 0)&0xFF); // LSB second

    自从使用过大于1字节寄存器编号的器件以来,我就采用了大端字节序(MSByte 优先)。 (当然是小样本。) 如果您要写入另一端、则可以选择它。

    说明显而易见:您需要知道从器件的寄存器编号大小;如果您在具有1字节寄存器编号的从器件上使用第二个变体、则会写入您不打算写入的某些寄存器。