【GD32评测】四、I2C

[复制链接]
6282|47
 楼主| lisingch 发表于 2020-4-28 23:03 | 显示全部楼层 |阅读模式
I2c, pi, IO, AC, gp
      之前大多使用模拟方式进行I2C器件操作,一直想试试硬件方式,正好GD32E231C8T6片上资源包含了I2C,官方DEMO里也有使用例程,于是就尝试利用手上的一片0.69寸的OLED进行测试。
一、I2C资源简介
2020-04-28_221658.png
2020-04-28_221710.png
2020-04-28_222334.png
从官方资料上看GD32E231C8T6具有两个I2C(I2C0、I2C1),最高速度可达1MHz。

官方提供的用户手册对于I2C章节的描述非常详细,结合固件库参考手册及例程对于I2C的学习、理解有着非常积极的指导作用。如:
2020-04-28_223129.png
2020-04-28_223146.png
2020-04-28_223420.png
2020-04-28_223444.png
2020-04-28_223457.png
2020-04-28_223515.png

OLED非常小巧96x16像素,自制的一个小模块,对外5根连线:SCL、SDA、RST、VCC、GND,利用了板子上“Ardunio”的PB6、PB7、PB8三个端口:
2020-04-28_224623.png
2020-04-28_224243.png
微信图片_20200426162041.jpg

二、程序实现
      程序参考了DEMO,OLED驱动也是东拼西凑而来。下面是一些主要代码片段:
  1. void i2c_gpio_config(void)//I2C端口配置
  2. {
  3.         rcu_periph_clock_enable(RCU_GPIOB);
  4.         rcu_periph_clock_enable(RCU_I2C0);
  5.         //rcu_periph_clock_enable(RCU_PMU);
  6.        
  7.         gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_6);//设置PB6为SCL
  8.         gpio_af_set(GPIOB, GPIO_AF_1, GPIO_PIN_7);//设置PB7为SDA

  9.         gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_6);
  10.         gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
  11.         gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_7);
  12.         gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ,GPIO_PIN_7);

  13.         i2c_clock_config(I2C0, I2C0_SPEED, I2C_DTCY_2);//快速模式400KH
  14.         i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, OLED069_ADDS);
  15.         i2c_ack_config(I2C0, I2C_ACK_ENABLE);
  16.         i2c_enable(I2C0);
  17. }
  1. void WriteDat(uint8_t I2C_Data)//写数据
  2. {
  3.         //write_i2c(OLED_DEV_ADDR,0x40, I2C_Data);
  4.         while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));                //等待I2C总线空闲

  5.         i2c_start_on_bus(I2C0);                                                                                                //向I2C总线发送启动条件
  6.         while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));        //等待设置SBSEND位

  7.         i2c_master_addressing(I2C0, OLED069_ADDS, I2C_TRANSMITTER);//向I2C总线发送OLED地址(0X78)
  8.         while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));                //等待设置ADDSEND位

  9.         i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);                                        //清除ADDSEND位
  10.         while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE)); //等待传输数据缓冲区为空

  11.         i2c_data_transmit(I2C0, 0x40);                                                                        //写数据0x40
  12.         while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));                                //等待设置BTC位
  13.        
  14.         i2c_data_transmit(I2C0, I2C_Data);                                                        //oled写入数据
  15.         while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));                                //等待设置BTC位
  16.        
  17.         i2c_stop_on_bus(I2C0);                                                                                                        //向I2C总线发送停止条件
  18.         while(I2C_CTL0(I2C0)&0x0200);                                                                                //等待停止条件完成
  19. }


  20. void WriteCmd(uint8_t I2C_Command)//写命令
  21. {
  22.         //write_i2c(OLED_DEV_ADDR,0x00, I2C_Command);
  23.         while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));                //等待I2C总线空闲

  24.         i2c_start_on_bus(I2C0);                                                                                                //向I2C总线发送启动条件
  25.         while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));        //等待设置SBSEND位

  26.         i2c_master_addressing(I2C0, OLED069_ADDS, I2C_TRANSMITTER);        //向I2C总线发送OLED地址(0X78)
  27.         while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));                                                                //等待设置ADDSEND位

  28.         i2c_flag_clear(I2C0,I2C_FLAG_ADDSEND);                                        //清除ADDSEND位
  29.         while(SET != i2c_flag_get(I2C0, I2C_FLAG_TBE)); //等待传输数据缓冲区为空

  30.         i2c_data_transmit(I2C0, 0x00);                                                                        //写命令0x00
  31.         while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));                                //等待设置BTC位
  32.        
  33.         i2c_data_transmit(I2C0, I2C_Command);                                                //oled写入数据
  34.         while(!i2c_flag_get(I2C0, I2C_FLAG_BTC));                                //等待设置BTC位
  35.        
  36.         i2c_stop_on_bus(I2C0);                                                                                                        //向I2C总线发送停止条件
  37.         while(I2C_CTL0(I2C0)&0x0200);                                                                                //等待停止条件完成
  38. }
  1. int main(void)
  2. {
  3.         systick_config();
  4.        
  5.         i2c_gpio_config();//OLED端口配置
  6.   OLED_Init();                  //OLED初始化

  7.         while(1)
  8.         {
  9.                 OLED_ShowStr(0,0,"GD32E231C8T6",2);  
  10.                 delay_1ms(1000);
  11.                
  12.                 OLED_ShowCN(0,0,0);        //兆
  13.                 OLED_ShowCN(16,0,1);        //易
  14.                 OLED_ShowCN(32,0,2);        //创
  15.                 OLED_ShowCN(48,0,3);        //新
  16.                 OLED_ShowCN(64,0,4);        //科
  17.                 OLED_ShowCN(80,0,5);        //技
  18.                 delay_1ms(1000);
  19.         }
  20. }


