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.

[参考译文] EK-TM4C123GXL:如何创建 I2C 延迟?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/991319/ek-tm4c123gxl-how-to-create-an-i2c-delay

器件型号:EK-TM4C123GXL
主题中讨论的其他器件: BOOSTXL-BASSENSORSHDC2010

您好!

我想在 I2C 主设备写入序列之前在代码中创建更长的延迟。 目前、我有以下代码行:

SysCtlDelay(16000000u / 3u);

我认为这是为了产生1秒的延迟、但我不确定这种计算是如何得出的。 如果我想创建更长的延迟、我是否只需更改这些值? 例如、5秒或10秒延迟?

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

    为什么不使 I2C 访问由中断驱动、从而不会在死循环中旋转周期?

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

    我会如何执行此操作? 我在总线上有一个从器件、其中包含我需要写入的数十个子地址。 我正在使用 I2C 模块0和标准模式速度(100Kbps)

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

    为了回答你最初的问题、函数 SysCtlDelay()记录在 TivaWare 中。 典型安装的文档位于:

    C:\ti\TivaWare_C_Series-2.2.0.295\docs\SW-TM4C-DRL-UG-2.2.0.295.pdf

    见497页。

    正如 Andy 指出的、通常情况下、最好每5秒或10秒使用中断来触发重复性任务。 您可以使用系统计时中断(在同一手册的第533页中介绍)或通用计时器。 在以下位置使用计时器的 TivaWare 示例:

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c123gxl\timers

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

    您好、Rob、

    随附的是一个非常高的模块、该模块通过 I2C 设置并读取 HDC2010湿度/温度传感器(在 BOOSTXL-BASSENSORS 板上)。 I2C 传输的详细信息在中断处理程序 HDC2010_I2C_hander()中完成。  

    Init()函数设置 I2C 端口,然后使用一系列 I2C 写入来配置2010。出于测试原因,我读回设置,并读并打印制造商和产品 ID 寄存器。 在每次读取或写入之前、我设置了几个指示操作的标志、然后这里是诀窍:整个 I2C 传输在 ISR 中处理。 我用 MAP_IntTrigger (HDC_I2C_INT)调用 ISR --这是一个很旧的诀窍! ISR 是一个知道该做什么的状态机。 (我将此代码基于 TI 在 sensorlib 中提供的 i2cm_drv.c。) 触发 ISR 后、我只需旋转状态机并查找状态机完成、如设置为 I2C_OP_STOP 的状态所示。

    HDC2010具有一个中断输出引脚 DRDY、该引脚连接到为下降沿中断配置的 GPIO。 在该引脚的中断处理程序中、设置了一个标志。 主程序循环会检查该标志的状态、如果设置了该标志、则会调用_Read湿度 和_ReadTemperature 来获取这些新读数。 在这两个函数中的每一个函数中、我都执行 I2C 事务来读取转换。

    (我应该注意的是、HDC2010支持多字节读取和写入、我将在某个时候实现、但考虑到访问基本上是一个或两个数据字节、这种方法已经足够好了。)

    对于需要十多个左右寄存器写入才能设置的 I2C 扩展器、您可以展开 txbuf[]数组来保存所有寄存器写入数据、修改多个字节的状态机、并让'er rip。 修改状态 I2C_OP_TXDATA 以跟踪剩余的字节数、并将 MAP_I2CMasterControl ()更改为对除最后一个字节之外的所有字节使用 I2C_MASTER_CMD_BURST_SEND_CONT、后者应使用 I2C_MASTER_CMD_BURST_FINISH。

    祝你好运。

     e2e.ti.com/.../hdc2010.c