论坛元老
 
- 积分
- 7464
- 金钱
- 7464
- 注册时间
- 2015-1-15
- 在线时间
- 1368 小时
|
发表于 2020-2-26 16:36:27
|
显示全部楼层
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]);
}
具体代码可以参考以上代码写
|
|