发帖
9 0 1

【Ai-M61-32SU入门】I2C点亮OLED

lvxinjia123
论坛元老

11

主题

37

回帖

3100

积分

论坛元老

积分
3100
Ai-M61-Kit外设移植教程 1008 9 2024-5-21 21:06:59
I2C是一种简单的双向两线制总线协议标准,使用一根时钟线(SCL)和一根数据线(SDA)进行通讯
手里有个OLED的屏幕SSD1315 I2C驱动,接下来用Ai-M61-32SU通过I2C点亮它
先放上已经完成的驱动文件
上传的附件: my_oled_ssd1315.rar (5.87 KB, 下载次数: 10)

运行效果
微信截图_20240521210416.png

接下来介绍使用方法
初始化i2c

  1. void i2c_init()
  2. {
  3.     gpio = bflb_device_get_by_name("gpio");
  4.     /* I2C0_SDA */
  5.     bflb_gpio_init(gpio, GPIO_PIN_11, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  6.     /* I2C0_SCL */
  7.     bflb_gpio_init(gpio, GPIO_PIN_10, GPIO_FUNC_I2C0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  8.     i2c0 = bflb_device_get_by_name("i2c0");
  9.     bflb_i2c_init(i2c0, 100000);
  10. }
复制代码
实现发送方法

  1. uint8_t i2c_sendreg8(void *i2cx,uint8_t devaddr,uint8_t reg,uint8_t *datas,uint16_t datalen)
  2. {
  3.     struct bflb_i2c_msg_s msgs[2];

  4.     msgs[0].addr = devaddr;
  5.     msgs[0].flags = I2C_M_NOSTOP;
  6.     msgs[0].buffer = ®
  7.     msgs[0].length = 1;

  8.     msgs[1].addr = devaddr;
  9.     msgs[1].flags = I2C_M_WRITE;
  10.     msgs[1].buffer = datas;
  11.     msgs[1].length = datalen;
  12.     return bflb_i2c_transfer(i2cx, msgs, 2) == 0?0:1;
  13. }
复制代码
定义一个OLED的结构体,分配i2c指针和发送方法后初始化

  1. MY_OLED_SSD1315_DEV_Type oled_dev;
  2. void oled_init()
  3. {
  4.     i2c_init();
  5.     oled_dev.i2cx = i2c0;
  6.     oled_dev.i2c_senddatas_func = (MY_OLED_SSD1315_I2CSendDatasFunc_Type)i2c_sendreg8;
  7.     MY_OLED_SSD1315_Init(&oled_dev);
  8.     MY_OLED_SSD1315_ClearScreen(&oled_dev);
  9.     MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,0,0,"Ai-M61-32SU TEST");
  10.     MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,2,0,"    I2C OLED");
  11.     MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,4,0,"bbs.ai-thinker.com");
  12.     MY_OLED_SSD1315_DisplayString8x16(&oled_dev,0,6,0,"Code lvxinjia123");
  13. }
复制代码
最后在main函数中调用

  1. int main(void)
  2. {
  3.     board_init();
  4.     gpio = bflb_device_get_by_name("gpio");
  5.     bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_OUTPUT | GPIO_FLOAT | GPIO_SMT_EN | GPIO_DRV_0);
  6.     oled_init();
  7.     while (1) {
  8.         bflb_gpio_set(gpio, GPIO_PIN_12);
  9.         bflb_mtimer_delay_ms(1000);
  10.         bflb_gpio_reset(gpio, GPIO_PIN_12);
  11.         bflb_mtimer_delay_ms(1000);
  12.     }
  13. }
复制代码


──── 0人觉得很赞 ────

使用道具 举报

2024-5-22 07:58:51
2024-5-22 08:40:02
不错不错!
2024-5-22 08:57:35
终于看到不一样的了
2024-5-22 09:37:36
点赞
2024-5-22 09:47:14
真不错,赞个
2024-5-23 09:54:26
学习了
2024-7-3 16:07:16
2024-7-7 11:42:48
厉害
2024-7-29 13:12:21
优秀
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28185 个
  • 话题数: 40022 篇