发帖
4 0 0

安信可星闪BS21-32S-Kit开发板I2C初始化异常

slesle
注册会员

1

主题

2

回帖

77

积分

注册会员

积分
77
星闪 54 4 前天 14:31

星闪开发板I2C使用求助

在使用BS21-32S-Kit开发板的过程中发现调用uapi_i2c_master_init总是返回错误码0x80001302, 对应的错误是ERRCODE_I2C_INVALID_PARAMETER

使用的代码

#define I2C_MASTER_ADDR 0x0
#define I2C_SET_BAUDRATE 400000
#define I2C_MASTER_PIN_MODE 2
#define I2C_TRANSFER_LEN 8

#define I2C_TASK_STACK_SIZE 0x1000
#define I2C_TASK_DURATION_MS 500
#define I2C_TASK_PRIO (osPriority_t)(17)

#define I2C_MASTER_BUS_ID 1
#define I2C_SCL_MASTER_PIN 27
#define I2C_SDA_MASTER_PIN 28

static void app_i2c_init_pin(void)
{
    /* I2C pinmux. */
    uapi_pin_set_mode(I2C_SCL_MASTER_PIN, HAL_PIO_I2C1_CLK);
    uapi_pin_set_mode(I2C_SDA_MASTER_PIN, HAL_PIO_I2C1_DATA);
    uapi_pin_set_pull(I2C_SCL_MASTER_PIN, 3);
    uapi_pin_set_pull(I2C_SDA_MASTER_PIN, 3);
}

static void *i2c_master_task(const char *arg)
{
    unused(arg);

    uint32_t baudrate = I2C_SET_BAUDRATE;
    uint8_t hscode = I2C_MASTER_ADDR;

    app_i2c_init_pin();
    errcode_t code_init = uapi_i2c_master_init(I2C_MASTER_BUS_ID, baudrate, hscode);
    osal_printk("init pin res: 0x%x\n", code_init);
   // ...
}  

经过了一些排查, 还是不能解决问题

尝试过的方法

  1. 发现Kconfig中没有开启I2C, 开启后还是不行

    image.png

  2. 尝试换了另一个I2C总线, 将代码中I2C_MASTER_BUS_ID从1改成了0, 但执行到uapi_i2c_master_init时直接崩溃

  3. 由于安信可开发板的SDK半开源, 底层的驱动不开源, 便查看了一些开源的星闪bs21系列代码库的I2C相关代码, 发现有一些 I2C_BUS_MAX_NUM相关的检查, 以为是ID为1时 I2C_BUS_MAX_NUM默认也是1, bus >= I2C_BUS_MAX_NUM为真, 导致返回 ERRCODE_I2C_INVALID_PARAMETER, 便将Kconfig中 I2C_BUS_MAX_NUM的默认值从1修改为2,测试 i2c_master_init_check返回了正常的值, 但是uapi_i2c_master_init依然返回 ERRCODE_I2C_INVALID_PARAMETER

    如果安信可的BS21开发板使用的是一样的I2C代码, 应该是 hal_funcs->master_init 这里返回的 ERRCODE_I2C_INVALID_PARAMETER, 但是这个没法往下排查了...

    image.png

    image.png

    image.png

    安信可相关的示例资料太少了, 我是还有配置没开启, 导致了初始化异常吗?

──── 0人觉得很赞 ────

使用道具 举报

抱歉,二次开发提供不了支持,因为资料不开源~~难过(ಥ﹏ಥ)
前天 19:43
抱歉,难过(ಥ﹏ಥ),
本帖最后由 sujingliang 于 2025-3-10 21:46 编辑
  1. //我这里的uapi_i2c_master_init是这样的:

  2. errcode_t uapi_i2c_master_init(i2c_bus_t bus, uint32_t baudrate, uint8_t hscode)
  3. {
  4.     errcode_t ret = i2c_master_init_check(bus, baudrate, hscode);
  5.     if (ret != ERRCODE_SUCC) {
  6.         return ret;
  7.     }

  8. #if defined(CONFIG_I2C_SUPPORT_LPM)
  9.     g_i2c_baudrate[bus] = baudrate;
  10.     g_i2c_hscode[bus] = hscode;
  11. #endif  /* CONFIG_I2C_SUPPORT_LPM */

  12. #if defined(CONFIG_I2C_SUPPORT_LPC)
  13.     i2c_port_clock_enable(bus, true);
  14. #endif

  15.     i2c_mutex_init(bus);
  16.     i2c_int_mode_init(bus);
  17.     i2c_dma_mode_init(bus);

  18.     ret = hal_i2c_master_init(bus, baudrate, hscode, i2c_evt_callback);
  19.     if (ret != ERRCODE_SUCC) {
  20.         i2c_int_mode_sem_deinit(bus);
  21.         i2c_dma_mode_sem_deinit(bus);
  22.         i2c_mutex_destroy(bus);
  23.         return ret;
  24.     }

  25. #if defined(CONFIG_I2C_SUPPORT_INT) && (CONFIG_I2C_SUPPORT_INT == 1)
  26.     i2c_port_register_irq(bus);
  27. #endif

  28.     i2c_ctrl_block_info_t *i2c_ctrl = &g_i2c_ctrl[bus];
  29.     i2c_ctrl->init_flag = true;
  30.     i2c_ctrl->master_flag = true;
  31.     i2c_ctrl->hscode = hscode;
  32.     return ERRCODE_SUCC;
  33. }
复制代码

昨天 10:33

谢谢, 但是再往下找不到hal_i2c_master_init具体的实现代码, 所以现在改成使用GPIO模拟I2C了
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28061 个
  • 话题数: 39612 篇