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.

[参考译文] TMS320F28375S:无法从 AM4096磁性编码器中读取 I2C 数据。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1333067/tms320f28375s-not-able-to-read-i2c-data-from-am4096-magnetic-encoder

器件型号:TMS320F28375S
Thread 中讨论的其他器件:SysConfigC2000WARE

大家好!

我的代码基于 TMS320F28375S、我要在 Launchpad 28379D 中进行调试。 我已通过 SysConfig 工具配置了 I2C、如下图所示。

我了解 I2C 协议、但不知道它在 CCS (TI 控制器)中是如何工作的

这是用于 I2C 协议的代码的一部分、

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void main()
{
myI2C0_init();
//-----------------------------------//
// while loop from main()
while(1)
{
while(I2C_isBusBusy(myI2C0_BASE)); // bus check
I2C_sendStartCondition(myI2C0_BASE); // start
I2C_putData(myI2C0_BASE, 0xB4); // addr + 0 (write)
I2C_putData(myI2C0_BASE, 0x20); // read reg no 32
I2C_sendStartCondition(myI2C0_BASE); // repeated start
I2C_putData(myI2C0_BASE, 0xB5); // addr + 1 (read)
I2C_buf[0] = I2C_getData(myI2C0_BASE); // read MSB
I2C_sendNACK(myI2C0_BASE); // send NACK
I2C_buf[1] = I2C_getData(myI2C0_BASE); // read LSB
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我的从器件地址是90 (十进制)。

I2C 未按此方式工作。 有时候公交车很忙,有时我在得到停止条件状态时被搞砸了。

请帮助我从 AM4096获取数据。

提前感谢。

此致

穆扎米尔·克雷希

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

    您好 Muzammil:

    您是否参考了 C2000Ware 中的现有 I2C 示例? i2c_ex3_external_loopback 示例展示了如何 与 I2C 一起使用发送/接收数据、甚至具有 I2C FIFO 的中断、我建议您在进行基本设置时查看该中断。 确保您可以在继续操作之前运行该示例、这样、在开发前就有一个已知良好的起点。

    C2000Ware_5_01_00_00\driverlib\f2837xs+示例\cpu1\i2c

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

    您好、Omer:

    感谢您的回复。

    在本例中、我必须在轮询模式和没有 FIFO 模式下从 I2C 获取数据。 因为我正在尝试、但无法获得数据。 请进一步建议我。

    我还在前一封邮件中附上了我如何执行此操作的代码。 请向我提供与此相关的支持。

    谢谢。此

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

    尊敬的客户:

    在第一次传输后时钟变为低电平状态。

    谢谢。此

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

    您好 Muzammil:

    在本例中,我必须在轮询模式和没有 FIFO 模式下从 I2C 获取数据。 因为我正在尝试、但无法获得数据。 请进一步推荐我。

    在前面提到的示例文件夹中、没有不使用 FIFO 和轮询的示例、但 i2c_ex4_eeprom_polling 展示了如何将 I2C 用于轮询。 不妨看看 图19-7。 I2C 主器件 TX/RX 流程图在本参考手册的 I2C 章节中、您可以看到、如果您不使用 FIFO 或重复模式、则传输数据只需要将下一个数据填充到 I2CDXR 寄存器中:

    在 driverlib 中、这意味着使用 I2C_putData 填充寄存器。

    查看您的代码、我不确定您在发送多个启动而不是停止时所做的具体操作。 该流程图显示、 使用/不使用 FIFO 传输数据仅在需要轮询的中断中有所不同。 是否尝试使用重复模式? 如果是这样、将不会根据您的 I2C 设置正确配置您的 I2CMDR 寄存器。 SysConfig 看起来不像具有重复模式选项、因此我会让软件专家知道添加这个选项。 与此同时、 如果您想要使用重复模式、I2C_setConfig 需要包含 I2C_REPEATE_MODE 宏、以使用重复模式。

    我在前一条消息中还附上了我如何执行此操作的代码。 请向我提供与此相关的支持。

    您表示您的代码无法正常工作、因此我将举出工作示例来帮助简化解决方案、而不是更正代码。

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

    您好、Omer:

    查看您的代码时,我不确定您在发送多个启动而不是停止的操作。

    我放置了无停止条件的 START 条件、因为在写入我必须读取的从器件地址和寄存器地址后、我必须生成重复的 START 条件(可生成此条件、写入启动条件而不写入停止条件)、以便根据 AM4096的数据表获取数据。

    第二件事是我的 SDA 线在第一次传输后始终变为低电平。

    我来详细解释一下这个问题。

    我只得到一次数据、在将 AM4096编码器连接到其自己的 USB 硬件(UPRGAM4096)后、再连接到控制器。 我首次获得数据并且 SDA 线变为低电平。 然后、将编码器连接到 USB 接口并重新连接到控制器后、它仅提供一个数据、SDA 线再次变为低电平。

    如果 SDA 线变为低电平、且我在未将其连接到 UPRGAM4096 (该器件也有自己的软件)并重新连接到控制器的情况下再次进行调试、那么它也不会一次提供数据。
    问题是,我必须连接 am4096与 UPRGAM4096和再次控制器每次。 我仍然只获得1次数据、SDA 变为低电平。
    我将附加我更新后的代码(仅在循环时执行、因为我没有在初始化中更改任何内容、这在前文消息中提到)。
    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    while(1)
    {
    while (I2C_isBusBusy(myI2C0_BASE)); // Ensure bus is not busy
    // Write operation
    I2C_setConfig(myI2C0_BASE, I2C_MASTER_SEND_MODE | I2C_REPEAT_MODE);
    I2C_setSlaveAddress(myI2C0_BASE, 90); // 90 addr
    DEVICE_DELAY_US(30);
    I2C_setDataCount(myI2C0_BASE, 1);
    DEVICE_DELAY_US(30);
    I2C_putData(myI2C0_BASE, 0x20); // Command/Register to read from
    DEVICE_DELAY_US(30);
    I2C_sendStartCondition(myI2C0_BASE);
    DEVICE_DELAY_US(30);
    while (!(I2C_getStatus(myI2C0_BASE) & I2C_STS_REG_ACCESS_RDY));
    DEVICE_DELAY_US(30);
    // DEVICE_DELAY_US(500);
    // Read operation
    I2C_setConfig(myI2C0_BASE, I2C_MASTER_RECEIVE_MODE | I2C_REPEAT_MODE);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    谢谢。此 
    致、 穆扎米尔·克雷希
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Muzammil:

    请提供通信发生处和问题发生位置的屏幕截图。 您还能告诉我 SDA/SCL 上的上拉电阻的值是多少?

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

    您好、Omer:

    请提供通信发生和问题发生的位置的屏幕截图。

    我第一次获得数据。 在我标记的箭头后面、SCL 线始终变为低电平。 然后、我再次调试我的项目、我看到了这个。

     现在、我的 SDA 线变为低电平。 此过程一直进行到我将其连接到 UPRGAM4096接口并重新连接到控制器。

    我随附 USB 软件接口的屏幕截图。

    您是否还能告诉我 SDA/SCL 上的上拉电阻器值是多少?

    我使用 RMK4评估板。 这是原理图。

    我已由 SysConfig 将我的引脚设置为"开漏输出、启用上拉的输出和输入"。  

    我已经给了我大量的时间用于项目的 I2C、请帮我解决这个问题。

    谢谢。此

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

    您好 Muzammil:

    在第二个屏幕截图中、您能否检查 I2CSTR、看看是否有 NACK 或者除了总线忙位之外、是否设置了任何其他状态位?

    我要附加 USB 软件界面的屏幕截图。

    提到要连接的接口的 USB 设置时我感到困惑、I2C 线路和 USB 线路是否以某种方式共享用于通信? 您在前面提到过:"我只得到一次数据、而且在将 AM4096编码器连接到其自己的 USB 硬件(UPRGAM4096)后、再连接到控制器后、"、但根据所附的示意图、这对我来说并不完全有意义。 I2C 和 USB 硬件连接应是独立的。

    如果可以、一种验证 F2837xS I2C 外设是否正常运行的方法是从 C2000Ware 运行外部环回示例;这将验证 F2837xS 端或目标器件端是否出现问题。 请告诉我、您是否能够在使用您尝试用于该项目的引脚时运行此示例而不会出现任何问题。