发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[AT32L021]

【AT-START-L021测评】03+移植硬件IIC的驱动OLED屏幕

[复制链接]
1139|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 聪聪哥哥 于 2024-12-13 16:17 编辑

最近学习了一下,AT32的硬件IIC功能,今天分享一下学习的过程;
一:OLED 简介:
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(Organic Electroluminesence Display, OELD)。因为具备轻薄、省电等特性,因此从 2003 年开始,这种显示设备在 MP3 播放器上得到了广泛应用,而对于同属数码类产品的 DC 与手机,此前只是在一些展会上展示过采用 OLED 屏幕的工程样品。自 2007 年后,寿命得 到很大提高,具备了许多 LCD 不可比拟的优势。
GND:电源地 VCC:2.2V~5.5V SCL(D0):CLK 时钟 (高电平 2.2V~5.5V) SDA(D1):MOSI 数据(高电平 2.2V~5.5V) RST:复位(高电平 2.2V~5.5V) D/C:数据/命令(高电平 2.2V~5.5V) 兼容 3.3V 和 5V 控制芯片的 I/O 电平(无需任何设置,直接兼容)。
实物图片如下:


二:汉字显示方法:
需要使用软件做自己的字库


参考图片的方式,设置好生成字库即可。
三:硬件配置:
使用AT32L021硬件的IIC驱动,IIC的最高通讯速度可以设置到200K,当设置到50K或者10K时和,可以明显的看到OLED刷屏幕的速度很慢,建议大家在使用的时候使用100K的速度就好。
可以使用AT32图形化配置工具,对底层一些驱动函数进行自动生成:

如上图所示,个人感觉AT32的图形化配置,比友商32的图形化配置要方便一些,比较都是中文操作,而且AT官方也提供的软件的基本操作说明,感兴趣的小伙伴可以去下载,学习一下,对于新手也是非常的友好。
四:软件部分:
该部分是硬件IIC的驱动宏定义部分:
#define I2C_TIMEOUT                      0xFFFFFFF

//#define I2Cx_CLKCTRL                   0xF070F7F7   //10K
//#define I2Cx_CLKCTRL                   0x60F06C6C   //50K
#define I2Cx_CLKCTRL                     0x60F03333   //100K
//#define I2Cx_CLKCTRL                   0x20C02C4F   //200K

#define I2Cx_ADDRESS                     0xA0

#define I2Cx_PORT                        I2C1
#define I2Cx_CLK                         CRM_I2C1_PERIPH_CLOCK
#define I2Cx_DMA                         DMA1
#define I2Cx_DMA_CLK                     CRM_DMA1_PERIPH_CLOCK

#define I2Cx_SCL_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK
#define I2Cx_SCL_GPIO_PIN                GPIO_PINS_6
#define I2Cx_SCL_GPIO_PinsSource         GPIO_PINS_SOURCE6
#define I2Cx_SCL_GPIO_PORT               GPIOB
#define I2Cx_SCL_GPIO_MUX                GPIO_MUX_1

#define I2Cx_SDA_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK
#define I2Cx_SDA_GPIO_PIN                GPIO_PINS_7
#define I2Cx_SDA_GPIO_PinsSource         GPIO_PINS_SOURCE7
#define I2Cx_SDA_GPIO_PORT               GPIOB
#define I2Cx_SDA_GPIO_MUX                GPIO_MUX_1

#define BUF_SIZE                         8
#define MASTER_BOARD
硬件IIC驱动部分:
void i2c_lowlevel_init(i2c_handle_type* hi2c)
{
  gpio_init_type gpio_init_structure;

  if(hi2c->i2cx == I2Cx_PORT)
  {
    /* i2c periph clock enable */
    crm_periph_clock_enable(I2Cx_CLK, TRUE);
    crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
    crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);

    /* gpio configuration */
    gpio_pin_mux_config(I2Cx_SCL_GPIO_PORT, I2Cx_SCL_GPIO_PinsSource, I2Cx_SCL_GPIO_MUX);

    gpio_pin_mux_config(I2Cx_SDA_GPIO_PORT, I2Cx_SDA_GPIO_PinsSource, I2Cx_SDA_GPIO_MUX);

    /* configure i2c pins: scl */
    gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_structure.gpio_mode           = GPIO_MODE_MUX;
    gpio_init_structure.gpio_out_type       = GPIO_OUTPUT_OPEN_DRAIN;
    gpio_init_structure.gpio_pull           = GPIO_PULL_NONE;

    gpio_init_structure.gpio_pins           = I2Cx_SCL_GPIO_PIN;
    gpio_init(I2Cx_SCL_GPIO_PORT, &gpio_init_structure);

    /* configure i2c pins: sda */
    gpio_init_structure.gpio_pins           = I2Cx_SDA_GPIO_PIN;
    gpio_init(I2Cx_SDA_GPIO_PORT, &gpio_init_structure);

    /* config i2c */
    i2c_init(hi2c->i2cx, 0x0F, I2Cx_CLKCTRL);

    i2c_own_address1_set(hi2c->i2cx, I2C_ADDRESS_MODE_7BIT, I2Cx_ADDRESS);
  }
}
OLED 显示部分:
 OLED_Init();
        OLED_Fill(0x00);
        OLED_ShowCN(0,0,34);
  OLED_ShowCN(16,0,34);
        OLED_ShowCN(32,0,37);
  OLED_ShowCN(48,0,37);
        OLED_ShowCN(64,0,32);
  OLED_ShowCN(80,0,33);
        OLED_ShowCN(96,0,35);
  OLED_ShowCN(112,0,36);

        OLED_ShowStr(0,2,"I2C OLED TEST",2);
        OLED_ShowStr(0,4,"AT32L021 IIC ",2);
        OLED_ShowStr(0,6,"2024- 11 - 13",2);
