I2C是一种简单的双向两线制总线协议标准,使用一根时钟线(SCL)和一根数据线(SDA)进行通讯
手里有个OLED的屏幕SSD1315 I2C驱动,接下来用Ai-M61-32SU通过I2C点亮它
先放上已经完成的驱动文件
运行效果
接下来介绍使用方法
初始化i2c
- void i2c_init()
- {
- gpio = bflb_device_get_by_name("gpio");
- /* I2C0_SDA */
- bflb_gpio_init(gpio, GPIO_PIN_11, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- /* I2C0_SCL */
- bflb_gpio_init(gpio, GPIO_PIN_10, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- i2c0 = bflb_device_get_by_name("i2c0");
- bflb_i2c_init(i2c0, 100000);
- }
复制代码 实现发送方法
- uint8_t i2c_sendreg8(void *i2cx,uint8_t devaddr,uint8_t reg,uint8_t *datas,uint16_t datalen)
- {
- struct bflb_i2c_msg_s msgs[2];
- msgs[0].addr = devaddr;
- msgs[0].flags = I2C_M_NOSTOP;
- msgs[0].buffer = ®
- msgs[0].length = 1;
- msgs[1].addr = devaddr;
- msgs[1].flags = I2C_M_WRITE;
- msgs[1].buffer = datas;
- msgs[1].length = datalen;
- return bflb_i2c_transfer(i2cx, msgs, 2) == 0?0:1;
- }
复制代码 定义一个OLED的结构体,分配i2c指针和发送方法后初始化
- MY_OLED_SSD1315_DEV_Type oled_dev;
- void oled_init()
- {
- i2c_init();
- oled_dev.i2cx = i2c0;
- oled_dev.i2c_senddatas_func = (MY_OLED_SSD1315_I2CSendDatasFunc_Type)i2c_sendreg8;
- MY_OLED_SSD1315_Init(&oled_dev);
- MY_OLED_SSD1315_ClearScreen(&oled_dev);
- MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,0,0,"Ai-M61-32SU TEST");
- MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,2,0," I2C OLED");
- MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,4,0,"bbs.ai-thinker.com");
- MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,6,0,"Code lvxinjia123");
- }
复制代码 最后在main函数中调用
- int main(void)
- {
- board_init();
- gpio = bflb_device_get_by_name("gpio");
- bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
- oled_init();
- while (1) {
- bflb_gpio_set(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- bflb_gpio_reset(gpio, GPIO_PIN_12);
- bflb_mtimer_delay_ms(1000);
- }
- }
复制代码
|