返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

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

[复制链接]
 楼主| 聪聪哥哥 发表于 2024-12-13 16:05 | 显示全部楼层 |阅读模式
本帖最后由 聪聪哥哥 于 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 电平(无需任何设置,直接兼容)。
实物图片如下:
99440675be17edf7d4.png

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

2.png 3.png
参考图片的方式,设置好生成字库即可。
三:硬件配置:
使用AT32L021硬件的IIC驱动,IIC的最高通讯速度可以设置到200K,当设置到50K或者10K时和,可以明显的看到OLED刷屏幕的速度很慢,建议大家在使用的时候使用100K的速度就好。
可以使用AT32图形化配置工具,对底层一些驱动函数进行自动生成:
4.png 5.png
如上图所示,个人感觉AT32的图形化配置,比友商32的图形化配置要方便一些,比较都是中文操作,而且AT官方也提供的软件的基本操作说明,感兴趣的小伙伴可以去下载,学习一下,对于新手也是非常的友好。
四:软件部分:
该部分是硬件IIC的驱动宏定义部分:
  1. #define I2C_TIMEOUT                      0xFFFFFFF

  2. //#define I2Cx_CLKCTRL                   0xF070F7F7   //10K
  3. //#define I2Cx_CLKCTRL                   0x60F06C6C   //50K
  4. #define I2Cx_CLKCTRL                     0x60F03333   //100K
  5. //#define I2Cx_CLKCTRL                   0x20C02C4F   //200K

  6. #define I2Cx_ADDRESS                     0xA0

  7. #define I2Cx_PORT                        I2C1
  8. #define I2Cx_CLK                         CRM_I2C1_PERIPH_CLOCK
  9. #define I2Cx_DMA                         DMA1
  10. #define I2Cx_DMA_CLK                     CRM_DMA1_PERIPH_CLOCK

  11. #define I2Cx_SCL_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK
  12. #define I2Cx_SCL_GPIO_PIN                GPIO_PINS_6
  13. #define I2Cx_SCL_GPIO_PinsSource         GPIO_PINS_SOURCE6
  14. #define I2Cx_SCL_GPIO_PORT               GPIOB
  15. #define I2Cx_SCL_GPIO_MUX                GPIO_MUX_1

  16. #define I2Cx_SDA_GPIO_CLK                CRM_GPIOB_PERIPH_CLOCK
  17. #define I2Cx_SDA_GPIO_PIN                GPIO_PINS_7
  18. #define I2Cx_SDA_GPIO_PinsSource         GPIO_PINS_SOURCE7
  19. #define I2Cx_SDA_GPIO_PORT               GPIOB
  20. #define I2Cx_SDA_GPIO_MUX                GPIO_MUX_1

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

  4.   if(hi2c->i2cx == I2Cx_PORT)
  5.   {
  6.     /* i2c periph clock enable */
  7.     crm_periph_clock_enable(I2Cx_CLK, TRUE);
  8.     crm_periph_clock_enable(I2Cx_SCL_GPIO_CLK, TRUE);
  9.     crm_periph_clock_enable(I2Cx_SDA_GPIO_CLK, TRUE);

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

  12.     gpio_pin_mux_config(I2Cx_SDA_GPIO_PORT, I2Cx_SDA_GPIO_PinsSource, I2Cx_SDA_GPIO_MUX);

  13.     /* configure i2c pins: scl */
  14.     gpio_init_structure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  15.     gpio_init_structure.gpio_mode           = GPIO_MODE_MUX;
  16.     gpio_init_structure.gpio_out_type       = GPIO_OUTPUT_OPEN_DRAIN;
  17.     gpio_init_structure.gpio_pull           = GPIO_PULL_NONE;

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

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

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

  25.     i2c_own_address1_set(hi2c->i2cx, I2C_ADDRESS_MODE_7BIT, I2Cx_ADDRESS);
  26.   }
  27. }
