硬汉嵌入式论坛

 找回密码
 立即注册
查看: 486|回复: 9
收起左侧

[I2C] 请教下,关于使用一路 i2c 挂载多个器件使用os大佬们都是如何处理的?

[复制链接]

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2025-6-11 15:18:58 | 显示全部楼层 |阅读模式



请教下,关于使用一路 i2c 挂载多个器件使用os大佬们都是如何处理的?

如 i2c1 一路 需要控制:

gt911 触摸屏   邮箱类型定义为 0x01
at24c512        邮箱类型定义为 0x02
mpu9250        邮箱类型定义为 0x04
bmp280         邮箱类型定义为 0x08
bh1750          邮箱类型定义为 0x10
... ...

这样的情况使用 os 系统大家伙是如何处理的 ?

我目前想到的一个方法是 单独给 i2c 创建一个任务,使用 消息邮箱,根据邮箱的不同类型来处理 不知道是否可行 ?




回复

使用道具 举报

24

主题

365

回帖

437

积分

高级会员

积分
437
发表于 2025-6-11 15:34:27 | 显示全部楼层
挺好,做成服务的形式,其他应用想要调用相关功能就往这个服务发送请求。典型的LWIP内核就是这种形式。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-12 07:46:12 | 显示全部楼层
事件标准组也很方便
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2025-6-12 11:54:49 | 显示全部楼层
eric2013 发表于 2025-6-12 07:46
事件标准组也很方便

貌似事件标志组不能够携带 相关的参数, 特别是读些 eeprom 操作就不太方面

如果是 读写 固定的 寄存器地址,数据长度的话,貌似事件标志组 就是没有问题的吧 ?
回复

使用道具 举报

6

主题

306

回帖

324

积分

高级会员

积分
324
发表于 2025-6-12 13:57:53 | 显示全部楼层
分成两类,一种是时间触发的,一种是用户或动作触发的,
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2025-6-12 15:41:04 | 显示全部楼层
fxyc87 发表于 2025-6-12 13:57
分成两类,一种是时间触发的,一种是用户或动作触发的,

貌似 一路 i2c 挂载太多的 器件,在使用 os 的情况下 处理貌似还是有点麻烦的 哟 ?!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-6-13 06:54:18 | 显示全部楼层
hpdell 发表于 2025-6-12 11:54
貌似事件标志组不能够携带 相关的参数, 特别是读些 eeprom 操作就不太方面

如果是 读写 固定的 寄存 ...

如果需要任务返回数据,设计就麻烦了,那还是互斥信号量操作I2C总线方便
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2025-6-13 09:30:28 | 显示全部楼层
eric2013 发表于 2025-6-13 06:54
如果需要任务返回数据,设计就麻烦了,那还是互斥信号量操作I2C总线方便




你的意思是这样操作,如下:

osMutexId_t  xMutexI2C1   = NULL;



xMutexI2C1 = osMutexNew(NULL);
if(xMutexI2C1 != RT_NULL)
{
        __log("互斥量创建成功! xMutexI2C1\r\n");
}



// ----------------------------------------------------------------------------------
void  eep_rw(void) {
在任何需要使用前都:

        osMutexAcquire(xMutexI2C1,         /* 获取互斥量 */
                                                  osWaitForever);         /* 等待时间:一直等 */

... ...

使用完后:
osMutexRelease(xMutexI2C1);   //释放掉资源               
}


// ----------------------------------------------------------------------------------

void  touch_rw(void) {

    osMutexAcquire(xMutexI2C1,  osWaitForever);

... ...

    osMutexRelease(xMutexI2C1);   //释放掉资源               
}



// ----------------------------------------------------------------------------------

void  bh1750_rw(void) {

    osMutexAcquire(xMutexI2C1,  osWaitForever);

... ...
    osMutexRelease(xMutexI2C1);   //释放掉资源               
}




// ----------------------------------------------------------------------------------

void  bpm280_rw(void) {
    osMutexAcquire(xMutexI2C1,  osWaitForever);
... ...
    osMutexRelease(xMutexI2C1);   //释放掉资源               
}




如上使用的方法, 貌似就可以不用考虑线程的问题了吧 ?  这样貌似是比较简单,目前就是不知道是否比较稳定呀  ????

我的这个使用方法 是否可行呀 ????????








回复

使用道具 举报

3

主题

54

回帖

63

积分

初级会员

积分
63
发表于 2025-6-13 10:12:36 | 显示全部楼层
hpdell 发表于 2025-6-13 09:30
你的意思是这样操作,如下:

osMutexId_t  xMutexI2C1   = NULL;

没问题,把锁直接写到i2c驱动里面更保险
[C] 纯文本查看 复制代码
int32_t Transmit(I2C_ID ID, uint16_t devAddr, uint8_t *buf, int32_t size)
{
	I2C_Priv *priv = GetI2CPriv(ID);

	if (Lock(&priv->mtx, I2C_MTX_TIMEOUT_MS) != HAL_OK) {
		HAL_WRN("mutex failed, i2c ID %d\n", i2cID);
		return -1;
	}

	int32_t ret = I2C_Master_common(i2cID, devAddr, buf, size);

	Unlock(&priv->mtx);

	return ret;
}
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
 楼主| 发表于 2025-6-13 12:21:22 | 显示全部楼层
baobao5 发表于 2025-6-13 10:12
没问题,把锁直接写到i2c驱动里面更保险
[mw_shl_code=c,true]int32_t Transmit(I2C_ID ID, uint16_t de ...

你这个方法应该也是不错的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 07:03 , Processed in 0.047360 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表