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.

[参考译文] BQ27Z561:使用 i2c 写入和读取标准命令时出现问题

Guru**** 2539780 points
Other Parts Discussed in Thread: BQ27Z561

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1027495/bq27z561-problem-with-write-and-read-standard-command-using-i2c

器件型号:BQ27Z561

我已使用 slua801获取标准命令的响应。

根据 SLUUBO7。 我们需要编写 2字节标准命令

写入(fd_filepData2); 


但在函数下面、写入一个字节命令、尽管它响应正确的数据。

为什么这会正确响应? 我想知道哪里出错了?


int FuelCheck::gauch_read (int &fd_fileunsigned char nRegisterunsigned char *pDataunsigned char nLength) 
int n = 0

如果(nLength < 1) 
返回0

pData[0]= nRegister

N =写入(fd_filepData1); 
#IF
if (n ==1) 
#ifdef QDEBUG_ENABLE 
pMainApp.ObjSettings.DebugStation ("无法写入电量监测计寄存器地址"); 
#endif 
#endif 

N =读取(fd_filepDatanLength); 

usleep(200); 

#IF
if ((n =-1)||(n = 0)) 
#ifdef QDEBUG_ENABLE 
pMainApp.ObjSettings.DebugStation ("读取电量监测计寄存器地址失败"); 
#endif 
#endif 

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

    Mangal、

    这是因为监测计中的命令是寄存器地址。 每个命令的长度为两个字节、因为通常每个返回的数据值需要两个字节来提供正确的信息。 从监测计读取时、该函数会告知监测计从器件读取的起始地址(一个字节、两字节命令中的最低地址)、然后读取两个字节。

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

    读取我需要的数据  

    1]写入命令的起始地址  

    2]读取2字节数据

    并在寄存器地址写入数据

    1]向寄存器地址写入数据

    我是对的吗? 这是否适用于任何读取和写入命令?

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

    Mangal、

    是的、正确。

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

    您能让我解释一下为什么在示例中写入2字节的寄存器?

    要读回写入的数据、您需要触发"随机地址读取"序列(DS10925的图29中也进行了解码)。

    这可以使用 ioctl (filehande、I2C_RDWR、&PAYLOAD)来实现;

    有效载荷是一个 i2c_rdwr_ioctl_data 结构、包含2个部分消息:

    • 为存储器地址写入2个字节
    • 以1个字节的读数进行链式连接(不会重新显示器件地址)

     

    从 Drivers/BSP/Linux/st25dv-i2c_linux.c 中提取的代码

     struct i2c_msg messages[2]={

        {

          .addr = DevAddr >>1,

          .buf = regAddr、

          .len = 2、

          .flags = 0、

        }、

        {

          .addr = DevAddr >>1,

          buf = pData、

          .len =长度、

          flags = I2C_M_RD | I2C_M_NOSTRT、

        }

      };

     

     struct i2c_rdwr_ioctl_data load={

        .msgs =消息、

        nmsgs = 2、

      };

     

      RET = ioctl (filehandle、I2C_RDWR、有效载荷);

      如果(ret < 0){

        RET =-errno;

        printf ("\r\nError %d while reading @%X (devAddr=%X)\r\n"、ret、Reg、DevAddr);

        回程;

      }

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

    Mangal、

    我不熟悉该器件、因为它不是我们的产品、但我想存储器地址长度为2字节、这就是您需要为该地址写入两个字节的原因。 BQ27Z561只需一个字节的地址。

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

    尊敬的 Albert,        我想知道在哪里可以找到 bq27z561内存地址的长度是1字节?                                                             

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

    Mangal、

    这可以在 TRM 中找到。 地址的格式为0xNN、而不是0xnnnn (其中 N 是任何十六进制数字)。 前者表示地址为一个字节长、后者表示地址为两个字节长。