OLED 显示部分:
  1. OLED_Init();
  2.         OLED_Fill(0x00);
  3.         OLED_ShowCN(0,0,34);
  4.   OLED_ShowCN(16,0,34);
  5.         OLED_ShowCN(32,0,37);
  6.   OLED_ShowCN(48,0,37);
  7.         OLED_ShowCN(64,0,32);
  8.   OLED_ShowCN(80,0,33);
  9.         OLED_ShowCN(96,0,35);
  10.   OLED_ShowCN(112,0,36);

  11.         OLED_ShowStr(0,2,"I2C OLED TEST",2);
  12.         OLED_ShowStr(0,4,"AT32L021 IIC ",2);
  13.         OLED_ShowStr(0,6,"2024- 11 - 13",2);
OLED驱动部分:
  1. void OLED_ShowStr(unsigned char x, unsigned char y, unsigned char ch[], unsigned char TextSize)
  2. {
  3.         unsigned char c = 0,i = 0,j = 0;
  4.         switch(TextSize)
  5.         {
  6.                 case 1:
  7.                 {
  8.                         while(ch[j] != '\0')
  9.                         {
  10.                                 c = ch[j] - 32;
  11.                                 if(x > 126)
  12.                                 {
  13.                                         x = 0;
  14.                                         y++;
  15.                                 }
  16.                                 OLED_SetPos(x,y);
  17.                                 for(i=0;i<6;i++)
  18.                                         WriteDat(F6x8[c][i]);
  19.                                 x += 6;
  20.                                 j++;
  21.                         }
  22.                 }break;
  23.                 case 2:
  24.                 {
  25.                         while(ch[j] != '\0')
  26.                         {
  27.                                 c = ch[j] - 32;
  28.                                 if(x > 120)
  29.                                 {
  30.                                         x = 0;
  31.                                         y++;
  32.                                 }
  33.                                 OLED_SetPos(x,y);
  34.                                 for(i=0;i<8;i++)
  35.                                         WriteDat(F8X16[c*16+i]);
  36.                                 OLED_SetPos(x,y+1);
  37.                                 for(i=0;i<8;i++)
  38.                                         WriteDat(F8X16[c*16+i+8]);
  39.                                 x += 8;
  40.                                 j++;
  41.                         }
  42.                 }break;
  43.         }
  44. }

  45. void OLED_ShowCN(unsigned char x, unsigned char y, unsigned char N)
  46. {
  47.         unsigned char wm=0;
  48.         unsigned int  adder=32*N;
  49.         OLED_SetPos(x , y);
  50.         for(wm = 0;wm < 16;wm++)
  51.         {
  52.                 WriteDat(F16x16[adder]);
  53.                 adder += 1;
  54.         }
  55.         OLED_SetPos(x,y + 1);
  56.         for(wm = 0;wm < 16;wm++)
  57.         {
  58.                 WriteDat(F16x16[adder]);
  59.                 adder += 1;
  60.         }
  61. }
自己制作的字库显示:
  1. 0x40,0x40,0x42,0xCC,0x00,0x40,0x20,0x90,0x0C,0x03,0x0C,0x90,0x20,0x40,0x40,0x00,
  2. 0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x3F,0x44,0x42,0x41,0x40,0x40,0x70,0x00,0x00,/*"论"32*/
  3. /* (16 X 16 , 宋体 )*/

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

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

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

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

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

后记:在调试硬件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好些
gaoyang9992006 发表于 2024-12-15 13:28 来自手机 | 显示全部楼层
硬件挺不错,我本来也准备写这个的,没找到我那个屏幕,找到了spi的,就写了个spi的
LEDyyds 发表于 2024-12-16 14:54 | 显示全部楼层
gaoyang9992006 发表于 2024-12-15 13:28
硬件挺不错,我本来也准备写这个的,没找到我那个屏幕,找到了spi的,就写了个spi的 ...

SPI驱动也很好啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

222

帖子

1

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