【瑞萨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]