OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2428|回复: 7

用模拟IIC,由于我的IIC设备分别在两组引脚上,求大佬帮帮忙!!!

[复制链接]

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-12-30
在线时间
4 小时
发表于 2020-2-26 08:19:14 | 显示全部楼层 |阅读模式
1金钱
用模拟IIC,由于我的IIC设备分别在两组引脚上,要怎么用一个IIC程序切换引脚使用这两个设备啊!
同时定义两组引脚为IIC的SDA和SCL编译会报错!
用的是keil的C,又不想写两个IIC,那样占容量!
求大佬帮帮忙!!!

最佳答案

查看完整内容[请看2#楼]

用函数指针,把公共部分抽象出来,通过回到函数实现。这样模拟N组i2c都不担心。 参考: https://blog.csdn.net/qq_20553613/article/details/78878211
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-2-26 08:19:15 | 显示全部楼层
用函数指针,把公共部分抽象出来,通过回到函数实现。这样模拟N组i2c都不担心。
参考:
https://blog.csdn.net/qq_20553613/article/details/78878211
回复

使用道具 举报

12

主题

143

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2723
金钱
2723
注册时间
2017-9-8
在线时间
471 小时
发表于 2020-2-26 13:54:39 | 显示全部楼层
最简单的方法就是飞线,将两个设备共用一组引脚
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-2-26 15:28:27 | 显示全部楼层
SCL和SDA的端口和引脚作为参数传递给函数就可以
一分耕耘一分收获。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-12-30
在线时间
4 小时
 楼主| 发表于 2020-2-26 16:00:09 | 显示全部楼层
yklstudent 发表于 2020-2-26 15:28
SCL和SDA的端口和引脚作为参数传递给函数就可以

能写下具体的代码吗?我是刚学的,谢谢了
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-2-26 16:36:27 | 显示全部楼层
qwe78951399 发表于 2020-2-26 16:00
能写下具体的代码吗?我是刚学的,谢谢了

typedef enum
{
        eI2C1_SCL = 0,
        eI2C1_SDA = 1,
        eI2C2_SCL = 2,
        eI2C2_SDA = 3,
        eI2C3_SCL = 4,
        eI2C3_SDA = 5,
        eGPIOn = 6,
}mico_gpio_type;

typedef enum
{
        eI2C1 = 0,
        eI2C2 = 1,
        eI2C3 = 2,
        eI2Cn = 3,
}mico_iic_type;

typedef struct
{
    GPIO_TypeDef *port;
    uint32_t pin_number;
}gpio_type;

typedef struct
{
        const gpio_type *pin_scl;
    const gpio_type *pin_sda;
}iic_type;

typedef struct
{
        iic_type *peripheral;
}iic_driver_type;

const gpio_type gpio_handlers[] =
{
        [eI2C1_SCL] =
        {
                .port = GPIOC,
                .pin_number = 0,
        },
        [eI2C1_SDA] =
        {
                .port = GPIOC,
                .pin_number = 1,
        },
        [eI2C2_SCL] =
        {
                .port = GPIOC,
                .pin_number = 2,
        },
        [eI2C2_SDA] =
        {
                .port = GPIOC,
                .pin_number = 3,
        },
        [eI2C3_SCL] =
        {
                .port = GPIOC,
                .pin_number = 4,
        },
        [eI2C3_SDA] =
        {
                .port = GPIOC,
                .pin_number = 5,
        },
};

const iic_type iic_handlers[eI2Cn] =
{
        [eI2C1] =
        {
                .pin_scl = &gpio_handlers[eI2C1_SCL],
                .pin_sda = &gpio_handlers[eI2C1_SDA],
        },
        [eI2C2] =
        {
                .pin_scl = &gpio_handlers[eI2C2_SCL],
                .pin_sda = &gpio_handlers[eI2C2_SDA],
        },
        [eI2C3] =
        {
                .pin_scl = &gpio_handlers[eI2C3_SCL],
                .pin_sda = &gpio_handlers[eI2C3_SDA],
        },
};

iic_driver_type iic_drivers[eI2Cn] =
{
        [eI2C1] =
        {
                .peripheral = (iic_type*)&iic_handlers[eI2C1],
        },
        [eI2C2] =
        {
                .peripheral = (iic_type*)&iic_handlers[eI2C2],
        },
        [eI2C3] =
        {
                .peripheral = (iic_type*)&iic_handlers[eI2C3],
        },
};

void iic_init(iic_driver_type *driver, const iic_type *peripheral)
{
        driver->peripheral = (iic_type*)peripheral;
        
        // 引脚IO初始化配置
        
        
}

void iic_high(iic_driver_type *driver)
{
        // scl置1
        driver->peripheral->pin_scl->port->ODR |= (1UL << driver->peripheral->pin_scl->pin_number);
        // scl置1
        driver->peripheral->pin_scl->port->ODR |= (1UL << driver->peripheral->pin_scl->pin_number);
}

void iic_low(iic_driver_type *driver)
{
        // scl置0
        driver->peripheral->pin_scl->port->ODR &= ~(1UL << driver->peripheral->pin_scl->pin_number);
        // scl置0
        driver->peripheral->pin_scl->port->ODR &= ~(1UL << driver->peripheral->pin_scl->pin_number);
}

void admin_main(void)
{
        iic_init(&iic_drivers[eI2C1], &iic_handlers[eI2C1]);
        iic_high(&iic_drivers[eI2C1]);
        iic_low(&iic_drivers[eI2C1]);
        
        iic_init(&iic_drivers[eI2C2], &iic_handlers[eI2C2]);
        iic_high(&iic_drivers[eI2C2]);
        iic_low(&iic_drivers[eI2C2]);
        
        iic_init(&iic_drivers[eI2C3], &iic_handlers[eI2C3]);
        iic_high(&iic_drivers[eI2C3]);
        iic_low(&iic_drivers[eI2C3]);
}
具体代码可以参考以上代码写
一分耕耘一分收获。
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-12-30
在线时间
4 小时
 楼主| 发表于 2020-2-26 16:45:26 | 显示全部楼层
yklstudent 发表于 2020-2-26 16:36
typedef enum
{
        eI2C1_SCL = 0,

谢谢了,非常感谢!
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-12-30
在线时间
4 小时
 楼主| 发表于 2020-2-27 10:25:34 | 显示全部楼层
Acuity 发表于 2020-2-26 21:29
用函数指针,把公共部分抽象出来,通过回到函数实现。这样模拟N组i2c都不担心。
参考:
https://blog.csd ...

谢谢了 !
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 22:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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