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.

[参考译文] TMS570LC4357:I2C 写入+读取操作、不带 STOP

Guru**** 2399305 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1341587/tms570lc4357-i2c-write-read-without-stop

器件型号:TMS570LC4357

我们使用的 IC (PCA9654E)在写入命令字节和从寄存器读取结果值之间需要重复的开始条件-不停止-。

这是我为此而调用的代码。 请注意、为了节省空间、我已经在这里删除了等待繁忙总线等的代码。 (当从专门写入或读取总线上字节的函数调用时、这些函数可以正常工作)。

inline int i2cSendGetBytes(uint8_t slaveId, uint32_t out_length, uint8_t *out_data,
                           uint32_t in_length, uint8_t *in_data) {

  i2cBASE_t *i2c = i2cREG1;

  i2cSetMode(i2c, I2C_MASTER | I2C_REPEATMODE);            
  i2cSetSlaveAdd(i2c, slaveId);          
  i2cSetDirection(i2c, I2C_TRANSMITTER);  

  i2cSetStart(i2c);             

  //WaitForTxReady Here

  i2cSend(i2c, out_length, out_data);

  //WaitWhileBusy Here

  //WaitForMasterReady Here
 
  i2cSetMode(i2c, I2C_MASTER);
  i2cSetSlaveAdd(i2c, slaveId);           
  i2cSetDirection(i2c, I2C_RECEIVER);   
  i2cSetCount(i2c, in_length);             

  i2cSetStart(i2c); 

  //WaitForRxReady Here

  i2cReceive(i2c, in_length, in_data);

  // WaitWhileBusy Here

  // WaitForStop here

  //WaitForMasterReady here

  i2cSetStop(i2c);                      

}


这是通用算法吗? 除了读取操作中的0x00、我永远不会得到任何东西。 我怀疑我没有设置模式或状态。

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

    您好、Joe!

    我建议的代码如下:

    inline int i2cSendGetBytes(uint8_t slaveId, uint32_t out_length, uint8_t *out_data,
                               uint32_t in_length, uint8_t *in_data) {
    
      i2cBASE_t *i2c = i2cREG1;
    
      i2cSetMode(i2c, I2C_MASTER | I2C_REPEATMODE);            
      i2cSetSlaveAdd(i2c, slaveId);          
      i2cSetDirection(i2c, I2C_TRANSMITTER);
      i2cSetCount(i2c, out_length);
    
      i2cSetStart(i2c);             
    
      //WaitForTxReady Here
    
      i2cSend(i2c, out_length, out_data);
    
      //WaitWhileBusy Here
      while ( i2cIsBusBusy( i2c ) == TRUE );
    
      //WaitForMasterReady Here
     
      i2cSetMode(i2c, I2C_MASTER);
      i2cSetSlaveAdd(i2c, slaveId);           
      i2cSetDirection(i2c, I2C_RECEIVER);
      i2cSetStop(i2c);    
      i2cSetCount(i2c, in_length);             
    
      i2cSetStart(i2c); 
    
      //WaitForRxReady Here
    
      i2cReceive(i2c, in_length, in_data);
    
      // WaitWhileBusy Here
      while ( i2cIsBusBusy( i2c ) == TRUE );
    
      // WaitForStop here
      while(i2cIsStopDetected(i2c) == 0); 
      
      //Clear Stop condition
      i2cClearSCD( i2cREG2 );
    
      //WaitForMasterReady here                     
    
    }

    --
    谢谢。此致、
    Jagadish。

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

    1.如果我不希望 TX 和 RX 之间有一个停止条件,那么在第25行调用 i2cSetStop()有什么作用?

    2.既然我们处于 REPEATMODE、对 i2sSetCount 的调用不是无用的吗?

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

    您好、Joe!

    2. 由于我们处于 REPEATMODE,对 i2sSetCount 的调用不是无用的吗?

    是否将其配置为 REPEATMODE?

    您的数据不是固定的字节数吗? 您为什么将其配置为重复模式?

    如果您的应用确实需要重复模式、那么您是正确的、I2CCNT 在重复模式下是无用的。

    --
    谢谢。此致、
    Jagadish。