对于一个项目,我正在使用NXP的LPC824 MCU,我想通过I2C从加速度计读取数据。该加速度计是MMA8453Q。查看加速度计的数据表,我看到以下内容:
据我所知,这意味着您发出启动信号,写入设备地址,然后在其后写写,得到确认,依此类推。
我现在选择的寄存器是0x0D,这是“我是谁”寄存器,应始终将其读取为0x3A。
对于熟悉恩智浦示例的人,我以其中之一为基础。这是我有atm的代码:
*txData = 0x0D;
SetupXferRecAndExecute(0x1C, txData, 1, rxData, 0);
SetupXferRecAndExecute(0x1C, txData, 0, rxData, 1);
因此,我可以看到我两次发送了设备地址,首先我写了寄存器地址,然后我想读取它,但是它返回了0x00。有人可以帮我吗?预先感谢!
我的答案基于这些数据表:
LPC82X是主设备,MMA8453Q是从设备。
取决于将从站的引脚7设置为高(SA0 = 1)还是低(SA0 = 0),您的7位从站地址为0x1D或0x1C。最终的8位地址与读(1)或写(0)位一起写在注释中发布的表中。对于另一个示例,假设SA0设置为低,表示完整的8位从机地址对于读取为0x3B,对于写入为0x3A。]
假设您要读取单字节寄存器0x17,它是自由落体/运动事件源寄存器。
现在,消息序列(您也显示在帖子中)如下:
如果要读取包含两个字节的MMA8453Q之类的寄存器(例如OUT_X_MSB / LSB),则序列如下:
对于主机,从从机的特定寄存器中请求数据时,预先知道要接收多少字节非常重要。只有这样,主机才能发送适当数量的ACK,然后再发送最后一个NACK,然后发送停止信号。