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.
工具与软件:
您好!
我尝试使用 I2C 总线与目标进行通信、但我需要澄清一些奇怪的内容。
如何使用 I2C 从目标器件读取字节:发送启动、发送器件地址(写入)、接收确认、发送寄存器地址、接收确认、发送重复启动、 发送器件地址(读取)、接收确认、接收字节、发送 NACK、发送停止。
从 driverlib 的角度来看、我要使用来设置此事务、DL_I2C_startControllerTransferAdvanced(I2C_ACCELEROMETER_INST,writeAddress,DL_I2C_CONTROLLER_DIRECTION_TX,0x01,DL_I2C_CONTROLLER_START_ENABLE,DL_I2C_CONTROLLER_STOP_DISABLE,DL_I2C_CONTROLLER_ACK_ENABLE),
但没有得到回复。 通过分析总线、我发现仍然发送了停止条件:
我采用了 MSPM0 SDK 2.02.00.05中提供的 i2c 轮询示例。
目标器件是 NXP 的 FXLS8964AF ( 在此评估板上)。
您将收到 NACK、以便 I2C 单元自动终止事务。 根据 FXLS8964AF 数据表(版本3.4)第12.1节、其 I2C 地址为0x18 (如果 SA0=1、则为0x19)。
未经请求:在大多数情况下、这样一个分段交易可使用 RD_ON_TXEMPTY 特性来完成(减少麻烦)。 [参考 TRM (SLAU847D)第 21.2.4.1.3节]
简要:
1) 1)启用该功能:
DL_I2C_resetControllerTransfer(I2C_INST); // Set MCTR=0 to avoid enableControllerReadOnTXEmpty hazard DL_I2C_enableControllerReadOnTXEmpty(I2C_INST); // Write then read
2) 2)将寄存器地址写入 Tx FIFO
3) 3)使用 DL_I2C_startControllerTransfer ()执行 Rx 事务[不要将 Tx FIFO 内容计入长度]
4) 4)禁用功能[我不确定这是需要的、但似乎是正确的]
[与上述内容相同、但使用 DL_I2C_disableControllerReadOnTXEmpty ()]
DL_I2C_resetControllerTransfer(I2C_INST); // Set MCTR=0 to avoid disableControllerReadOnTXEmpty hazard DL_I2C_disableControllerReadOnTXEmpty(I2C_INST); // Turn off Repeated Start feature
[编辑:插入(4)的代码、因为 E2E 在(?)之前不允许这样做]
尊敬的 Daniele:
Bruce 的解决方案应该能帮助您解决这个停止条件。 我还建议下载并安装最新版本的 SDK。
此致、
Diego Abad
Bruce、您好!
我误解了 API、因此我传递了已设置 R/W 标志的8位地址。
建议的功能运行正常、我刚刚在 DL_I2C_startControllerTransfer 调用和后续 DL_I2C_receiveControllerData 调用之间添加了一个等待周期、否则我会错过读取的字节。
非常感谢您的支持!!