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.

[参考译文] MSP432E401Y:I2C 问题、MAP_I2CMasterControl 发送地址和0x00字节

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1397579/msp432e401y-i2c-issue-map_i2cmastercontrol-sends-address-and-a-0x00-byte

器件型号:MSP432E401Y

工具与软件:

您好!

我已经将旧代码库从 MSP430转换到 MSP432E401Y、并且有一点已经与 I2C 进行了处理。  我已使用 i2c_MASTER_CPU_fifo_MSP_EXP432E401Y_nortos_ccs 示例重写了 I2C 段。  不过、我发现在我一直在处理的这段本来有效的 I2C 代码中存在问题。  它会发送一个额外的0x00字节、每当我使用 MAP_I2CMasterControl 准备写入时都不需要这个字节。

使用以下断点:

我可以看到以下内容:


我希望对 I2C 主控的调用不会发送任何内容。  我是否应该有不同的参数、或者是否需要设置某个标志、或者是否要进行某种操作以确保除了我用 MAP_I2CFIFODataPutNonBlocking 放置在队列中的数据之外不会写入任何内容?


提前感谢您的帮助。

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

    您好!

      MAP_I2CMasterControl 是 I2C 状态机的启动内容。 当您使用 I2C_MASTER_CMD_BURST_SEND_START 时、意味着它从突发序列的第一个写入数据开始。 在发送第一个数据后、您会使总线保持空闲状态、直到发送后续数据。 后续数据使用 I2C_MASTER_CMD_BURST_SEND_CONT 发送、突发序列中的最后一个数据以 I2C_MASTER_CMD_BURST_SEND_FINISH 结束。  

    如果只需写入一个数据、则应使用 如下使用 I2C_MASTER_CMD_SINGLE_SEND 标志的示例。

    MAP_I2CMasterControl (I2C7_BASE I2C_MASTER_CMD_SINGLE_SEND);

    下面是一个读取多个数据的示例代码。 您可以模拟写入操作的代码。  

    void
    I2CReadCommand(uint32_t * pui32DataRx)
    {
    //
    // Modify the data direction to true, so that seeing the address will
    // indicate that the I2C Master is initiating a read from the slave.
    //
    MAP_I2CMasterSlaveAddrSet(I2C7_BASE, SHT21_I2C_ADDRESS, true);

    //
    // Setup for first read. Use I2C_MASTER_CMD_BURST_RECEIVE_START
    // to start a burst mode read. The I2C master continues to own
    // the bus at the end of this transaction.
    //
    MAP_I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);

    //
    // Wait until master module is done transferring.
    // The I2C module has a delay in setting the Busy flag in the register so
    // there needs to be a delay before checking the Busy bit. The below loops
    // wait until the Busy flag is set, and then wait until it is cleared to
    // indicate that the transaction is complete. This can take up to 633 CPU
    // cycles @ 100 kbit I2C Baud Rate and 120 MHz System Clock. Therefore, a
    // while loop is used instead of SysCtlDelay.
    //
    while(!MAP_I2CMasterBusy(I2C7_BASE))
    {
    }
    while(MAP_I2CMasterBusy(I2C7_BASE))
    {
    }

    //
    // Read the first byte data from the slave.
    //
    pui32DataRx[0] = MAP_I2CMasterDataGet(I2C7_BASE);

    //
    // Setup for the second read. Use I2C_MASTER_CMD_BURST_RECEIVE_CONT
    // to continue the burst mode read. The I2C master continues to own
    // the bus at the end of this transaction.
    //
    MAP_I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);

    //
    // Wait until master module is done transferring.
    //
    while(!MAP_I2CMasterBusy(I2C7_BASE))
    {
    }
    while(MAP_I2CMasterBusy(I2C7_BASE))
    {
    }

    //
    // Read the second byte data from the slave.
    //
    pui32DataRx[1] = MAP_I2CMasterDataGet(I2C7_BASE);

    //
    // Setup for the third read. Use I2C_MASTER_CMD_BURST_RECEIVE_FINISH
    // to terminate the I2C transaction. At the end of this transaction,
    // the STOP bit will be issued and the I2C bus is returned to the
    // Idle state.
    //
    MAP_I2CMasterControl(I2C7_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);

    //
    // Wait until master module is done transferring.
    //
    while(!MAP_I2CMasterBusy(I2C7_BASE))
    {
    }
    while(MAP_I2CMasterBusy(I2C7_BASE))
    {
    }

    //
    // Note the third 8-bit data is the checksum byte. It will be
    // left to the users as an exercise if they want to verify if the
    // checksum is correct.
    pui32DataRx[2] = MAP_I2CMasterDataGet(I2C7_BASE);

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

    感谢您的回复、但这并不是我要做的。

    我想发送几个字节、我在 状态机中使用 MAP_I2CFIFODataPutNonBlocking 发送这些字节。  我不希望在地址之后发送一个零字节。  为什么它在我调用  MAP_I2CMasterControl 后发送零?  是否能够使它写入数据的第一个字节而不是零?

    我不明白为什么专门发送零字节。


    目前、对于我的代码、如果我尝试 向0x2C 发送{1F、FF}、实际上我会在调用 MasterControl 时立即发送0x00、然后发送1F、FF。  我怎么能得到它来仅发送1F,FF?

    再次感谢你能抽出时间。

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

    这是我的反馈。

     -你刷新 FIFO 了吗? FIFO 中可能已经有一些残留数据。

     -如果你打算使用 FIFO ,那么你需要 I2C_MASTER_CMD_FIFO_BURST_SEND_START 标志,但你使用 I2C_MASTER_CMD_BURST_SEND_START 代替非 FIFO 操作调用。

     - 我强烈建议您不要在初始开发时使用 FIFO 版本。 一旦您可以开始基本工作、就可以免费试用 FIFO。  

     -我从不使用  MAP_I2CFIFODataPutNonBlocking 自己。  在调用 MAP_I2CMasterControl 之前、我始终使用 I2CFIFODataPut 准备要发送的每个数据 。

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

    我重写了调用非 FIFO 函数的代码。  示例代码会调用  I2C_MASTER_CMD_BURST_SEND_START 、然后使用 FIFO 调用。  在从头开始重新编写而不是使用示例之后、我会使代码完全运行。  感谢您的帮助