首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法初始化我的i2c_config_t结构

无法初始化我的i2c_config_t结构
EN

Stack Overflow用户
提问于 2022-09-22 12:42:14
回答 2查看 77关注 0票数 0

根据i2C.h的规定如下:

代码语言:javascript
运行
复制
/**
 * @brief I2C initialization parameters
 */
typedef struct{
    i2c_mode_t mode;       /*!< I2C mode */
    gpio_num_t sda_io_num;        /*!< GPIO number for I2C sda signal */
    gpio_pullup_t sda_pullup_en;  /*!< Internal GPIO pull mode for I2C sda signal*/
    gpio_num_t scl_io_num;        /*!< GPIO number for I2C scl signal */
    gpio_pullup_t scl_pullup_en;  /*!< Internal GPIO pull mode for I2C scl signal*/

    union {
        struct {
            uint32_t clk_speed;     /*!< I2C clock frequency for master mode, (no higher than 1MHz for now) */
        } master;
        struct {
            uint8_t addr_10bit_en;  /*!< I2C 10bit address mode enable for slave mode */
            uint16_t slave_addr;    /*!< I2C address for slave mode */
        } slave;

    };
}i2c_config_t;

我写了以下作业:

代码语言:javascript
运行
复制
    const i2c_port_t i2c_master_port = (i2c_port_t)I2C_MASTER_NUM;
    i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .sda_pullup_en = (gpio_pullup_t)GPIO_PULLUP_ENABLE,
        .scl_pullup_en = (gpio_pullup_t)GPIO_PULLUP_ENABLE,
        .master = {.clk_speed = I2C_MASTER_FREQ_HZ},
    };

它报告了两个错误(抱歉,它是法文的,所以我把我自己的译文加进了英文):

在.sda_pullup_en行(翻译为:“无序初始化器在C++中不是标准的”):

代码语言:javascript
运行
复制
[{

    "code": "2904",
    "severity": 8,
    "message": "les initialiseurs hors service ne sont pas standard en C++",
    "source": "C/C++",
    "startLineNumber": 103,
    "startColumn": 9,
    "endLineNumber": 103,
    "endColumn": 9
}

在.master行(翻译为:“匿名联合成员的指示符只能出现在与该匿名联合匹配的大括号之间”):

代码语言:javascript
运行
复制
    "owner": "C/C++",
    "code": "2358",
    "severity": 8,
    "message": "un désignateur pour un membre d'union anonyme peut uniquement apparaître entre des accolades qui correspondent à cette union anonyme",
    "source": "C/C++",
    "startLineNumber": 105,
    "startColumn": 9,
    "endLineNumber": 105,
    "endColumn": 9
}]

更新我的初始代码如下:

代码语言:javascript
运行
复制
 i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .sda_pullup_en = (gpio_pullup_t)GPIO_PULLUP_ENABLE,
        .scl_pullup_en = (gpio_pullup_t)GPIO_PULLUP_ENABLE,
        .master.clk_speed = I2C_MASTER_FREQ_HZ
    };

并产生了这两个错误:

.sda_pullup_en =行(109) (翻译为:“无序初始化器在C++中不是标准的”):

代码语言:javascript
运行
复制
[{
    "owner": "C/C++",
    "code": "2904",
    "severity": 8,
    "message": "les initialiseurs hors service ne sont pas standard en C++",
    "source": "C/C++",
    "startLineNumber": 109,
    "startColumn": 3,
    "endLineNumber": 109,
    "endColumn": 3
}]

.master.clk_speed =行(111),翻译为:

一个匿名联合成员的指示符

  • 只能出现在与“.”之前的匿名
  • 主表达式匹配的大括号之间。令牌
  • 类"i2c_config_t“没有"clk_speed”字段

代码语言:javascript
运行
复制
[{

    "owner": "C/C++",
    "code": "2358",
    "severity": 8,
    "message": "un désignateur pour un membre d'union anonyme peut uniquement apparaître entre des accolades qui correspondent à cette union anonyme",
    "source": "C/C++",
    "startLineNumber": 111,
    "startColumn": 3,
    "endLineNumber": 111,
    "endColumn": 3
},{

    "owner": "cpp",
    "severity": 8,
    "message": "expected primary-expression before '.' token",
    "startLineNumber": 111,
    "startColumn": 3,
    "endLineNumber": 111,
    "endColumn": 3
},{

    "owner": "C/C++",
    "code": "136",
    "severity": 8,
    "message": "classe \"i2c_config_t\" n'a pas de champ \"clk_speed\"",
    "source": "C/C++",
    "startLineNumber": 111,
    "startColumn": 10,
    "endLineNumber": 111,
    "endColumn": 10
}]

如何修正我的代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-29 08:35:26

@hcheung给出了正确的答案关于成员的顺序。

但关于匿名工会,他的解决方案行不通。

我终于想出了解决办法:

代码语言:javascript
运行
复制
i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        { {I2C_MASTER_FREQ_HZ}}
    };

匿名联合不是标准的,而是编译器扩展,应该实际命名。但是在这里,这个结构属于一个第三方库,我不能更新。

因此,解决方案是,我需要放置一个开放的咖喱支架,以捕获联盟的第一个成员,然后提供我感兴趣的价值。很重要的一点是,这听起来我们只能联系到第一个工会会员,因为我们不能命名它。

附加注意:您也可以对时钟速度明确如下:

代码语言:javascript
运行
复制
i2c_config_t conf = {
        .mode = I2C_MODE_MASTER,
        .sda_io_num = I2C_MASTER_SDA_IO,
        .sda_pullup_en = GPIO_PULLUP_ENABLE,
        .scl_io_num = I2C_MASTER_SCL_IO,
        .scl_pullup_en = GPIO_PULLUP_ENABLE,
        {{.clk_speed = I2C_MASTER_FREQ_HZ}}
    };
票数 0
EN

Stack Overflow用户

发布于 2022-09-24 03:33:48

对于第一个错误,这意味着“.sda_pullup_en字段的指示符顺序与i2c_config_t中的声明顺序不匹配。

结构是一系列具有不同数据类型的数据,在您的i2c_config_t中,顺序(不同数据的顺序)是

代码语言:javascript
运行
复制
typedef struct{
    i2c_mode_t mode;
    gpio_num_t sda_io_num;
    gpio_pullup_t sda_pullup_en;
    ...
}i2c_config_t;

当您在config中使用它时,更改了结构中成员的顺序,这会导致第一个错误,因为数据与其定义不一致:

代码语言:javascript
运行
复制
i2c_config_t conf = {
    .mode = I2C_MODE_MASTER,
    .sda_io_num = I2C_MASTER_SDA_IO,
    .scl_io_num = I2C_MASTER_SCL_IO, // this is out of order from i2c_config_t
    ...
};

对于第二个错误,错误消息“匿名联合成员的指示符只能出现在与该匿名联合匹配的大括号之间”,但您的用法是错误的,master是结构中的一个结构,因此对于大括号符号,它应该是:

代码语言:javascript
运行
复制
i2c_config_t conf = {
      .master {.clk_speed = I2C_MASTER_FREQ_HZ}
};

总之,这是两个错误都更正并应该工作的片段。

代码语言:javascript
运行
复制
i2c_config_t conf = {
    .mode = I2C_MODE_MASTER,
    .sda_io_num = I2C_MASTER_SDA_IO,
    .sda_pullup_en = GPIO_PULLUP_ENABLE,
    .scl_io_num = I2C_MASTER_SCL_IO,
    .scl_pullup_en = GPIO_PULLUP_ENABLE,
    .master {.clk_speed = I2C_MASTER_FREQ_HZ}
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73814832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档