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.

[参考译文] BQ32002:I2C_Read 未提供预期值

Guru**** 2582405 points
Other Parts Discussed in Thread: BQ32002

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/725499/bq32002-i2c_read-not-giving-expected-value

器件型号:BQ32002

大家好、

我使用 CC3220MODASF 来连接 BQ32002。 在数据表中、我在 RTC 的读取模式下遇到了以下问题

我将像这样传递 I2C 事务 API 的参数

txBufferRtc[0]=年;
// txBufferRtc[1]=月;
// txBufferRtc[2]=年;

i2cTransactionRTC.slaveAddress = RTC_address;//0x68
i2cTransactionRTC.writeBuf = txBufferRtc;
i2cTransactionRTC.writeCount = 1;//sizeof (txBufferRtc);
i2cTransactionRTC.readBuf = rxBufferRtc;
i2cTransactionRTC.ReadCount = sizeof (rxBufferRtc);//10

for (i = 0;i < 20;i++)
{

// I2C_transfer (i2c、&i2cTransactionEEPROM);
I2C_transfer (i2c、&i2cTransactionRTC);


// 电阻=(rxBufferDPot[0]*1000000/256)+ 60;
/*睡眠1秒*/
睡眠(1);
}


/*已取消初始化 I2C */
I2C_Close (i2c); 

假设我要读取年份、我已经在从器件地址0x06之后输入了相应的寄存器。 但是、我没有得到任何值(输出中为0)。 在此读取模式下、这是否意味着在从器件地址和子地址之后、我们必须再次生成起始条件和从器件地址、然后才能从寄存器中读取?

这确实令人困惑。 请帮助

BR

Shubhankar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对、回答您的问题。 确保您的 I2C 读取传输与数据表第7.5.1节中的图6和说明相匹配。 我建议使用示波器或协议分析器在 IC 引脚探测 SDA/SCL 信号、并确认传输符合数据表中的时序要求。

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

    你好、Alan

    感谢您的回复。 因此、我取得了一些进展、但我在解释 readBuffer 数据时遇到了困难。 请看一下我在答复中附加的图片。

    我有显示的读缓冲器值。 看起来 (秒寄存器)是22或0x16、分钟寄存器是240或 xF0、小时数是255 XFF 等等

    请注意、这些是 RTC 的默认读取值。 我没有连接备用电源、因此当我关闭电源时、RTC 会关闭并进入其中的默认设置。

    我最怀疑的是以下几点:

    他们说分钟是一个7位寄存器。 10_minute 的有效值为0到5。 而1_MINUTE 有0至9。 但是、这里的分钟是0xF0。 它不遵循规则。

    数据表显示年份寄存器为8位。 10_Year 为0至9、1_Year 也是如此。 在这里、rxBufferRtc[6]中的年份是 XFF。 这也不符合规则。

    我是不是解释错误的、还是因为 RTC 首次通电、这些只是随机值在 RTC 启动时出现、因此它们可能是在工厂模式下馈送的虚值?

    请提供建议

    BR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、给定"X"的任何寄存器位的复位值意味着读取的初始值可以是随机的。

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

    你好、Alan

    是的、谢谢您的阅读不关心、因此我的阅读效果完美、并且值也相应更新。

    但是、我现在遇到了写入问题。 这是我的代码以及我要附加的图片。 我首先尝试写入所有寄存器。 但是、现在我仅用几秒钟的时间尝试。 但是、在0位置处的数组中、值会更新、秒值会超过60。 这是怎么可能的? 我将写入数据表中所示的10s 位置和1s 位置。 请解释数据是如何写入 RTC 的。 数据表中没有提供大量信息。

    #define seconds 0x00
    
    struct seconds
    {
    uint8_t seconds_10;
    uint8_t seconds_1;
    }秒;
    
    void readRtc()
    {
    TxBufferReadRtc[0]= 秒;
    i2cTransactionRTC.slaveAddress = RTC_address;
    i2cTransactionRTC.writeBuf = txBufferReadRtc;
    i2cTransactionRTC.writeCount = 1;
    i2cTransactionRTC.readBuf = rxBufferReadRtc;
    i2cTransactionRTC.ReadCount = sizeof (rxBufferReadRtc);
    
    i2C_transfer (i2c、&i2cTransactionRTC);
    
    return;
    }
    
    void writeRtcSeconds ()
    {
    Second.seconds_10 = 0x04;
    Second.seconds_1 = 0x05;
    i2cTransactionRTC.slaveAddress = RTC_address;
    i2cTransactionRTC.writeBuf =秒(&S);
    i2cTransactionRTC.writeCount = sizeof (秒);
    
    i2C_transfer (i2c、&i2cTransactionRTC);
    return;
    }
    
    void * mainThread (void * arg0)
    {
    对于(I = 0;I < 20;I++)
    {
    
    睡眠(1);
    
    writeRtcSeconds ();
    睡眠(1);
    readRtc();
    sleep(1);
    }
    


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

    你好、Alan

    我的问题得到了解答。 写入寄存器的值不是十进制的、而是十六进制的。 例如、 45秒分为十六进制4秒和十六进制5秒、分别生成0100和0101。 感谢你的帮助。