i2c_smbus_write_i2c_block_data() 返回值 -5
时间: 2023-08-11 12:05:03 浏览: 135
i2c_smbus_write_i2c_block_data()函数返回值为-5表示出现了I2C传输错误。这种错误通常是由于I2C总线上的硬件问题或者通信协议不正确导致的。可以尝试检查I2C设备是否正确连接,I2C总线是否正常工作,以及I2C设备的地址和寄存器是否设置正确,来解决该问题。如果问题仍然存在,可以尝试使用其他的I2C传输函数进行通信或者检查I2C总线的电气特性是否符合规范。
相关问题
i2c_smbus_write_i2c_block_data()返回值
i2c_smbus_write_i2c_block_data()函数的返回值是int类型的,其返回值的含义与具体实现有关。一般情况下,返回值为0表示函数执行成功,返回其他值表示执行失败。在Linux系统中,该函数主要用于向I2C设备写入一组数据。函数返回值为负数表示出现错误,而返回值为正数则表示成功写入的数据字节数。具体的返回值含义可以参考相关的函数文档和实现代码。
regmap中 .write_reg = i2c_smbus_write_i2c_block_data 实例
下面是一个使用 `i2c_smbus_write_i2c_block_data` 函数进行寄存器写入的 regmap 实例代码:
```c
#include <linux/i2c.h>
#include <linux/regmap.h>
struct regmap *map;
struct i2c_client *client;
// 初始化 i2c_client
client = i2c_new_client_device(adapter, &addr);
if (!client)
return -ENODEV;
// 创建 regmap
struct regmap_bus bus = {
.write_reg = i2c_smbus_write_i2c_block_data,
// 其他成员
};
map = devm_regmap_init_i2c(client, ®s_config, &bus);
if (IS_ERR(map)) {
ret = PTR_ERR(map);
dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
return ret;
}
// 向寄存器写入数据
u8 data_buf[2] = {0x12, 0x34};
ret = regmap_raw_write(map, reg_addr, data_buf, sizeof(data_buf) / sizeof(u8));
if (ret) {
dev_err(&client->dev, "Failed to write reg: %d\n", ret);
return ret;
}
```
在上述代码中,使用 `i2c_new_client_device()` 函数初始化了一个 `i2c_client` 结构体,并将其地址保存在 `client` 变量中。然后,创建了一个 `regmap_bus` 结构体,将其 `.write_reg` 成员指定为 `i2c_smbus_write_i2c_block_data` 函数,表示写寄存器时使用该函数进行写入操作。最后,使用 `devm_regmap_init_i2c()` 函数创建了一个 `regmap` 实例,并将 `regmap_bus` 结构体指针传递给该函数,表示指定的 `.write_reg` 函数将被用于寄存器的写操作。
在向寄存器写入数据时,通过调用 `regmap_raw_write()` 函数实现。该函数会将数据缓冲区中的数据写入到指定的寄存器地址中。在本例中,将 `data_buf` 缓冲区中的数据写入到指定的寄存器中,并将返回值保存在 `ret` 变量中。如果返回值为 0,则表示写入成功;否则,表示写入失败,需要根据返回值进行错误处理。
阅读全文