三、结果
微信图片_20200426162057.jpg
微信图片_20200426162034.jpg

下面是将上次RTC实验的程序加入后重新写了一个12x16的字体,这样可以将整个像素点都利用上显得更加饱满,想着做块手表戴戴。
微信图片_20200428225651.jpg
HuangHongLun 发表于 2020-4-29 15:54 | 显示全部楼层
这个oled显示板哪里来的,小巧玲珑,不错。
 楼主| lisingch 发表于 2020-4-29 18:12 | 显示全部楼层
HuangHongLun 发表于 2020-4-29 15:54
这个oled显示板哪里来的,小巧玲珑,不错。

从其他论坛买的半成品板子上拆的。
10299823 发表于 2020-5-4 09:59 | 显示全部楼层
硬件I2C?            
lihuami 发表于 2020-5-4 10:00 | 显示全部楼层
直接的去控制SCL,SDA高低电平的输出
xiaoyaozt 发表于 2020-5-4 10:00 | 显示全部楼层
硬件I2C能与软件I2C一起用一个I2C通道么
uptown 发表于 2020-5-4 10:00 | 显示全部楼层
摸你iic是不是简单一些呢  
cehuafan 发表于 2020-5-4 10:01 | 显示全部楼层
这个的效果怎么样呢   
usysm 发表于 2020-5-4 10:01 | 显示全部楼层
硬件I2C稳定吗  
typeof 发表于 2020-5-4 10:01 | 显示全部楼层
如何设置 硬件 i2c 外设的从设备
yujielun 发表于 2020-5-4 10:01 | 显示全部楼层
硬件I2C 到底是不是个坑
htmlme 发表于 2020-5-4 10:02 | 显示全部楼层
中断方式和查询方式有什么区别
pklong 发表于 2020-5-4 10:02 | 显示全部楼层
GD32E231C8T6很给力的。
uptown 发表于 2020-5-4 10:02 | 显示全部楼层
使用模拟方式方便。     
cehuafan 发表于 2020-5-4 10:02 | 显示全部楼层
内部集成的i2c电路怎么样  
xiaoyaozt 发表于 2020-5-4 10:02 | 显示全部楼层
硬件I2C 到底怎么样?  
usysm 发表于 2020-5-4 10:02 | 显示全部楼层
gpio软件模拟IIC与硬件IIC驱动有什么区别
lihuami 发表于 2020-5-4 10:02 | 显示全部楼层
谢谢楼主分享的。      
typeof 发表于 2020-5-4 10:03 | 显示全部楼层
I2c硬件上是怎样实现双向传输的
10299823 发表于 2020-5-4 10:03 | 显示全部楼层
提供了标准库函数?   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部