繁体   English   中英

MAX77651无法通过i2c读取寄存器

[英]MAX77651 Can't read register with i2c

我正在尝试对MAX77651芯片的i2c通信进行编程,然后再对其进行编程。

所以这是我要做的设置:

我有一个通过USB连接到我的Linux笔记本电脑的UMFT4222ev。 借助MAX77651的评估板,该芯片的SCL和SDA与我的MAX77651的SDA和SCL相链接。 我的MAX77651evkit在Vbatt引脚上以3.7V供电。

我还从git hub和libft4222安装​​了mraa librarie。 我知道mraa安装得很好,因为我使用了示例。

有人告诉我mraa库负责FT4222的设置,因此我仅使用mraa函数来编写程序。

我在Maxim网站上搜索,集成了i2c从站地址和一个寄存器,我可以在其中读取数据并检查一切是否正常。 然后,我阅读了i2c通信协议以读取单个寄存器,该寄存器可在此处获取:第78页上的https://datasheets.maximintegrated.com/en/ds/MAX77650-MAX77651.pdf

利用所有这些信息,我试图制作“测试程序”。 我解决了编译错误,但是当我执行程序时,无法获得寄存器中应该为0xFF的内容。

这是我的程序:

#include "stdio.h"
#include "syslog.h"
#include "string.h"
#include "unistd.h"
#include "mraa/i2c.h"
#include "mraa.h"

#define I2C_ADDR 0x48

int
main(int argc, char *argv[])
{
uint8_t *message;
*message=0XAC;
int i,j,k;
char reg_a_lire = 0x06; 

mraa_init();    
mraa_i2c_context i2c;


i2c = mraa_i2c_init(0);
mraa_i2c_frequency(i2c,MRAA_I2C_FAST);


mraa_i2c_address(i2c, I2C_ADDR);

mraa_i2c_write_byte(i2c,0x90);


mraa_i2c_read(i2c, message,1);


mraa_i2c_write_byte(i2c,reg_a_lire);


mraa_init();


mraa_i2c_write_byte(i2c,0x91);

mraa_i2c_read(i2c, message,1);

mraa_i2c_read(i2c, message,1);

printf("%02X \n", *message);
mraa_i2c_stop(i2c);

return 0;
}

这是实际输出:

alex@cyclonit-laptop ~/Test_alex/tests $ ./a.out
AC 

而且我想得到FF而不是AC。

我认为我的错误可能是由于我错过了初始化FT4222或MAX77651而导致的,这可能是我没有正确加电并且不足以在Vbatt上施加3,7V的原因。 但这可能是我程序的问题,因为我对uint8_t不太了解,而且我做错了什么。

我希望有人对FT4222和/或MAX77651有经验,可以为我提供帮助。

我认为您对pg感到困惑。 MAX77651数据表的 75。

ADDRESS      | 7-BIT SLAVE ADDRESS | 8-BIT WRITE ADDRESS | 8-BIT READ ADDRESS
Main Address | 0x48, 0b 100 1000   | 0x90, 0b 1001 0000  | 0x91, 0b 1001 0001
(ADDR = 1)*  |                     |                     |                   
-------------+---------------------+---------------------+-------------------
Main Address | 0x40, 0b 100 0000   | 0x80, 0b 1000 0000  | 0x81, 0b 1000 0001
(ADDR = 0)*  |                     |                     |                   

根据您对I²C规范的看法,可以使用7位地址,也可以使用两个8位地址。 原因是第一个I²C事务发送以下8位:

76543210
\_____/\-- R/#W
   \------ 7-bit Slave Address

在您的情况下, 0x48向左移一位,然后为读模式为1或为写模式为0 注意

(0x40 << 1) | 0x00 == 0x80 == 8-bit Write Address (ADDR = 0)
(0x40 << 1) | 0x01 == 0x81 == 8-bit Read Address  (ADDR = 0)
(0x48 << 1) | 0x00 == 0x90 == 8-bit Write Address (ADDR = 1)
(0x48 << 1) | 0x01 == 0x91 == 8-bit Read Address  (ADDR = 1)

有些人喜欢使用从站地址,而另一些人则喜欢提供单独的地址,因此很清楚通信的第一个字节是什么样的。

因此,您应该删除无关的mraa_i2c_write_byte(i2c, ...); 代码中的几行,因为它们的意图似乎是将读取或写入地址发送到从属设备。

查阅MRAA库API参考 有一些抽象读写寄存器的功能,这些寄存器是字节宽的[8位]寄存器或字宽的[16位]寄存器:

mraa_i2c_read_byte_data
mraa_i2c_read_bytes_data
mraa_i2c_write_byte_data

在这两种情况下,您都应检查返回码以了解操作是否成功。 在您的情况下,您的message很可能不会更改,因为事先存在停止/错误情况,因为从站未确认其从站地址或未确认您错误发送的0x90 / 0x91数据字节,因为它们没有t在《 程序员指南》中显示为有效地址。

另一个问题是,您尝试使用两个连续的读取操作读取寄存器INTM_GLBL(0x06;全局中断屏蔽寄存器)。 我不确定您是要两次读取寄存器0x06还是要读取INT_M_CHG(0x07;充电器的全局中断掩码),因为这不是它的工作。 注意pg上的描述。 数据表中的 78个:

Note that when the MAX77650/MAX77651 receive a stop 
they do not modify their register pointer.

