andeyqi 发表于 2026-7-10 14:00:31

【瑞萨RA-eco-RA6M4评测】I2C 驱动适配

本帖最后由 andeyqi 于 2026-7-10 14:01 编辑

### 简介

在之前的帖子中已经基于瑞萨的 Renesas RA v6.5.0 e2 studio 环境的搭建并使用FSP驱动完成了板载的LED的控制,我们在此基础上继续适配I2C接口用于读取传感器数据,板子的I2C接口电路如下:

!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/133952zllbv7w2vwvb27pr.png)

从原理图可知I2C接口使用了SCI3模块的P408/P409。
在 e2s 的pin 配置中配置P408/P409 映射到SCI3 的 I2C功能。
!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/134625zceey3qcjyqyppm3.png)

在配置中添加I2C 参数配置。
!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/135103gxa2xau5ra7a3rf7.png)

!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/135146yso11j2a6ozata5s.png)

配置好之后就可以使用I2C的接口了,对应接口如下.
!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/135240fp4mwzllv47rl4vr.png)

本地硬件添加I2C 模块连接到板子的I2C接口。

!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/135458qbzjy3op3frfbrfb.png)

本地添加如下的测试代码来扫描I2C总线上的外设。

```
static uint8_t i2c_init = 0;
volatile i2c_master_event_t g_i2c_callback_event;

static void i2c_scan(uint8_t start_addr, uint8_t stop_addr)
{
    printf("    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
    uint8_t pos = start_addr <= 0xF? 0x00: start_addr & 0xF;
    for(; pos < stop_addr; pos++)
    {
      if((pos & 0xF) == 0)
      {
            printf("\r\n%02X: ", pos);
      }
      if(pos < start_addr)
      {
            printf("   ");
            continue;
      }
      if( i2c_probe(pos) == 1)
      {
            printf("%02X", pos);
      }
      else
      {
            printf("--");
      }
      printf(" ");
    }
    printf("\r\n");
}

static int i2c_probe(char addr)
{
    fsp_err_t err;
    if(i2c_init == 0)
    {
      err = R_SCI_I2C_Open(&g_i2c3_ctrl,&g_i2c3_cfg);
      if(FSP_SUCCESS != err)
      {
            printf("i2c init failed %d \r\n",err);
      }
      else
      {
            i2c_init = 1;
      }
    }

    if(i2c_init)
    {
      /* Send data to I2C slave on the same channel */
      R_SCI_I2C_SlaveAddressSet(&g_i2c3_ctrl, addr, I2C_MASTER_ADDR_MODE_7BIT);
      static uint8_t data;
      data = 0x00;
      uint32_t timeout = 0x1000;
      /* Send data to I2C slave */
      g_i2c_callback_event = I2C_MASTER_EVENT_ABORTED;

      err = R_SCI_I2C_Write(&g_i2c3_ctrl, &data, 1, true);
      if(FSP_SUCCESS != err)
      {
            printf("i2c write failed %d \r\n",err);
      }

      /* Since there is nothing else to do, block until Callback triggers*/
      while ((I2C_MASTER_EVENT_TX_COMPLETE != g_i2c_callback_event) && timeout)
      {
            timeout--;
      }

    }

    return (g_i2c_callback_event == I2C_MASTER_EVENT_TX_COMPLETE) ? 1 : 0 ;

}

void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
    switch(p_args->event)
    {
      case I2C_MASTER_EVENT_TX_COMPLETE:
            g_i2c_callback_event = I2C_MASTER_EVENT_TX_COMPLETE;
            break;
      case I2C_MASTER_EVENT_ABORTED:
            break;
      default:
            break;
    }
}

unsigned int i2c(char argc, char **argv)
{
    if(strcmp(argv,"scan") == 0)
    {
      i2c_scan(0x00,0x7f);
    }
}
```

上述代码运行后,已经可以扫面到我们外接的I2C模块的地址信息了,说明I2C总线已经配置成功。
!(//m.qjumbo.com/forum/data/attachment/forum/202607/10/140029fzfo1xn3162p717o.png)

页: [1]
查看完整版本: 【瑞萨RA-eco-RA6M4评测】I2C 驱动适配

Baidu
map