根据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},
};
它报告了两个错误(抱歉,它是法文的,所以我把我自己的译文加进了英文):
在.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
}
在.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),翻译为:
一个匿名联合成员的指示符
[{
"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
}]
如何修正我的代码?
发布于 2022-09-29 08:35:26
@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}}
};
发布于 2022-09-24 03:33:48
对于第一个错误,这意味着“.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}
};
https://stackoverflow.com/questions/73814832
复制相似问题