lising 发表于 2022-1-30 23:11

【GD32L233C-START评测】五、I2C(硬件I2C驱动OLED)

<p>&nbsp; &nbsp; &nbsp; &nbsp; 本次实验使用GD32L233CCT6的I2C通信接口驱动1.3&#39; OLED显示屏。<br />
一、实验资源<br />
1、GD32L233C-START;<br />
2、Keil V5.36.0.0;<br />
3、1.3&#39; OLED模块(自制)</p>

<p><br />
二、知识准备</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; GD32L233CCT6有两个I2C通信接口(I2C0、I2C1),接口支持主、从机模式;支持7位和10位的地址模式和广播寻址;支持标速(100kHz),快速(400kHz)和快速+ (1MHz)三种速度模式;支持I2C 多主机;具备可编程的建立时间和保持时间。</p>

<p><br />
三、实验内容<br />
1、硬件连接</p>

<p>I2C1接口已通过&ldquo;Arduino&rdquo;引出,对于实验比较方便。</p>

<p><br />
2、程序实现</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; I2C 可以工作在从机发送 、从机接收、主机发送、主机接收等四种工作模式,在本实验中仅是利用I2C接口向OLED相关寄存器写入指令及数据用以驱动OLED显示屏进行显示,所以实验中采用的是&ldquo;主机发送&rdquo;模式。OLED的主控为SH1106,使用了7位地址模式:<br />
</p>

<p>对于工作在主机模式的I2C模块配置在手册已给出了比较详细的说明:</p>

<p></p>

<p>主机做为发送器时根据发送的字节数量不同配置上有点小差别:</p>

<p></p>

<p>配置中还要考虑两个比较重要的参数:数据保持时间和数据建立时间,这两个参数也决定了I2C通信的速率:</p>

<p></p>

<p>&nbsp;</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驱动代码来自于&ldquo;中景园&rdquo;</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&gt;'~')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>

Jacktang 发表于 2022-2-7 07:27

<p>I2C1配置讲的很好</p>

<p>谢谢分享OLED驱动代码</p>

lising 发表于 2022-2-8 22:37

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>

windysw20 发表于 2022-7-26 14:28

<p>感谢分享GD32的OLED硬件IIC,找了好久都是软件的</p>

lising 发表于 2022-7-27 11:23

windysw20 发表于 2022-7-26 14:28
感谢分享GD32的OLED硬件IIC,找了好久都是软件的

<p>希望能够帮到你</p>

HHHIComeBack 发表于 2022-8-2 09:47

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>

chuckleu 发表于 2022-12-1 14:55

<table cellpadding="0" cellspacing="0">
        <tbody>
                <tr>
                        <td>
                        <p>I2C1讲的很清楚,谢谢分享OLED驱动代码</p>
                        </td>
                </tr>
        </tbody>
</table>

lugl4313820 发表于 2022-12-3 06:26

这帖子写得不错呀,谢谢分享,这么多显示屏,家里有矿的人呀!

maoamao 发表于 2023-7-10 08:25

<p>:)</p><br/>

dayuyuyuyu 发表于 2023-12-4 14:18

<p>讲的太好了。谢谢大佬</p>

阿斯顿v 发表于 2024-4-12 16:40

<p>感谢分享</p>

<p>&nbsp;</p>

yangsong2323 发表于 2024-7-1 16:53

<p>感谢分享,想看看iic过程</p>

Nolazy 发表于 2024-10-30 16:51

<p>学习一下i2c驱动过程</p>
页: [1]
查看完整版本: 【GD32L233C-START评测】五、I2C(硬件I2C驱动OLED)