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.
我将 STM LIS3DSH 加速计与 TM4C1294开发板配合使用、与 I2C 模块2通信。 LIS3DSH 有一个"谁是 i"寄存器、在该寄存器中、当被查询时、它返回一个特定的字节值。 在使用标准外设库进行通信时、我让它返回正确的字节、但在将代码移动到函数时、它不再返回正确的字节值、因此我发现 I2C 通信存在一些时序/配置问题。
经过长时间的闲置、无法使事情正常工作、我决定走另一条路:绕过标准外设库、直接从寄存器读取/写入、以查看我是否可以更深入地了解问题。 为此、我按照 TM4C1294NCPDT 数据表第18.4.1节中的"初始化和配置"说明、针对"将 I2C 模块配置为以主机身份传输单个字节"进行了操作。
然后、为了读取数据、我遵循了 TM4C1294NCPDT 数据表第18.3.6.1节中的"主单次接收"流程图。 但运气不好。 我没有得到加速计返回的预期字节、我在读取 I2C2数据寄存器时只得到一个零值。 我已验证我也没有在状态寄存器中收到错误。
我已三重检查我的代码。 我想知道、是否有人愿意再用一双眼睛来审查我的规范和/或提出任何建议。 它非常简短、评论很好、我非常感谢您的任何帮助。 我已经附加了代码、它只是一个 main.c 文件。
提前感谢、
Terence
Ralph -感谢您的回复。 回到利用 TivaWare 外设驱动程序库的半工作示例是个好问题。 我有一个完美的示例。 请参阅随附的代码。 它的注释很好、相当短、应该非常简单-它只将一个字节写入加速计、然后读取一个字节。 这是 main.c 调用的、我将代码放入一个无限循环、这样我就可以看到、当它不断读取加速计的"我是谁?"时、会发生什么情况 寄存器(寄存器0x0F)。
如前所述、"我是谁?" 加速计的寄存 器只需返回一个字节(0x3F)进行识别。
那么、这里有趣的是:当我添加一个计数器来计数错误的值(代码行21和74-77)时、从加速计读取一个不正确(但一致)的值。 但是、当我注释掉第21行和第74-77行时、从加速计读取正确的值。 这显示在所附的图像中(见下面)、在这里我查看100个元素数组的存储器、并将值保存在中。
是否有任何想法、问题可能是什么?
您好 Ralph -感谢您指出我的错误。 正确的、将 I2C 的初始化和配置置于循环中是我的疏忽。 我的错误。 此外,在将代码复制并粘贴到先前附加的文件时,我必须丢失 I2CMasterSlaveAddrSet()函数中的"i"。
我有一个改进版本、在查询"我是谁?"时、获取不正确的值仍然存在相同的问题 寄存器中的值。 附加了此代码(main.c 中的整个程序)-这次不复制和粘贴。
此外、这次我使用了#defines (多工作示例与 多失败示例)。 通过查看随附的代码、您将看到工作版本只是无限期循环 I2C 调用以获取值、而失败的示例也会执行相同的操作、但调用返回值的函数。
以下是两种情况(工作和故障)的变量和存储器值的屏幕截图。
如果您对问题有任何想法、我们将不胜感激。
尊敬的 Terence:
关于 I2C、它不是双向的。 它可以处理多个器件、但所有通信都是单端的、因为只有一条数据线、因此不能是双向的。
编辑:哇,很抱歉,但我在最初的帖子中有一个重大的心理失误,我想是全双工还是半双工。 是的、I2C 是双向的。 因此、是的、您应该在 SDA 线上看到从器件数据。
您应该会在 I2C 线路上看到预期的结果。 在工作示例中、您在 TM4C 器件上获得了正确的结果、但您在 I2C 线路上看不到它? 如果是、您的实验工具是否配置为正确识别从器件的应答? 这是我在这方面唯一能想到的东西。
尊敬的 Terence:
我编辑了我之前的帖子、以修复因精神失常而产生的错误信息、请阅读编辑内容、抱歉!
如果您使用一些高电阻值、请尝试更改为 I2C 线路上的4.7K 电阻器。 此外、在命令之间添加延迟不会有任何影响、我不确定 while (I2CMasterBusy (I2C2_base))是否尊重您的器件时序...我的 MPU6050有类似的问题。
我稍后将检查我是否可以为我的 MPU6050代码提供帮助。
海尔德-我不确定"在 I2C 线路上更改为4.7K"是什么意思。 您能详细说明吗? 我已经尝试了一些添加各种延迟(具有各种值的 SysCtlDelay 调用)、但没有找到始终有效的帮助。 但是、我有一些详细信息:
我扩展了我的示例代码(随附)、以查询多个寄存器、并使用 UART 将它们报告给终端(下面的屏幕截图)。 从终端程序中可以看出、软件读取的值因迭代而异。 我预计将为"谁是我"获取0x3F、为"Info1"获取0x21、为"状态"获取0x0F。 根据显示的内容(在 Putty 终端屏幕截图中)、看起来我在不正确的时间读取数据寄存器...
有趣的是、我使用逻辑分析仪观察到的结果始终一致(下面的屏幕截图)。 我捕获了许多 I2C 通信实例、始终如下面的屏幕截图所示。 我始终会看到"WHO I "和"Info1"的预期0x3F 和0x21值、并且始终会看到"STATUS"的0x00。 虽然我希望看到0x0F 的状态、但0x00可能是一个有效值。
如果有人对可能发生的情况有任何想法、我非常感谢您的反馈。 谢谢你。
[引用 user="Terence D"]
海尔德-我不确定"在 I2C 线路上更改为4.7K"是什么意思。 您能详细说明吗?
[/报价]
我的意思是 SCL 和 SDA 线路上的上拉电阻器可能有点过高(导致时序问题)、假设您不使用已包含适当电阻器的预组装模块。
[报价用户="Helder Sales"]
Terence D海尔德-我不确定"在 I2C 线路上更改为4.7K"是什么意思。 您能详细说明吗?
我的意思是 SCL 和 SDA 线路上的上拉电阻器可能有点过高(导致时序问题)、假设您不使用已包含适当电阻器的预组装模块。
[/报价]
很抱歉、我仍然不关注。 您是否建议在 Tiva 板和加速计的连接之间物理上添加一个4.7K 电阻器、或者在配置 PL0/PL1 I2C 通信时、这是一个我可以通过 TivaWare 外设库访问的设置?
您似乎已经"设置"了"保存 I2C 寄存器地址(至少是第三个地址)"。 我已将您(可疑)的问题置于重点位置。
请注意、您已经寻址了寄存器0x27 -难道不是寄存器0x0E -目标更明确吗? "正确的寄存器序列"不应该 是: "0x0F、0x0D、0x0E?" 对这一索赔的支持如下:
请允许我的公司和我恭敬地"同意"供应商代理的建议... 使用另一个器件? 公司/我(早就发现)此类器件处于/接近"同类最佳"状态-当(真正)遵循"详细数据手册"时。
也请注意-该数据表的建议:
'LIS3DSH 具有数据就绪信号(DRDY)、指示何时有一组新的测量加速度数据可用、从而简化了使用器件的数字系统中的数据同步。 如果需要、您是否使用了启用最大传输速度的"RDY"信号、这是未知的。。。"
"低值上拉"的建议-我的书中失败了-因为"大量数据"正确到达! 当然-存在"严重"寄存器寻址错误。 (所有事实都必须被吸收-然后称重!)
该器件可在"pro Designed & implemented"评估板上使用。 使用此类细间距器件时、经验不足的用户(非常)不太可能成功-当"手工组装!"
而且-是否"不"需要注意-至少是这样 问题的解决方案 添加到您的帖子主题:"I2C 说明-来自数据表!" (像讽刺...)
您好 Ralph、
正如您所知-我已继续-这里有"非常感激"(即有点感激)的狩猎场地。 我对您的写入内容的快速扫描锁定在"另一个设备"上。
我想指出,他的“谁是我”命令是正确的——这是一个错误的第三个登记地址(正如我刚才详述的),它有缺陷,而且可能会“扰乱系统”。
还有一个强大的'DRDY'信号-这证明了它有很大的价值...
海报的问题几乎肯定是... (笑声) “违反 kiss”-“非常关注细节”(W曾),这是必需的-他的逻辑分析仪演示显示出了一个明显的错误! 和... 当器件"复杂"且性能高时-与此一样-在任何(不同)器件中都可能出现某些"特殊"注意/处理指南-不太可能"重叠"。 例如-海报器件的数据表建议严格-"开始-停止"和/或"字节间传输"时序规范-(其他) I2C 器件不太可能与之媲美...
我非常有信心地说、您的 TM4C 在任何海报的"非正常数据收集"责任方面都"完全脱机"。 高芯片堆栈基于这一点、即"系统问题"-由 "未完全注意或遵守-所需的系统详细信息"引起的"系统问题"! 正如我经常提到的(和同样离世的罗伯特一起),“太阳与月亮”并不总是出现在这里。。。 具有 MCU...
这种情况只能通过海报设备数据手册的"kiss"(kiss)和完整/正确的读取/吸收...
好消息:我似乎已经正常工作了、尽管它不是非常优雅。 简而言之、写入时我使用突发命令(即使我只需要写入一个字节)。 读取时、我执行 I2C_MASTER_CMD_BURST_SEND_START (即使我只读取一个字节)、然后执行 I2C_MASTER_CMD_SINGLE_Receive。 我在连续读取/写入时会有一些额外的时间延迟、因为没有这些延迟、我的逻辑分析仪显示了总线错误。
[引用 USER="CB1_MOBILE"]
您似乎已经"设置"了"保存 I2C 寄存器地址(至少是第三个地址)"。 请注意、您已经寻址了寄存器0x27 -难道不是寄存器0x0E -目标更明确吗? "正确的寄存器序列"不应该 是: "0x0F、0x0D、0x0E?"
[/报价]
CB1 -很好地得到你的回应! 我以100%的诚意说这句话:在我参加的所有论坛中,你是我最喜欢的其他参与者之一。 但是、我很遗憾地通知您、我相信您对第三个寄存器错误了。 正如我在上一篇文章中提到的、我有兴趣阅读状态寄存器、它确实是0x27。 0x0E 不是我感兴趣的、因为它只是包含一个0值。
[引用 USER="CB1_MOBILE"]
也请注意-该数据表的建议:
'LIS3DSH 具有数据就绪信号(DRDY)、指示何时有一组新的测量加速度数据可用、从而简化了使用器件的数字系统中的数据同步。 如果需要、您是否使用了启用最大传输速度的"RDY"信号、这是未知的。。。"
[/报价]
谢谢你。 这是一个很好的建议、我将在完成此帖子后立即研究。 但是、在继续之前、我确实希望加速计以最基本的方式工作... 所幸的是、我现在已经实现了这一点。
[引用 USER="CB1_MOBILE"]
而且-是否"不"需要注意-至少是这样 问题的解决方案 添加到您的帖子主题:"I2C 说明-来自数据表!" (像讽刺...)
[/报价]
是的。 我在这里没有争论。 这条线程让我们的旅程变得更加漫长。 如果回头看开头、您会看到我尝试按照直接的数据表 I2C 指令来更好地了解问题(而不是使用 TivaWare Std Peripheral Lib)。 我将会看到我是否可以更改线程标题、认为我不能更改、但我会尝试。
干杯男士! 感谢您的帮助!
谢谢,Terence。。。 你的很好…… 非常感谢、友好的话语。 看起来“我的天使”是(这个人) 不是... 第一次……
我相信您的传感器选择是一流的-这些相当特殊的器件特性-以及'DRDY'信号证明:
我相信(甚至)对以下器件章节(5.1.1)的进一步"重新阅读/回顾"将促进您的解决方案-接近(接近)优雅! (如果不是那么完美,优雅!)
5.1.1 I2C 操作:
"从器件地址由一个读/写位完成。 如果该位为‘1’(读取),则必须在两个子地址字节之后发出重复起始(SR)条件;如果该位为‘0’(写入),则主器件向从器件发送的方向保持不变。” 器件手册(非常)第23/24页的图示和详细信息... (始终帮助我)
再次感谢您的友好话语和坚定/我祝愿您取得巨大成功...
[引用 USER="CB1_MOBILE"]
我相信(甚至)对以下器件章节(5.1.1)的进一步"重新阅读/回顾"将促进您的解决方案-接近(接近)优雅! (如果不是那么完美,优雅!)
5.1.1 I2C 操作:
"从器件地址由一个读/写位完成。 如果该位为‘1’(读取),则必须在两个子地址字节之后发出重复起始(SR)条件;如果该位为‘0’(写入),则主器件向从器件发送的方向保持不变。” 器件手册(非常)第23/24页的图示和详细信息... (始终帮助我)
[/报价]
先生,你是对的。 我现在正在执行加速计寄存器的"突发读取"、以接收全部六个字节的数据(3个轴、每个轴的高/低字节)。 使用 I2C"快速模式"、这需要大约375微秒、而每次读取一个寄存器的所有6个字节数据的时间超过1.5毫秒。
[引用 USER="CB1_MOBILE"]
我相信您的传感器选择是一流的-这些相当特殊的器件功能-以及'DRDY'信号
[/报价]
对于我的用例、我看不到 DRDY 选项中的值-可能我正在寻找什么? 我将解释我的用例:我希望定期-每50毫秒-检查加速计的位置、并使用最新的加速计 x、y、z 值执行一些计算。 那么、我每50毫秒发生一次计时器中断。 在中断开始时、我读取加速计位置、然后执行上述计算。
我已通过将 CTRL_REG4的高4位设置为0110b 将输出数据速率设置为100Hz。 最坏情况下、我的加速计值为10毫秒、这在我的要求范围内。
我在这里看不到 DRDY 将如何帮助我、因为它不允许我获得比当前方法更多的最新加速计读数、此外、它将每10毫秒发生一次中断、每个中断使用~375微秒读取值、我仅使用20%的时间。
请注意、除了上述加速计计算之外、还有其他处理、我更希望不使用加速计读数中断、该读数通常(80%的时间)为无值。
我缺少什么吗?
[报价用户="Terence D"]对于我的用例,我看不到 DRDY 选项中的值-可能我正在寻找什么?
我将尝试、"针对使用'RDY:'的问题提出问题:"
虽然我的公司和我都没有使用过这个特定的器件、但在这种"三轴加速数据"的捕获中存在"多个用例"、其速率远高于100Hz! 振动检测、机器不平衡、电机轴承磨损-所有这些都立即到达。
还有更多-如果您阅读/查看此领域的产品规格-生产商业"实用"产品-(极)怀疑(任何)将会降低其100Hz 更新速率!
有 ARM MCU 以50%的增加系统时钟(及更高频率)运行、能够更好地满足"高级传感器"对 MCU 的"增加需求"。 将此类"基于性能的传感器"与 "强制实现此类折衷"的 MCU 配合使用是否明智?
* 根据传感器手册(第39页,Cntl 4寄存器):当激活 BDU (BDU =‘1’)时,输出寄存器的内容不会更新,直到读取 MSB 和 LSB,从而避免读取与不同采样时间相关的值。 使用 DRDY 可防止此类不幸... 也许更加色彩鲜艳-允许 MCU "调用传感器读取照片"(在对"数据就绪性"视而不见时/在不了解时)-证明"不远"一个"盲人询问另一个"(因此造成)... "嗨、Buddy -可以安全地穿鞋吗?"
虽然您现在已经发展(看起来)足够了-我更喜欢看到您的辛勤工作和努力在未来很长的时间内获得更高绩效的回报-这可能是"重复使用"的。 “ 策略性地一次” -然后 “立即部署”... 如何... 您找到了-然后将 Tech 公司 公开!
请注意-我已退出此论坛-如果您希望继续-请"启用对话"(通过论坛的注册页面)、以便我们可以通过"PM"进行交流。
同样、您的友好话语也受到了赞赏、甚至您的"设计"也得到了认可、在这里已经有所缓解(可能会有所缓解)。。。。 (短期和/或妥协的"解决方案"-证明"不太可能"激发...)