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.

[参考译文] RTOS/AM3354:I2C 写入问题

Guru**** 2589300 points
Other Parts Discussed in Thread: AM3354

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/639845/rtos-am3354-i2c-write-issue

器件型号:AM3354

工具/软件:TI-RTOS

大家好:
我将 am3354与 I2C 总线一起使用,当我将数据写入设备时,就像这样:
0xFE、0x00、0x09、0x10、0x00、 0xF0、0x00、0x00 0x08、0xC9、0x99
(0xFE00是 regAddr,另一个是数据)
但是、当我用示波器对总线执行波形处理时、数据的发送方式如下:
0xF0、0x00、0x00 0x08、0xC9、0x99、 0xFE、0x00、0x09、0x10、0x00

似乎有些数据是由 FIFO 或其他数据进行缓冲的。
首先发送6 ~ 11个字节、然后发送1 ~ 5个字节;
PS:我在 ISR 中打印写入 I2C_DATA 的数据、顺序正常;
为什么会发生这种情况? 我的 I2C_BUF 寄存器是默认设置、这意味着 FIFO 被禁用。

这是我的代码。 有人帮助我吗?

ERROR_code I2CDevReg16AddrMultWrite (uint32_t index、uint8_t devAddr、uint16_t regAddr、uint8_t * buf、uint32_t length)
{
I2CMasterSlaveAddrSet (i2cContext[index].baseAddr、devAddr);
i2cContext[index].slaveTData[0]=(regAddr >> 8)& 0xFF;
i2cContext[index].slaveTData[1]= regAddr & 0xFF;
for (i = 0;i < length;i++)
{
i2cContext[index].slaveTData[i + 2]= buf[i];
}

i2cContext[index].txCompFlag = 0;
i2cContext[index].rxCompFlag = 1;
i2cContext[index].dataIdx = 0;
i2cContext[index].dataMaxT =长度+ 2;

I2CSetDataCount (i2cContext[index].baseAddr、length + 2);

I2CMasterControl (i2cContext[index].baseAddr、I2C_CFG_MST_TX | I2C_CFG_STOP);

I2CMasterIntEnableEx (i2cContext[index].baseAddr、I2C_INT_Transmit 就绪| I2C_INT_NO_ACK);

I2CMasterStart (i2cContext[index].baseAddr);
}

void I2C2Isr (void)
{
uint32_t status;

status = I2CMasterIntStatus (i2cContext[2].baseAddr);
I2CMasterIntClearEx (i2cContext[2].baseAddr、(status &~(I2C_INT_RECV_READY |
I2C_INT_Transmit 就绪());

IF (STATUS 和 I2C_INT_Transmit 就绪)
{
I2CMasterDataPut (i2cContext[2].baseAddr、i2cContext[2].slaveTData[i2cContext[2].dataIdx]);
I2CMasterIntClearEx (i2cContext[2].baseAddr、I2C_INT_Transmit 就绪);
i2cContext[2].dataIdx++;

if (i2cContext[2].dataMaxT =i2cContext[2].dataIdx)
{
I2CMasterIntDisableEx (i2cContext[2].baseAddr、I2C_INT_Transmit 就绪);
i2cContext[2].txCompFlag = 1;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢! 但事实上、我使用这种更可能的软件、它是否重要?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该团队还负责 Starterware。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    高 Biser:

    我的问题是否被别人注意到?
    已经一周了。 有人帮助我吗?

    此致
    Jhon
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误你的时间。 我已上报请求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jhon、

    我建议使用 PDK 中提供的 I2C 示例开始您的 I2C 应用开发、该 PDK 位于
    C:\ti\pdk_am335x_1_0_8\packages\MyExampleProjects\I2C_Example_evmAM335x_armExampleProject

    该示例在 PDK 中默认不可用、但需要使用 pdkProjectCreate.bat 文件生成。
    我之所以指向此示例、是因为 Starterware 支持已被弃用、而开发的最佳方法是 PDK 中的驱动程序。 如果您需要裸机类型示例(非 RTOS)、则在上面指向的示例中有一个宏可启用此功能(#ifdefBARE金属)。

    I2C 特定 API 实现位于 C:\ti\pdk_am335x_1_0_8\packages/ti\drv\i2c\src\v1\I2C_v1.c

    您使用的是哪个版本?

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

    感谢您重放!
    我想我遇到了这个问题,在我写 FIFO 缓冲区之前,每次我先清除 FIFO 缓冲区,数据都会恢复正常!

    谢谢!

    Jhon