主题中讨论的其他器件: MSPWARE
大家好、
我一直在使用 MSP430F5529和 LSM6DS33分接传感器( 数据表)开发定制 PCB。 我使用 Arduino Mega 和 SparkFun 库(GitHub 库)测试了该传感器。 接下来、我尝试使用 MSP430的 USCI I2C 外设从该传感器读取数据。 我已经阅读并检查 了用户指南 和 MSPWARE 3.60.00.10示例。 我尝试将这些示例混合在一起以编写一个函数、该函数将从传感器读取多达12个连续寄存器。 但是、代码会一直等待 TX 缓冲区完成将字节(目标寄存器)移入外设。 我不知道为什么。
首先、我初始化 I2C 外设:
//将引脚3.0和3.1设置为 I2C P3SEL |= 0x03; //配置前复位 USCI UCB0CTL1 |= UCSWRST; //将 USCI 设置为 I2C 主模式并将 MSB 置1 UCB0CTL0 |= UCMST | UCMODE_3 | UCSYNC | UCMSB; //设置波特率1MHz/10 = 100kHz UCB0BR0 = 10; UCB0BR1 = 0; //设置时钟源,启用 I2C UCB0CTL1 |= UCSSEL_2; //禁用中断请求 UCB0IE &=~(UCTXIE + UCRXIE); //保存从机地址 UCB0I2CSA = 0x6A;
//启用 I2C 模块 UCB0CTL1 &=~UCSWRST;
>>假设:当添加 R/W 位时、从地址被外设向左移动一位。
接下来、我尝试按照 LSM6DS33数据表第30页的表15所述协议向从器件发送一个包含地址的字节。 根据用户指南、UCTXIFG 位将在从器件地址被发送后置位、以指示 UCB0TXBUF 已准备好接收一个字节。 然后、我将数据写入 UCB0TXBUF 并等待 UCTXIFG 位再次置位。 之后、必须再次发送"重复启动"、告知从机需要向我发送数据。
//发送启动条件。 UCB0CTL1 |= UCTR + UCTXSTT; //等待开始条件被发送。 while (!(UCB0IFG & UCTXIFG)){;} //将字节写入传输缓冲区 UCB0TXBUF = 0x28; //等待数据被发送。 while (!(UCB0IFG & UCTXIFG)){;} //开始接收 n 个字节 //发送重复启动条件 UCB0CTL1 &=~UCTR; UCB0CTL1 |= UCTXSTT;
然而、代码在数据被写入 UCB0TXBUF 后就会卡在第二个 while 环路中。
尝试的解决方案和其他信息:
- 在 SDA 和 SCL 线路上添加外部上拉电阻;它们已经在分接板上(电路原理图)、因此无论如何都不必要。
- 使能中断(我假定不管是否产生中断、UCB0IFG 中的相应位都被置位)。
- 检查连接、PCB 和焊料误差(也测得3.27 VCC 稳定值)。
- SDO 被焊接到接地上(使从器件地址的 LSB 为'0')。
- 写入 UCB0TXBUF 后添加一个 UCSCLLOW 检查;没有外部器件将 SCL 拉至低电平。
遗憾的是、我没有示波器或数字分析仪。 我可能可以在下周借用一个、然后我可以添加 SDA 和 SCL 的信号图像。 目前、我需要知道:
- 我的代码是否正确? 它不提供构建错误/警告。
- 我的代码是否完整? 我可能忽略了一些关键的设置/中断/寄存器值。
- 硬件上是否有其他可能导致问题的东西?
任何帮助、见解、建议、设计技巧、代码技巧、 我们感谢您提供有用的链接或代码测试。 如有需要,我会乐意提供更多详情。 这是我开始工作所需的最后一段代码;之后、我最终可以完成演示并毕业...
此致、
Martin Janse