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.

[参考译文] RM46L852:I2C 通信-我需要编码方面的帮助

Guru**** 2393725 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/759937/rm46l852-i2c-communication---i-need-help-with-coding

器件型号:RM46L852
主题中讨论的其他器件:HALCOGEN

您好!

我对使用 I2C 通信(代码)有疑问

我在查看示例、并尝试编写自己的代码。


的从器件地址0x29、在我能够读取之前、我需要设置寄存器:atime、WTIME、ENABLE、CONTROL、CONFIG of the sensor (TCS34725)。

因此、我已经完成了以下操作:

i2cSetSlaveAdd (i2cREG1、0x29);
i2cSetDirection (i2cREG1、I2C_transmitter);

对于(Repeat = 0;Repeat < 2;+Repeat){
i2cSetCount (i2cREG1、2);
i2cSetMode (i2cREG1、I2C_MASTER);
i2cSetStop (i2cREG1);
i2cSetStart (i2cREG1);
i2cSend (i2cREG1、2、transmit、w_atime);

while (i2cIsBusBusy (i2cREG1))

while (!i2cIsStopDetected (i2cREG1))(while (!i2cIsStopDetected (i2cREG1))

i2cClearSCD (i2cREG1);
对于(延迟= 0;延迟< 210;+延迟)

这只是一个片段。 第一次与 atime reg 通信时、接下来是循环、我将与 WTIME 通信、以此类推。

在此代码中,我发送 了 Transmit _w_atime [2] = { 0x01,  0xC0 },它们是 atime 寄存器的地址,第二个是我要在 atime 寄存器中写入的内容(这是正确的方法吗?)


我还有以下问题:

  1. 是否有更快的方法一次性发送数据? 同时与所有五个寄存器进行通信并向它们中的每个寄存器发送适当的数据?
  2. 我们为什么要使用 for (REPEAT = 0;REPEAT < 2;+REPEAT)循环?
  3. 当我想从寄存器中读取数据时,如何在 i2cReceive() 函数中指定要从中读取的寄存器,以及在哪个变量中存储我的值?

谢谢!

Marc

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Marc、
    根据 TCS3472器件的 I2C 协议(器件数据表的图23,从以下网址下载: ams.com/.../TCS3472_DS000390_2-00.pdf )和命令寄存器的说明,如果寄存器具有连续地址,您可以设置多个寄存器。
    您可以使用 i2cSend (i2cBASE-t * i2c、uint32 length、uint8 * data)函数发送多个字节。 在发送字节之前、您应该考虑从器件的连续寄存器地址、以适当的顺序初始化数据。
    您不需要(REPEAT = 0;REPEAT < 2;+REPEAT)循环。 通过这种方式、您将发送数据两次。
    I2C 读取实际上是 I2C 写入、后跟 I2C 读取。 如果发出读取命令、则前一条命令的寄存器地址将用于数据访问。

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

    感谢您的回复! )

    我没有 I2C 通信方面的经验、这是我尝试设置 I2C 通信的项目、那么、您是否介意我刚才要求验证我是否正确理解了您? )

    在发送每个数据包之前、我应该写入:

    i2cSetSlaveAdd (i2cREG1、SLAVE_ADDRESS);
    i2cSetDirection (i2cREG1、I2C_transmitter);

    或者在接收时、i2cSetDirection 中的 I2C_RECEIVER?

    然后、我使用:
    i2cSetCount (i2cREG1、长度);
    i2cSetMode (i2cREG1、I2C_MASTER);
    i2cSetStop (i2cREG1);
    i2cSetStart (i2cREG1);
    i2cSend (i2cREG1、length、some 阵列);

    该值长度是我有多少数据? 因此、如果我有 ADDRESS_2_REG 和 value_2_REG、那么我将写入 #define 长度2、或者在地址、数据、地址、数据、地址、 数据、我会写入 #define length 6、对吧?

    是否可以发送到 i2cSend 函数、如 i2cSend (i2cREG1、length、{ value_1、value_2、...、 value_n });不必事先将它们存储在 se_array 中?

    您能否帮助我确定的值(延迟= 0;延迟< 1000;+delay);等待时间循环? 老实说,我不知道如何做到这一点。

    我正在阅读您发送给我的数据表,但从图23中我认为我需要发送写、读、写、读... 组合。 那么、我可以进行写入、写入、写入? 还是读取、读取、读取?

    我不确定我是否理解了您对接收信息的解释、因此我能否尝试使用示例来查看我是否正确理解了您?

    当我写入 i2cReceive 时、我将使用 se_array:

    i2cReceive (i2cREG1、2、some 阵列);

    那个 some 数组被定义为{0x16、read_red}?
    我是否要发送寄存器地址、从该地址读取值为第一个值、然后发送变量、将该值存储为下一个值?

    从该寄存器读取红色是只读寄存器、因此我不确定这是否正确。

    此外、出于好奇、在 i2c 示例中、存在:
    asm (" nop");
    asm (" nop");
    asm (" nop");
    说明。 他们是从事什么工作? 我需要它们吗? 有多少?在哪里?

    很抱歉让您对此感到不安。 我是初学者、我想了解如何使用 I2C 外设(我对这方面的知识不是很了解)、因为我想使用 TI Hercules RM 控制器来实施一些项目。

    非常感谢您、
    Marc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    要在寄存器中写入数据、应执行以下操作:
    -您应发出 i2c 写入(带有适当的从地址),后跟寄存器地址和1个或多个字节的数据;
    要读取数据、您可以执行以下操作:
    1.发出 i2c 读取(具有适当的从器件地址)。 接收器将重新接收到您所指的尽可能多的数据。 要读取的第一个寄存器的地址将是您之前操作中使用的最后一个寄存器的地址。
    2.发出 i2c 写入(具有适当的从器件地址)、后跟寄存器地址。 然后发出 i2c 读取(使用适当的从器件地址)。 在这种情况下、将读取的第一个寄存器是紧随 i2c 写入的寄存器。

    以下代码写入3个字节:
    i2cSetSlaveAdd (i2cREG1、slave_address);
    i2cSetDirection (i2cREG1、I2C_transmitter);
    i2cSetCount (i2cREG1、3);
    i2cSetMode (i2cREG1、I2C_MASTER);
    i2cSetStop (i2cREG1);
    i2cSetStart (i2cREG1);
    i2cSend (i2cREG1、3、Init_TX);//具有3个字节的数组
    while (i2cIsBusy (i2cREG1)=true);
    while (i2cIsStopDetected (i2cREG1)=0);
    i2cClearSCD (i2cREG1);

    如果要使用 HALCoGen 生成的 API、数据必须位于数组中。

    以下代码将读取3个字节:
    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG1、SLAVE_ADDRESS);
    /*将方向设置为发送器*/
    i2cSetDirection (i2cREG1、I2C_transmitter);
    /*配置数据计数*/
    i2cSetCount (i2cREG1、1);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG1、I2C_MASTER);
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG1);
    /*发送开始条件*/
    i2cSetStart (i2cREG1);
    /*轮询模式下的传输数据数量*/
    i2cSendByte (i2cREG1、FIRST_REGISTER_TO_READ_ADDRESS);
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG1)=true);
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG1)=0);
    /*清除停止条件*/
    i2cClearSCD (i2cREG1);

    while (i2cIsMasterReady (i2cREG1)!= true);

    /*将方向设置为接收器*/
    i2cSetDirection (i2cREG1、I2C_RECEIVER);
    /*配置数据计数*/
    i2cSetCount (i2cREG1、3);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG1、I2C_MASTER);
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG1);
    /*发送开始条件*/
    i2cSetStart (i2cREG1);

    /*轮询模式下发送的数据数量*/
    i2cReceive (i2cREG1、3、(uint8 *) time);
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG1)=true);
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG1)=0);
    /*清除停止条件*/
    i2cClearSCD (i2cREG1);

    while (i2cIsMasterReady (i2cREG1)!= true);

    以下代码只是为了增加延迟。 NOP 表示"无操作"。
    asm (" nop");

    请查看 HALCoGen 安装文件夹下的"example_i2c_pcf8570.c"。

    希望这对您有所帮助。

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

    这很有帮助! )