【GD32L233C-START评测】五、I2C(硬件I2C驱动OLED)
<p> 本次实验使用GD32L233CCT6的I2C通信接口驱动1.3' OLED显示屏。<br />一、实验资源<br />
1、GD32L233C-START;<br />
2、Keil V5.36.0.0;<br />
3、1.3' OLED模块(自制)</p>
<p><br />
二、知识准备</p>
<p> GD32L233CCT6有两个I2C通信接口(I2C0、I2C1),接口支持主、从机模式;支持7位和10位的地址模式和广播寻址;支持标速(100kHz),快速(400kHz)和快速+ (1MHz)三种速度模式;支持I2C 多主机;具备可编程的建立时间和保持时间。</p>
<p><br />
三、实验内容<br />
1、硬件连接</p>
<p>I2C1接口已通过“Arduino”引出,对于实验比较方便。</p>
<p><br />
2、程序实现</p>
<p> I2C 可以工作在从机发送 、从机接收、主机发送、主机接收等四种工作模式,在本实验中仅是利用I2C接口向OLED相关寄存器写入指令及数据用以驱动OLED显示屏进行显示,所以实验中采用的是“主机发送”模式。OLED的主控为SH1106,使用了7位地址模式:<br />
</p>
<p>对于工作在主机模式的I2C模块配置在手册已给出了比较详细的说明:</p>
<p></p>
<p>主机做为发送器时根据发送的字节数量不同配置上有点小差别:</p>
<p></p>
<p>配置中还要考虑两个比较重要的参数:数据保持时间和数据建立时间,这两个参数也决定了I2C通信的速率:</p>
<p></p>
<p> </p>
<p>I2C接口开启所在GPIO的备用功能,实验中I2C1的配置依据:</p>
<p><br />
I2C1配置:</p>
<pre>
<code>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
}</code></pre>
<p>OLED驱动代码来自于“中景园”</p>
<pre>
<code>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);
}
}</code></pre>
<p><br />
四、实验成果</p>
<p>OLED是TB带板屏自己拆机打板制作,还有个金属保护框,屏的尺寸应该是1.3的。做了I2C和SPI两种接口,下次就做SPI实验。<br />
五:附件</p>
<p>由于发帖审核时间太长,审核通过后帖子已然被埋入海底。发贴不易,设置了回贴可见,请谅。</p>
<p>**** Hidden Message *****</p>
<p>I2C1配置讲的很好</p>
<p>谢谢分享OLED驱动代码</p>
Jacktang 发表于 2022-2-7 07:27
I2C1配置讲的很好
谢谢分享OLED驱动代码
<p>谢谢捧场!多交流相互学习<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>
<p>感谢分享GD32的OLED硬件IIC,找了好久都是软件的</p>
windysw20 发表于 2022-7-26 14:28
感谢分享GD32的OLED硬件IIC,找了好久都是软件的
<p>希望能够帮到你</p>
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>
<table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td>
<p>I2C1讲的很清楚,谢谢分享OLED驱动代码</p>
</td>
</tr>
</tbody>
</table>
这帖子写得不错呀,谢谢分享,这么多显示屏,家里有矿的人呀! <p>:)</p><br/> <p>讲的太好了。谢谢大佬</p>
<p>感谢分享</p>
<p> </p>
<p>感谢分享,想看看iic过程</p>
<p>学习一下i2c驱动过程</p>
页:
[1]