【GD32L233C-START评测】五、I2C(硬件I2C驱动OLED)
[复制链接]
本次实验使用GD32L233CCT6的I2C通信接口驱动1.3' OLED显示屏。
一、实验资源
1、GD32L233C-START;
2、Keil V5.36.0.0;
3、1.3' OLED模块(自制)
二、知识准备
GD32L233CCT6有两个I2C通信接口(I2C0、I2C1),接口支持主、从机模式;支持7位和10位的地址模式和广播寻址;支持标速(100kHz),快速(400kHz)和快速+ (1MHz)三种速度模式;支持I2C 多主机;具备可编程的建立时间和保持时间。
三、实验内容
1、硬件连接
I2C1接口已通过“Arduino”引出,对于实验比较方便。
2、程序实现
I2C 可以工作在从机发送 、从机接收、主机发送、主机接收等四种工作模式,在本实验中仅是利用I2C接口向OLED相关寄存器写入指令及数据用以驱动OLED显示屏进行显示,所以实验中采用的是“主机发送”模式。OLED的主控为SH1106,使用了7位地址模式:
对于工作在主机模式的I2C模块配置在手册已给出了比较详细的说明:
主机做为发送器时根据发送的字节数量不同配置上有点小差别:
配置中还要考虑两个比较重要的参数:数据保持时间和数据建立时间,这两个参数也决定了I2C通信的速率:
I2C接口开启所在GPIO的备用功能,实验中I2C1的配置依据:
I2C1配置:
static void i2c_config(void)//I2C端口配置
{
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_I2C1);
gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_10);//将SCL复用至PB10脚
gpio_af_set(GPIOB, GPIO_AF_4, GPIO_PIN_11);//将SDA复用至PB11脚
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);//开漏输出,使能上拉
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_11);//开漏输出,使能上拉
gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
i2c_timing_config(I2C1, 0, 0x3, 0);//配置I2C1时序0分频;数据建立时间0X3;数据保持时间0
i2c_master_clock_config(I2C1, 0x13, 0x36);//速度控制,主机模式下SCL高电平周期0x13;低电平周期0x36
i2c_address_config(I2C1, OLED_I2C_ADDR, I2C_ADDFORMAT_7BITS);//配置器件地址、采用7位地址
i2c_master_addressing(I2C1, OLED_I2C_ADDR, I2C_MASTER_TRANSMIT);//配置从机地址、主机传输
i2c_transfer_byte_number_config(I2C1, 2);//传输2字节
i2c_enable(I2C1);//使能I2C1
}
OLED驱动代码来自于“中景园”
int main(void)
{
//uint8_t t = ' ';
systick_config();
OLED_Init();
OLED_ColorTurn(0); //0正常显示 1 反色显示
OLED_DisplayTurn(0); //0正常显示 1 屏幕翻转显示
OLED_Clear(1);
delay_1ms(1500);
OLED_Clear(0);
OLED_ShowPicture(0,0,130,64,BMP3,1);
OLED_Refresh();
delay_1ms(2000);
while(1)
{
OLED_ShowChinese(16,0,0,16,1);//兆
OLED_ShowChinese(32,0,1,16,1);//易
OLED_ShowChinese(48,0,2,16,1);//创
OLED_ShowChinese(64,0,3,16,1);//新
OLED_ShowChinese(80,0,4,16,1);//科
OLED_ShowChinese(96,0,5,16,1);//技
OLED_ShowString(24,16,"GigaDevice",16,1);
OLED_ShowString(4,32,"GD32L233C-START",16,1);
OLED_ShowString(8,48,"HAPPY NEW YEAR",16,1);
//OLED_ShowString(0,48,"ASCII:",16,1);
//OLED_ShowString(63,48,"CODE:",16,1);
//OLED_ShowChar(48,48,t,16,1);//显示ASCII字符
// t++;
// if(t>'~')t=' ';
//OLED_ShowNum(103,48,t,3,16,1);
OLED_Refresh();
delay_1ms(2000);
OLED_Clear(0);
// OLED_ShowChinese(0,0,0,16,1); //16*16 中
// OLED_ShowChinese(16,0,0,24,1); //24*24 中
// OLED_ShowChinese(24,20,0,32,1);//32*32 中
// OLED_ShowChinese(64,0,0,64,1); //64*64 中
// OLED_Refresh();
// delay_1ms(500);
// OLED_Clear(0);
// OLED_ShowString(0,0,"ABC",8,1);//6*8 “ABC”
// OLED_ShowString(0,8,"ABC",12,1);//6*12 “ABC”
// OLED_ShowString(0,20,"ABC",16,1);//8*16 “ABC”
// OLED_ShowString(0,36,"ABC",24,1);//12*24 “ABC”
// OLED_Refresh();
// delay_1ms(500);
OLED_ScrollDisplay(12,5,1);
}
}
四、实验成果
OLED是TB带板屏自己拆机打板制作,还有个金属保护框,屏的尺寸应该是1.3的。做了I2C和SPI两种接口,下次就做SPI实验。
五:附件
由于发帖审核时间太长,审核通过后帖子已然被埋入海底。发贴不易,设置了回贴可见,请谅。
|