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.

[参考译文] TM4C123GH6PM:主器件使能后、BUSBUSY 标志为高电平

Guru**** 2943400 points

Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/885076/tm4c123gh6pm-busbusy-flag-is-high-after-master-enable

器件型号:TM4C123GH6PM

大家好,

我正在进行一个使用 IMU GY-6050和 TM4C123GH6PM TivaC 套件的项目,我遇到了严重的问题

在这里、一旦我设置主器件位、总线忙标志= 1

I2C 初始化序列为:

1) 1)我启用端口时钟

2) 2)我选择 SDA 作为开漏

3)我选择 Porta PIN6和 PIN7作为 I2C 引脚

4)我将 I2C 时钟配置为400kHz

5)我启用 i2c 模块

6)我启用 Master 位

连接为:

SCL (TivaC)-> SCL (IMU)

SDA (TivaC)-> SDA (IMU)

GND (IMU) -> GND (TivaC)

输入电压(IMU)  ->3.3 (TivaC)

这是有原因还是有解决办法?

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

    您好!

    我的小团队(外部人员)发现您的描述非常清楚... 然而、您的"方法"似乎(至少有些)有问题。   

    您会注意到、"一旦我设置主控位、总线忙标志= 1。"    

    我们认为(严重)需要进一步详细说明中的陈述:

    • 您是如何做出这一决定的?   您的"初始化序列"(顺便说一句)似乎已在您的步骤#6结束-这是"启用了主位"。   (为清楚起见-请确认您 向 I2CMCR 寄存器写入了0x0000.0010值)
    • 如果事实证明、并且您的初始化已停止、那么您的初始化是否"不完整?"   请注意、您的 MCU 手册(第1016页)列出了"额外的6个步骤(总共12个)"、并且(可能)列出了"所有这些步骤都是必需的"-以清除"忙碌"。
    • 此外(第1020页- I2CMCS 公开) 建议、"繁忙"位  "根据开始和停止条件进行更改。"   因此-您的"阅读'忙碌'(如您的商品信息所示)可能(甚至可能)为时过早。
    • 和(第1021页)注意到、较简单的"busy"位-"设置后、所有其他状态位无效!"   您是否注意到-如果是-您是否检查了""位的级别?    

    我们相信已经确定了(多个)您(潜在)问题的"原因"、并且"修复"需要完全执行 MCU 手册的"12步、I2C 初始化过程"。   (PG.1015和1016)   

    对于"如何以及为什么在步骤6之后读取"I2CMC"寄存器、您仍然感兴趣?"

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

    首先,非常感谢您的快速回复。

    执行此行代码后、BUSBUSY 位被置位、我可以通过调试器窗口看到:

               RCGCI2C |= 1<<AssignedModuleNum;
               I2CMCR (AssignedModuleNum)|= 1 << MasterEnableRegShiftBits;

    假设:

    AsignedModuleNum ->选择的模块编号  

    MasterEnableRegShiftBits -> 4.

    我已经按照您提到的数据表页面中提到的12个步骤进行了操作,但是一旦我完成 生成(开始、运行和停止位)的部分,仲裁丢失引脚就会被置位,尽管它是一个单一的主系统。 所以我想知道这是否是因为总线总是很忙

    详细代码:

       PORT_Init();
       PORT_SetPinMode (PORT_PIN7、0x03);                         //i2c 模式选择
       PORT_SetPinMode (Porta_PIN6、0x03);                                               //i2c 模式选择

       RCGCI2C |= 1<     I2CMCR (AssignedModuleNum)|= 1 << MasterEnableRegShiftBits;   //使能主位

    /*在前一行之后 ,调试器窗口中的 BUSBUSY 为1 */

       I2CMTPR (AssignedModuleNum)= 0x01;                         //I 之前计算过它

       I2CMSA (1)=0b11010000;
       I2CMDR (1)=PWR_Mgmt_1;
       I2CMCS (1)= 0x03;                                                                               //发送 START 并运行

    /*在前一行之后,仲裁丢失、总线忙和高速使能位在  调试器窗口中显示为被置位*/


       while (get_bit (I2CMCS (1)、0)= 1);  //等待 i2c 模块再次空闲
       I2CMDR (1)= 0x00;
       I2CMCS (1)= 0x05;
       while (get_bit (I2CMCS (1)、0)= 1);  //等待 i2c 模块再次空闲

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

    您好!

    感谢您提供如此详细的回答。   我们的小组将尝试进一步提出建议、但我们将最终提出"主要简化"

    我们的观察结果:

    • 您写道:"在执行这行代码后、BUSBUSY 位被置位、我可以通过调试器窗口看到这一点"

    然而、我们之前写过 、I2CMCR 寄存器描述 建议、在所有12个步骤完成之前、'bususy'可能不会证明是有效的!

    • 您的代码采用"直接注册"格式-(非常)需要(近)总计、"个人注册焦点"。   这带来了更高(更长)的挑战-尤其是当供应商提供了"高度成功、经过验证且强大的 API "时。

    采用"直接注册和/或 ASM 编码"的常见理由是"加快代码执行和/或(或)两者都减小 代码大小"。   也就是说-您的代码是一个简单的初始化序列-这种"优势"没有什么好处。

    当然、该供应商会推荐"使用 API 代码"-我们完全同意。   (尤其是在初始化情况下)

    我们无法判断您的从 I2C 器件是否已正确连接(最好在(SCL 和 SDA)上使用外部上拉电阻器)、如果从器件接受、我们将始终以最慢的速度(100KHz)启动。

    如果时间允许、我们将使用 API 通过 I2C 从设备使用您的 MCU 进行传输-并进行报告。   API 将实现"更快速、更轻松"的方法、以"保证正确的 I2C (和其他外设)初始化!"   (然后、我们将比较/对比 API 的寄存器值与您提供的值。。。)

    使用"DRM"的危险在于:"您处于开拓模式"(没有成功的历史可供您回顾)、许多/大多数"先锋小径"都未铺砌-与"死/流血先锋队"一起乱抛垃圾!    (虽然"API Trails (API 路径)"是原始的黑顶-流量@高速...)   您是否也可以考虑"更好的道路?"

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

    您好、Ahmed、

    如 CB1所述、您应该将 TivaWare 用于此应用。 它将极大地简化这类应用、  并提供了大量有关 Senshub BoosterPack 的 I2C 示例、您可以参考这些示例以开始运行。

    我们不支持在 E2E 上按照 https://e2e.ti.com/support/microcontrollers/other/f/908/t/695568进行 DRM 编程

    如果您无法改用 TivaWare 来简化您的问题并获取 TI 支持、那么我建议您从我们的示例代码中查看 I2C 初始化 API、并研究它们发出的调用和调用顺序。 然后检查 CB1的建议、包括硬件检查。