OLED驱动部分:
void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
{
        unsigned char c = 0,i = 0,j = 0;
        switch(TextSize)
        {
                case 1:
                {
                        while(ch[j] != '\0')
                        {
                                c = ch[j] - 32;
                                if(x > 126)
                                {
                                        x = 0;
                                        y++;
                                }
                                OLED_SetPos(x,y);
                                for(i=0;i<6;i++)
                                        WriteDat(F6x8[c][i]);
                                x += 6;
                                j++;
                        }
                }break;
                case 2:
                {
                        while(ch[j] != '\0')
                        {
                                c = ch[j] - 32;
                                if(x > 120)
                                {
                                        x = 0;
                                        y++;
                                }
                                OLED_SetPos(x,y);
                                for(i=0;i<8;i++)
                                        WriteDat(F8X16[c*16+i]);
                                OLED_SetPos(x,y+1);
                                for(i=0;i<8;i++)
                                        WriteDat(F8X16[c*16+i+8]);
                                x += 8;
                                j++;
                        }
                }break;
        }
}

void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
{
        unsigned char wm=0;
        unsigned int  adder=32*N;
        OLED_SetPos(x , y);
        for(wm = 0;wm < 16;wm++)
        {
                WriteDat(F16x16[adder]);
                adder += 1;
        }
        OLED_SetPos(x,y + 1);
        for(wm = 0;wm < 16;wm++)
        {
                WriteDat(F16x16[adder]);
                adder += 1;
        }
}
自己制作的字库显示:
0x40,0x40,0x42,0xCC,0x00,0x40,0x20,0x90,0x0C,0x03,0x0C,0x90,0x20,0x40,0x40,0x00,
0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x3F,0x44,0x42,0x41,0x40,0x40,0x70,0x00,0x00,/*"论"32*/
/* (16 X 16 , 宋体 )*/

0x20,0x20,0x20,0xFF,0x20,0x20,0x40,0x44,0x44,0x44,0xC4,0x44,0x44,0x44,0x40,0x00,
0x10,0x30,0x10,0x0F,0x08,0x08,0x20,0x70,0x28,0x26,0x21,0x20,0x28,0x30,0x60,0x00,/*"坛",33*/
/* (16 X 16 , 宋体 )*/

0x02,0xFE,0x92,0x92,0xFE,0x02,0x00,0xF8,0x89,0x8E,0x88,0x8C,0x8B,0xF8,0x00,0x00,
0x10,0x1F,0x08,0x08,0xFF,0x04,0x40,0x38,0x00,0x3C,0x41,0x46,0x60,0x04,0x38,0x00,/*"聪",34*/
/* (16 X 16 , 宋体 )*/

0x10,0x60,0x02,0x8C,0x00,0xFE,0x02,0xF2,0x02,0xFE,0x00,0xF8,0x00,0xFF,0x00,0x00,
0x04,0x04,0x7E,0x01,0x80,0x47,0x30,0x0F,0x10,0x27,0x00,0x47,0x80,0x7F,0x00,0x00,/*"测",35*/
/* (16 X 16 , 宋体 )*/

0x40,0x40,0x42,0xCC,0x00,0x00,0x12,0x62,0x02,0xFE,0x02,0x42,0x32,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x09,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x00,/*"评",36*/

0x00,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4A,0x7A,0x02,0x02,0x7E,0x02,0x02,0x00,0x00,
0x01,0x01,0x01,0x3D,0x25,0x25,0x25,0x25,0x3D,0x41,0x81,0x7F,0x01,0x01,0x01,0x00,/*"哥",37*/
实物演示:


后记:在调试硬件IIC时候,也是遇到了问题,在这里和大家分享一下过程:基本上参考了21论坛上面其他的大佬的作品,和驱动方法和过程,在调试AT硬件IIC的时候,底层驱动都是使用的官方的驱动函数,只是在运用时候使用的驱动OLED函数罢了,当时出现的问题是:屏幕乱码,但是可以正常点亮了,开始以为是AT32的驱动能力问题,这里我使用的是1.8V给开发板供电,开始认为是TTL信号问题,后来才发现是制作的字库有问题,于是有重新对制作的字库的过程学习了一下,这里也将制作过程分享一下!!!

使用特权

评论回复

打赏榜单

ArterySW 打赏了 10.00 元 2025-01-07
理由:作品优秀

沙发
呐咯密密| | 2024-12-13 19:53 | 只看该作者
我在一开始做这个的时候也遇到过字库的问题,取模很重要

使用特权

评论回复
板凳
xionghaoyun| | 2024-12-14 10:15 | 只看该作者
模拟IIC好些

使用特权

评论回复
地板
丙丁先生| | 2024-12-15 11:41 | 只看该作者
感谢分享

使用特权

评论回复
5
gaoyang9992006| | 2024-12-15 13:28 | 只看该作者
硬件挺不错,我本来也准备写这个的,没找到我那个屏幕,找到了spi的,就写了个spi的

使用特权

评论回复
6
LEDyyds| | 2024-12-16 14:54 | 只看该作者
gaoyang9992006 发表于 2024-12-15 13:28
硬件挺不错,我本来也准备写这个的,没找到我那个屏幕,找到了spi的,就写了个spi的 ...

SPI驱动也很好啊

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

127

帖子

0

粉丝