这是支持多字节/顺序读取的I²C从设备的典型行为。 如果要读取多个寄存器,则必须对多个字节的数据发出顺序读取操作,例如,使用mraa_i2c_read_bytes_data

类似于以下内容的内容可能会让您步入正轨。 它应该读取CID和CLKS设置,并在发生读取错误时永远等待。 如果成功,它将禁用所有输出的充电,将红色LED设置为每隔一秒闪烁一次,并且-取消注释后-将On / Off Controller切换为“通过软件打开”状态以启用偏置和LED。

#define MAX77651_SLA     0x48u
#define CNFG_GLBL_REG    0x10u
#define CID_REG          0x11u
#define CNFG_CHG_B_REG   0x19u
#define CNFG_SBB0_B_REG  0x2Au
#define CNFG_SBB1_B_REG  0x2Cu
#define CNFG_SBB2_B_REG  0x2Eu
#define CNFG_LDO_B_REG   0x39u
#define CNFG_LED1_A_REG  0x41u
#define CNFG_LED1_B_REG  0x44u
#define CNFG_LED_TOP_REG 0x46u

int main(int argc, char *argv[]) {

    uint8_t data;
    int res;

    mraa_init(); 
    mraa_i2c_context i2c0;

    i2c0 = mraa_i2c_init(0);
    mraa_i2c_frequency(i2c0, MRAA_I2C_STD);
    mraa_i2c_address(i2c0, MAX77651_SLA);

    res = mraa_i2c_read_byte_data(i2c0, CID_REG);
    if (res < 0) {
        printf("Reading CID_REG failed.\n");
        mraa_i2c_stop(i2c0);
        while(1);
    }
    data = res;
    printf("CID_REG: CLKS = %02X CID = %02X\n", ((data & 0x70u) >> 4), (data & 0x0Fu));

    /* you should check return values here */
    mraa_i2c_write_byte_data(i2c0, 0x00u /* CHG_EN = off */,  CNFG_CHG_B_REG);
    mraa_i2c_write_byte_data(i2c0, 0x04u /* EN_LDO = off */,  CNFG_LDO_B_REG);
    mraa_i2c_write_byte_data(i2c0, 0x04u /* EN_SBB0 = off */, CNFG_SBB0_B_REG);
    mraa_i2c_write_byte_data(i2c0, 0x04u /* EN_SBB1 = off */, CNFG_SBB1_B_REG);
    mraa_i2c_write_byte_data(i2c0, 0x04u /* EN_SBB2 = off */, CNFG_SBB2_B_REG);

    /* set up red led to toggle every second */
    mraa_i2c_write_byte_data(i2c0, 0x17u /* P = 1s, D = 50% */,         CNFG_LED1_B_REG);
    mraa_i2c_write_byte_data(i2c0, 0x98u /* FS = 6.4mA, BRT = 5.0mA */, CNFG_LED1_A_REG);
    mraa_i2c_write_byte_data(i2c0, 0x01u /* EN_LED_MSTR = on */,        CNFG_LED_TOP_REG);

    // DANGER ZONE: enable only when you know what this is supposed to do
    //mraa_i2c_write_byte_data(i2c0, 0x10u /* SBIA_EN = on, SBIA_LPM = normal */, CNFG_GLBL_REG);

    mraa_i2c_stop(i2c0);
    while(1);
}

我设法读取了MAX77651的I2C寄存器。

首先查看硬件部分,我必须确保VIO具有正确的电压,如@FRob在隐藏评论中所述。

然后对于软件,我停止使用mraa库,因为我无法控制所有内容。 我使用了FT4222库,该库允许我打开并启动FT4222设备。 我在此库中使用了一部分I2C示例来初始化设备。 然后我注意到我必须首先使用FT4222的写功能来发送要读取的寄存器,然后只需使用读功能即可获得结果。 这些是所需的两个步骤。

我不会发布我制作的整个程序,因为它主要取自I2C示例进行初始化,但是这是我添加的部分,用于读取应该包含0xFF的寄存器0X06:

uint8 resultat=0x11;
uint8 *p_resultat=&resultat;
int chiffre;
slaveAddr
uint16 bytesToWrite2 = 1;
uint16 bytesWritten2=1;
uint8 valeur= 0x06;                              // REGISTER TO READ
uint8 *p_valeur=&valeur;    


FT4222_I2CMaster_Write(ftHandle,slaveAddr,
p_valeur,bytesToWrite2,&bytesWritten);  //INDICATES WHICH REGISTER TO 
                                        //                       READ

chiffre = FT4222_I2CMaster_Read(ftHandle, 
slaveAddr,p_resultat,1, &bytesRead);     // READ REGISTER

printf("The content of the register %02X is : %02X \n " , 
valeur,resultat);    // DISPLAY RESULT

printf("reading success if : %d = 0 \n " , chiffre);                 
// READING SUCCESS ?

使用此代码和初始化,我得到以下结果:

alex@cyclonit-laptop ~/Downloads/libft4222-1.2.1.4/examples $ ./a.out

Device 0 is interface A of mode-0 FT4222H:
0x0403601c    FT4222 A
Chip version: 42220200, LibFT4222 version: 01020104
The content of the register 06 is : FF 
reading success if : 0 = 0 
Skipping interface B of mode-0 FT4222H.

如果有人遇到相同的问题,您可以通过回答此帖子随意问我。我非常感谢这里为我提供帮助的人们!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM