I2C在LPC824和MMA8453Q之间不起作用

问题描述 投票:0回答:1

对于一个项目,我正在使用NXP的LPC824 MCU,我想通过I2C从加速度计读取数据。该加速度计是MMA8453Q。查看加速度计的数据表,我看到以下内容:

I2C timing

据我所知,这意味着您发出启动信号,写入设备地址,然后在其后写写,得到确认,依此类推。

我必须写的地址如下:adress table

我现在选择的寄存器是0x0D,这是“我是谁”寄存器,应始终将其读取为0x3A。

对于熟悉恩智浦示例的人,我以其中之一为基础。这是我有atm的代码:

*txData = 0x0D;
        SetupXferRecAndExecute(0x1C, txData, 1, rxData, 0);
        SetupXferRecAndExecute(0x1C, txData, 0, rxData, 1);

这就是示波器上的样子scope image

因此,我可以看到我两次发送了设备地址,首先我写了寄存器地址,然后我想读取它,但是它返回了0x00。有人可以帮我吗?预先感谢!

scope accelerometer i2c lpc nxp-microcontroller
1个回答
0
投票

我的答案基于这些数据表:

LPC82X是主设备,MMA8453Q是从设备。

取决于将从站的引脚7设置为高(SA0 = 1)还是低(SA0 = 0),您的7位从站地址为0x1D或0x1C。最终的8位地址与读(1)或写(0)位一起写在注释中发布的表中。对于另一个示例,假设SA0设置为低,表示完整的8位从机地址对于读取为0x3B,对于写入为0x3A。]

假设您要读取单字节寄存器0x17,它是自由落体/运动事件源寄存器。

现在,消息序列(您也显示在帖子中)如下:

  1. 主发送:开始信号
  2. 主机发送:从机地址+写位(在我们的情况下为0x3A)
  3. 从站发送:ACK(由硬件完成)
  4. 主发送:0x17(因为我们假设您对该内容感兴趣注册)
  5. 从站发送:ACK(由硬件完成)
  6. 主发送:重复的开始信号
  7. 主发送:从地址+读位(在我们的情况下为0x3B)
  8. 从站发送:ACK(由硬件完成)
  9. 从站发送:寄存器0x17的内容
  10. 主发送:NACK
  11. 主发送:停止信号
  12. 如果要读取包含两个字节的MMA8453Q之类的寄存器(例如OUT_X_MSB / LSB),则序列如下:

  1. 主发送:开始信号
  2. 主机发送:从机地址+写位(在我们的情况下为0x3A)
  3. 从站发送:ACK(由硬件完成)
  4. 主发送:0x01(因为我们假设您对该寄存器的内容感兴趣)
  5. 从站发送:ACK(由硬件完成)
  6. 主发送:重复的开始信号
  7. 主发送:从地址+读位(在我们的情况下为0x3B)
  8. 从站发送:ACK(由硬件完成)
  9. 从站发送:寄存器0x01的MSB
  10. 主发送:ACK
  11. 从站发送:寄存器0x01的LSB
  12. 主发送:NACK
  13. 从属发送:停止信号
  14. 对于主机,从从机的特定寄存器中请求数据时,预先知道要接收多少字节非常重要。只有这样,主机才能发送适当数量的ACK,然后再发送最后一个NACK,然后发送停止信号。

© www.soinside.com 2019 - 2024. All rights reserved.