主题中讨论的其他器件:HALCOGEN、 TMS570LC4357
大家好、
这是我在社区中的第一篇帖子、因此我要提前感谢大家、欢迎大家为我提供帮助!
我是 MCU 编程的初学者(我以前做过一些 Arduino 和一些 Micropython)以及 TI ARM 相关的东西。
目前、我正在尝试将 Hercules LauchPad 与我放置的一些 I2C 传感器连接、以便从其中获取一些数据。 我更充分的目标是在 Launchpad 上创建一个 FreeRTOS 平台、用于在使用 FlexRay 协议进行通信的公式车的分布式控制系统内进行数据采集、处理和车辆控制(因此、为该项目选择了 LaunchPad TMS570LC43板)。
我认为我几乎阅读了在线找到的每一位文档、但我很难理解 I2C 模块在此板上的工作原理。
我已经设置了 Halcogen 中的所有内容、并且我的项目按照它应有的方式构建和编译、问题是我无法理解如何使用该模块与我的传感器进行通信。
传感器是来自 ST 的 LSM9DSO、它期望通信周期如下所示:
主 ST SAD + W 子部分 数据 SP
从器件 SAK SAK SAK
是:
ST -> Start、SAD -> Slave Address、SAK -> Slave Ack、SUB -> Register SubAddress、SP -> Stop bit
此时、这是我用于发送3个字节数据的代码(写入模式中的从器件地址、从器件寄存器、数据):
//将 i2cREG1设置为主 i2cSetMode (i2cREG1、I2C_MASTER); //将 i2cREG1设置为发送器 件 i2cSetDirection (i2cREG1、I2C_transmitter); //在 i2c1Reg 中设置 slaveAddress // i2cSetSlaveAdd (i2cREG1 、i2cREG1) ;*将 slaveAddress 设置为发送* 1、* 1、i2c1、i2cRemaster3;*。 发送开始 * 2. 在写入模式下发送从器件地址(最后一位为低电平) * 3. 发送从机寄存器以写入 * 4. 发送从机寄存器内容以写入 * 5。 发送停止位 */ i2cSetStart (i2cREG1); i2cSendByte (i2cREG1、slaveAddress); i2cSendByte (i2cREG1、deviceRegister); i2cSendByte (i2cREG1、dataByte); //等待直到总线忙被清除*/ while (i2cIsBusBusy (i2cREG1)=true); //等待直到检测到停止*/ while (i2cIsStopDetected (i2cREG1)=0); //清除 i2cSCG1条件;* i2cClearStop (i2cSCG1)*
代码会编译、当我启动调试会话时、不会发生任何情况、因为程序卡在 i2cSendByte 函数内的这个无限循环中、此循环位于 Halcogen 生成的文件 hl_i2c.c 中
while (((i2c->STR &(UINT32) I2C_TX_INT)== 0U)
这可能意味着该模块无法在总线上发送这些数据、但我不知道原因、因为传感器已正确连接并经过测试、可在另一个电路板上工作。
我不知道如何正确检查这个问题、因为我没有任何 I2Cbus 分析仪或类似工具。
但是、我发现的主要问题是缺少适当的编程文档、以便使这些模块启动并运行。 由于需要创建驱动程序、并且没有用于访问此类器件的简单且足够高的 API、因此我不知道为什么没有任何可突出显示如何使用 I2C、SPI、FlexRay 等 MCU 模块的编程指南、参考或文档。
因此、我并不是说我需要一个涵盖我的特定需求的示例、而是记录这些过程、这样您就能够了解如何与提供其协议的每个器件进行正确通信、这将非常有用。
这足以说明 i2cSetCount、i2cSendBytes、i2c 中断寄存器执行了什么操作、如何发送字节并等待器件的 ACK、或者 i2cRepeatat 模式如何工作。
因此、如果您能够温柔和善良地阐明如何执行这些操作、或者至少提供有关工作原理以及如何使用 TMS570上的 I2C 开发传感器通信的说明、我们将不胜感激。
感谢您的帮助和处置、
最棒的
Giacomo

