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.

[参考译文] TMS320F28379D:I2C 传感器需要8位地址、如何使用 TMS320F28379D 生成?

Guru**** 2589280 points
Other Parts Discussed in Thread: TMS320F28379D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1107498/tms320f28379d-i2c-sensor-requires-8-bit-address-how-to-generate-it-with-tms320f28379d

器件型号:TMS320F28379D

大家好

我想在 TMS320F28379D 上实现一个通过 I2C 连接到 Infineon 的3D 磁性霍尔传感器 TLI493D-W2BW A0的接口、但我面临的问题是传感器从未在 I2C 总线上使用 ACK 进行应答。 我认为问题是传感器以某种方式需要8位地址、但我不确定如何使用 TMS320F28379D 生成8位地址波形。  该传感器的写入地址为0x6A、下图给出了要写入传感器的示例波形(请注意8位地址)。

我的代码生成以下波形(示波器上显示了 SDA):

可以看出、0x6A 地址的"前导零"似乎没有生成(在第一个上升沿、如果 SCLK、SDA 为高电平而不是低电平、这应该是根据第一幅图片中的基准波形来生成的)。

我使用以下函数执行 I2C 写入:

/*! \brief Function Header: (uint8_t addr, const uint8_t* data, uint8_t count)
 *
 * I2C write command must have a header precisely of type:
 * (uint8_t addr, const uint8_t* data, uint8_t count), where:
 * \param addr Is the I2C address to read from data is the;
 * \param data is the array that the function will read to
 * \param count is the number of bytes the function will read
 *
 * \code{.c}
 * // =============== EXAMPLE ================
 * uint8_t payload[] = {5, 1, 2, 3};
 * // write 4 bytes from payload to the I2C device with address 0x23
 * error = _I2C_write(0x23, payload, 4);
 * \endcode
 * */
inline uint8_t w2bw_i2c_write(uint8_t addr,const uint8_t* data,uint8_t count){
    //push the data to the I2C TX FIFO
    uint8_t i=0;
    for(i=0; i<count; i++){
        I2C_putData(I2C0_W2BW_BASE,data[i]);
    }
    //set the I2C slave address to the write address
    I2C_setSlaveAddress(I2C0_W2BW_BASE,0x6A);
    //set the number of bytes to be sent
    I2C_setDataCount(I2C0_W2BW_BASE, count);
    //set the I2C mode to master
    I2C_setConfig(I2C0_W2BW_BASE, I2C_MASTER_SEND_MODE);
    //send the start condition
    I2C_sendStartCondition(I2C0_W2BW_BASE);
    //send the stop condition
    I2C_sendStopCondition(I2C0_W2BW_BASE);
    //wait until TX FIFO is empty
    while(I2C_getTxFIFOStatus(I2C0_W2BW_BASE)!=I2C_FIFO_TXEMPTY){
        ;
    }
    return 0;
}

和以下用于初始化 I2C 模块的函数:

void I2Cinit(){
    I2C_disableModule(I2C0_W2BW_BASE);
    I2C_initMaster(I2C0_W2BW_BASE, DEVICE_SYSCLK_FREQ, 400000, I2C_DUTYCYCLE_33);
    I2C_setConfig(I2C0_W2BW_BASE, I2C_MASTER_SEND_MODE);
    I2C_setSlaveAddress(I2C0_W2BW_BASE, 0);
    I2C_disableLoopback(I2C0_W2BW_BASE);
    I2C_setBitCount(I2C0_W2BW_BASE, I2C_BITCOUNT_1);
    I2C_setDataCount(I2C0_W2BW_BASE, 1);
    I2C_setAddressMode(I2C0_W2BW_BASE, I2C_ADDR_MODE_7BITS);
    I2C_enableFIFO(I2C0_W2BW_BASE);
    I2C_setFIFOInterruptLevel(I2C0_W2BW_BASE, I2C_FIFO_TXEMPTY, I2C_FIFO_RXEMPTY);
    I2C_setEmulationMode(I2C0_W2BW_BASE, I2C_EMULATION_STOP_SCL_LOW);
    I2C_enableModule(I2C0_W2BW_BASE);
}

我注意到有一个选项可以将"I2C_ADDR_MODE_7BITS"更改为"I2C_ADDR_MODE_10BITS"、但似乎没有8位选项(我也从未听说过 I2C 的这种模式)。 是否有特殊选项可生成前导零位、或者是否缺少其他内容?

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

    您好!

    I2C 寻址通常为7位。 被引用的第8位是 R/W 位、不应将其视为从器件地址的一部分。

    我认为您的案例中的正确地址应为0x35。

        //set the I2C slave address to the write address
        I2C_setSlaveAddress(I2C0_W2BW_BASE,0x35);

    最棒的

    Kevin

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

    大家好、感谢您的回复。 实际上、通过将地址更改为0x35、我得到了正确的波形、器件似乎正在发送 ACK。 但是、现在我遇到的问题是、微控制器似乎在从器件发送第一个应答后停止传输:

    当我查看 I2caRegs 时、状态寄存器似乎为零:

    SCLK 线保持低电平、根据数据表、需要器件干预、但我不太理解我应该怎么做? 器件不应该移出我放置在 I2C FIFO 中的剩余字节?

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

    您好、MMDucance、

    [引用 userid="467105" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forume/1107498/tms320f28379d-i2c-sensor-require-8-bit-address-how to -genere-it-with -tms320f28379d/4103919]不应将剩余的 I2C/3919]引用的 FIFO 中的数据字节移出器件。

    您认为它是正确的。 我认为它可能是将 SCL 线路保持在低电平的霍尔传感器器件。 您似乎需要在 ACK 位之后发送这3个触发位(全为零)、当前您看到的是1的发送。 尝试匹配 TLI493D-W2BW 器件波形/协议。

    最棒的

    Kevin

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

    大家好、再次感谢您的回复。 我发现先前的错误是在 I2C 设置中将位数设置为1而不是8。 现在、I2C 模块正确移出这两个字节 并得到传感器的确认、但在发送这两个字节后、I2C 模块似乎生成了一个"重新启动"并重新发送从器件地址、而不是发送停止条件:

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

    您好、MMDucance、

    在第一个启动条件之后、您是否能够检查 STT 是否出于某种原因为1? 它应该在第一个起始条件生成后被清除、但是也许某些代码会再次将它设置为1。

    最棒的

    Kevin

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

    大家好、与此同时、我能够解决这个问题。 问题是在设置停止条件位后需要等待。 在第一个导致发送重启传输的 I2C 事务之后、我立即启动了另一个 I2C 事务。 通过在例程开始时轮询 BB (总线占线)位来解决此问题。