RT-Thread论坛
直播中

万航渡路

8年用户 1319经验值
擅长:电源/新能源
私信 关注
[问答]

使用rtthread settings配置完i2c后,与pca9535pw的第一通讯报错,为什么?

在使用rtthread settings配置完i2c后,与pca9535pw的第一通讯报错,不知道为什么?代码如下:
main:

    /* 初始化PCA9535PW */
    if (pca9535pw_init(I2C_BUS_NAME) != RT_EOK)
    {
        return 0;
    }
    rt_thread_delay(1000);
    while(pca9535pw_write_reg(PCA9535PW_CONFIG_PORT_0, 0x00) != RT_EOK)
    {
        rt_kprintf("Failed to configure Port 0\n");
    }
    while(pca9535pw_write_reg(PCA9535PW_CONFIG_PORT_1, 0x00) != RT_EOK)
    {
        rt_kprintf("Failed to configure Port 1\n");
    }
    while (1)
    {
        /* 打开特定引脚 */
        if (pca9535pw_write_reg(PCA9535PW_OUTPUT_PORT_0, 0x01) != RT_EOK)
        {
            rt_kprintf("Failed to write to Output Port 0\n");
        }
        if (pca9535pw_write_reg(PCA9535PW_OUTPUT_PORT_1, 0x06) != RT_EOK)
        {
            rt_kprintf("Failed to write to Output Port 1\n");
        }
        rt_thread_mdelay(500);
        /* 读取输入引脚状态 */
        if (pca9535pw_read_reg(PCA9535PW_INPUT_PORT_0, &value) == RT_EOK)
        {
            rt_kprintf("Input Port 0: 0x%02X\n", value);
        }
        else
        {
            rt_kprintf("Failed to read from Input Port 0\n");
        }
        if (pca9535pw_read_reg(PCA9535PW_INPUT_PORT_1, &value) == RT_EOK)
        {
            rt_kprintf("Input Port 1: 0x%02X\n", value);
        }
        else
        {
            rt_kprintf("Failed to read from Input Port 1\n");
        }
        rt_thread_mdelay(1000);
    }
pca9535pw.c:

#include "pca9535pw.h"
#define PCA9535PW_ADDRESS   0x20    // PCA9535PW的I2C地址
static struct rt_i2c_bus_device *i2c_bus = RT_NULL;
/* 初始化I2C总线 */
rt_err_t pca9535pw_init(const char *i2c_bus_name)
{
    i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(i2c_bus_name);
    if (i2c_bus == RT_NULL)
    {
        rt_kprintf("I2C bus %s not found!\n", i2c_bus_name);
        return -RT_ERROR;
    }
    rt_kprintf("I2C bus %s found!\n", i2c_bus_name);
    return RT_EOK;
}
/* 写寄存器函数 */
rt_err_t pca9535pw_write_reg(rt_uint8_t reg, rt_uint8_t value)
{
    struct rt_i2c_msg msgs[2];
    rt_uint8_t buffer[2];
    buffer[0] = reg;
    buffer[1] = value;
    msgs[0].addr  = PCA9535PW_ADDRESS;
    msgs[0].flags = RT_I2C_WR;
    msgs[0].buf   = buffer;
    msgs[0].len   = 2;
    if (rt_i2c_transfer(i2c_bus, msgs, 1) == 1)
    {
        return RT_EOK;
    }
    else
    {
        return -RT_ERROR;
    }
}
/* 读寄存器函数 */
rt_err_t pca9535pw_read_reg(rt_uint8_t reg, rt_uint8_t *value)
{
    struct rt_i2c_msg msgs[2];
    msgs[0].addr  = PCA9535PW_ADDRESS;
    msgs[0].flags = RT_I2C_WR;
    msgs[0].buf   = ®
    msgs[0].len   = 1;
    msgs[1].addr  = PCA9535PW_ADDRESS;
    msgs[1].flags = RT_I2C_RD;
    msgs[1].buf   = value;
    msgs[1].len   = 1;
    if (rt_i2c_transfer(i2c_bus, msgs, 2) == 2)
    {
        return RT_EOK;
    }
    else
    {
        return -RT_ERROR;
    }
}

回帖(1)

我有一车切糕

2024-7-9 16:13:46
首先,我们需要分析代码和可能的问题。以下是代码的关键部分:

1. 初始化PCA9535PW:`if (pca9535pw_init(I2C_BUS_NAME) != RT_EOK) { return 0; }`
2. 延时1秒:`rt_thread_delay(1000);`
3. 尝试写入PCA9535PW寄存器:`while(pca9535pw_write_reg(PCA9535PW_CONFIG_PORT_0, 0x00) != RT_EOK)`

根据这些信息,我们可以逐步检查可能的问题:

1. **I2C配置问题**:确保I2C总线配置正确,包括I2C设备的地址、时钟速率等。检查`I2C_BUS_NAME`是否正确设置。

2. **PCA9535PW初始化问题**:检查`pca9535pw_init`函数是否正确实现了初始化逻辑,包括设置I2C设备地址等。

3. **延时问题**:虽然延时1秒通常足够让设备稳定,但可以尝试减少延时时间,看看是否会影响通信结果。

4. **写入寄存器问题**:检查`pca9535pw_write_reg`函数是否正确实现了写入逻辑。确保寄存器地址和数据正确。

5. **错误处理**:在`while`循环中,如果写入失败,应该添加错误处理逻辑,例如打印错误信息或重试。

6. **硬件连接问题**:检查硬件连接是否正确,包括I2C数据线、电源线等。

7. **PCA9535PW设备问题**:确保PCA9535PW设备本身没有问题,可以尝试使用其他设备或在其他环境中测试。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分