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.

[参考译文] CC2640R2F:传感器控制器 i2c 读取函数、传递寄存器地址而不是值

Guru**** 2571845 points
Other Parts Discussed in Thread: CC2652RB, CC2640R2F, LAUNCHXL-CC2640R2

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1186776/cc2640r2f-sensor-controller-i2c-read-function-passing-register-address-rather-than-value

器件型号:CC2640R2F
主题中讨论的其他部件:CC2652RBLAUNCHXL-CC2640R2

i2cDeviceReadReg8是我正确使用此函数的  

原型:i2cDeviceReadReg8 (#i2cAddr、regAddr8;值8)

从 I2C 器件中具有8位地址的寄存器中读取8位值。

这相当于以下序列:

  • 起始条件(i2cStart()、状态位未清除)
  • 发送 I2C 地址+ W (i2cTx ())
  • 发送8位寄存器地址(i2cTx ())
  • 如果成功:
    • 重复起始条件(i2cRepeatedStart())
    • 发送 I2C 地址+ R (i2cTx ())
    • 接收8位寄存器值(i2cRxNack())
  • 停止条件(i2cStop())

参数值

  • #i2cAddr:I2C 从器件7位地址、向左移位一位([7:1]=地址、[0]=零)
  • regAddr8:寄存器地址

返回值

  • Value8:寄存器值  

在下面、我认为它应该发送器件地址、读取寄存器地址、然后将第三个变量作为读取值存储到要在主程序中读取的输出中



i2cDeviceReadReg8 (BNO055_ADDRESS_ACCELGYRO、BNO055_ACC_DATA_X_LSB;outputBufferAccelXLSB);



U16 eco1;

i2cDeviceReadReg8 (BNO055_address_ACCELGYRO、0x05;eco1);

outputBufferAccelZLSB = eco1;



//安排下一次执行

fwScheduleTask (1);

上述两个函数都从 传感器控制器 RAM 传递第二个变量、而不是应该读取到第三个变量并传递到输出中的值、我做了什么错?



       DataReadSensorController[0]= scifTaskData.readAndSetupBno055.outputBufferAccelXLSB

       DataReadSensorController[1]= scifTaskData.readAndSetupBno055.outputBufferAccelXMSB

       DataReadSensorController[2]= scifTaskData.readAndSetupBno055.outputBufferAccelYLSB

       DataReadSensorController[3]= scifTaskData.readAndSetupBno055.outputBufferAccelYMSB

例如、对于第二个函数、读取的是0x05、而不是该寄存器中的值

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

    您目前的代码设置似乎没有不正确的地方。   "SCS 任务测试"窗口监测 outputBufferAccelXLSB 的值是多少?  如果将 i2cDeviceReadReg8分解为 i2cStart/i2cTx/i2cRepeatedStart/i2cRxNack/i2cStop 命令、代码是否更成功?  此外、您是否能够使用示波器或逻辑分析仪查看 I2C SDA/SCL 线路?  您可以按照"I2C 光传感器"SCS 示例进行操作。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有尝试使用 SCS 任务设置窗口、因为我希望避免这样做。

    我将要打破读寄存器的记录、谢谢

    遗憾的是、很可能无法读取此处的引脚。

    不过、感谢您确认代码正确无误

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    i2cStart();
    i2cTx (I2C_OP_WRITE | BNO055_ADDRESS_ACCELGYRO);
    i2cTx (BNO055_ACC_DATA_X_LSB);
    i2cRepeatedStart();
    i2cTx (I2C_OP_READ | BNO055_ADDRESS_ACCELGYRO);
    i2cRxNack (output.OutputBufferAccelXLSB);
    i2cStop();

     拆分版本的结果相同

    感谢您的其他建议

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这似乎表示 I2C 从器件没有响应。  您是否验证了正确的地址、外部上拉电阻、电压和连接?  您还可以评估修改后 的 I2C TI 驱动 程序示例以进行其他调试。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我之前使用 i2c 进行过通信、地址是为传感器控制器左移一次的位我在思考时是正确的、尽管我在尝试通信时使用了一系列地址、但上拉/电压等在与 CCS 函数结合使用时是绝对正确的

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、第一个函数通过01、第二个函数通过寄存器地址

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BNO055_ADDRESS_ACCELGYRO 的值  应为从器件地址的位7:1、因为它与 I2C_OP_WRITE / READ 进行或运算、表示位0、以构成整个8位地址。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、是的、我现在正在读取寄存器、但是即使是谁是寄存器0x00、我也会得到一个只应为0x01的变化输出

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    i2c 的速度已关闭、感谢您的帮助  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    上面的内容在用于将 cc2652rb 连接到分线板的 Launchpad 上工作、但完全相同的代码(除了如何写入延迟)不适用于连接到分线板的 cc2640r2f、不知道这可能是什么原因?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您在 LAUNCHXL-CC2640R2上观察到什么行为(即它是如何工作的)?  请务必从面向 CC2640R2F 的项目开始。  您可以通过 SCS 帮助文档的简介和迁移部分回顾器件传感器控制器之间的基本差异。

    此致、
    Ryan