簡體   English   中英

無法初始化我的 i2c_config_t 結構

[英]Could not initialize my i2c_config_t structure

根據i2C.h如下:


/**
 * @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;

我寫了以下作業:

    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},
    };

其中報告了 2 個錯誤(抱歉是法語,所以我添加了自己的英語翻譯):

在 line.sda_pullup_en(翻譯為:“亂序初始化器在 C++ 中不是標准的”):


[{

    "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
}

在 line.master(翻譯為:“匿名聯合成員的指示符只能出現在與該匿名聯合匹配的大括號之間”):

    "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
}]

[更新] 我最初的代碼寫作如下:

 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++ 中不是標准的”):

[{
    "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)行,翻譯為:

  • 匿名聯合成員的指示符只能出現在與該匿名聯合匹配的大括號之間
  • “.”之前的預期主表達式令牌
  • class “i2c_config_t”沒有“clk_speed”字段
[{

    "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
}]

如何修復我的代碼?

對於第一個錯誤,這意味着“ config中字段.sda_pullup_en的指示符順序與i2c_config_t中的聲明順序不匹配。

結構是一系列具有各種數據類型的數據,在您的i2c_config_t中,序列(不同數據的順序)是

typedef struct{
    i2c_mode_t mode;
    gpio_num_t sda_io_num;
    gpio_pullup_t sda_pullup_en;
    ...
}i2c_config_t;

當您在config中使用它時,您會更改導致第一個錯誤的結構中成員的順序,因為數據不會與其定義對齊:

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是結構中的結構,因此使用大括號表示法, 它應該是:

i2c_config_t conf = {
      .master {.clk_speed = I2C_MASTER_FREQ_HZ}
};

總之,這是糾正了兩個錯誤並且應該可以工作的片段。

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}
};

@hcheung 對成員的順序給出了正確的答案。

但是對於匿名工會,他的方案是行不通的。

我終於想出了解決方案:

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}}
    };

匿名聯合不是標准的,而是編譯器擴展,實際上應該命名。 但是在這里,該結構屬於我無法更新的第三方庫。

所以解決方案是我需要放一個開放的咖喱大括號來捕捉聯合的第一個成員,然后提供我感興趣的值。非常重要的是要注意,這聽起來我們只能到達第一個聯合成員,因為我們可以'不要說出來。

附加說明:您還可以按如下方式明確時鍾速度:

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}}
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM