[国产单片机] 【东软载波ESF0654 PDS开发板活动】2.8 寸TFT_LCD屏驱动显示

[复制链接]
877|1
 楼主| axf478 发表于 2019-12-16 15:49 | 显示全部楼层 |阅读模式
今天有幸收到东软载波寄来的ESF0654系列PDS开发板,总的来说这是款很不错的M0的芯片,flash和SRAM都比较大,外设也很丰富,还有CAN、AES128等特色资源。来到活动板块看到大家的反馈也很积极,各种入门和教学帖子笔笔皆是,正好楼主身边有一个2.8寸的TFT屏,翻看提供的SDK中在Discovery示例中有个关于LCD屏幕的例子02_display,索性做个移植贴,抛砖引玉,让大家更好的发掘这款芯片的强大。
PS:先发个占位贴,后续再更新
 楼主| axf478 发表于 2019-12-17 15:31 | 显示全部楼层
本帖最后由 axf478 于 2019-12-17 15:38 编辑

首先上链接:
关于ES32F0654的数据手册,请移步这里:http://www.essemi.com/article/c83.html
关于如何下载PDS板的资料,请移步这里:http://www.huodong.21i{:lol:}c.co{:lol:}m/es{:lol:}pds
关于如何使用PDS板的问题,请移步这里:htt{:lol:}p://b{:lol:}bs.21{:lol:}ic.c{:lol:}om/icview-28{:lol:}89120-1-1.ht{:lol:}ml
@一路向北lm 这位博主关于PDS板评测做的很好,十分详细,有什么使用问题可以参考。

我是分割线 我是分割线 我是分割线 我是分割线 我是分割线 我是分割线 我是分割线 我是分割线 我是分割线 我是分割线

首先我们打开SDK下面Discovery示例中的02_display例程,编译一下,下载到PDS板上,发现并没有报错,因为有BSP层的划分,关于TFT屏驱动已经做好了,可以直接在个例程上修改了

然后我们在打开bsp_display.c这个源文件,在源文件里找到static void oled_init(bsp_display_env_t *display)这个函数,其中有一段关于引脚初始化的代码。
  1.     gpio_init_t x;
  2.     exti_init_t exti;

  3.     x.mode = GPIO_MODE_OUTPUT;
  4.     x.odos = GPIO_PUSH_PULL;
  5.     x.pupd = GPIO_PUSH_UP;
  6.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  7.     x.flt  = GPIO_FILTER_DISABLE;
  8.     x.type = GPIO_TYPE_TTL;
  9.     x.func = GPIO_FUNC_1;

  10.     /* Enable spi flash cs set */
  11.     ald_gpio_init(GPIOE, GPIO_PIN_0, &x);
  12.     ald_gpio_write_pin(GPIOE, GPIO_PIN_0, 1);

  13.     /* PE14 -> CS_LCD */
  14.     ald_gpio_init(GPIOE, GPIO_PIN_15, &x);
  15.     ald_gpio_write_pin(GPIOE, GPIO_PIN_15, 1);

  16.     /* PC13 -> RST */
  17.     ald_gpio_init(GPIOC, GPIO_PIN_13, &x);
  18.     ald_gpio_write_pin(GPIOC, GPIO_PIN_13, 1);

  19.     /* PE3 -> DC */
  20.     ald_gpio_init(GPIOE, GPIO_PIN_3, &x);
  21.     ald_gpio_write_pin(GPIOE, GPIO_PIN_3, 1);

  22.     /* PE14 -> CS_PEN */
  23.     ald_gpio_init(GPIOE, GPIO_PIN_14, &x);
  24.     ald_gpio_write_pin(GPIOE, GPIO_PIN_14, 1);

  25.     /* PB15 MOSI INIT */
  26.     x.func = GPIO_FUNC_4;
  27.     ald_gpio_init(GPIOB, GPIO_PIN_15, &x);

  28.     /* PB13 SCK INIT */
  29.     x.func = GPIO_FUNC_4;
  30.     ald_gpio_init(GPIOB, GPIO_PIN_13, &x);

  31.     /* PB14 MISO INIT */
  32.     /* MISO Initializes */
  33.     x.mode = GPIO_MODE_INPUT;
  34.     x.pupd = GPIO_PUSH_UP;
  35.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  36.     x.flt  = GPIO_FILTER_DISABLE;
  37.     x.type = GPIO_TYPE_TTL;
  38.     x.func = GPIO_FUNC_4;
  39.     ald_gpio_init(GPIOB, GPIO_PIN_14, &x);

  40.     /* PE7--> PEN */
  41.     x.mode = GPIO_MODE_INPUT;
  42.     x.odos = GPIO_PUSH_PULL;
  43.     x.pupd = GPIO_PUSH_UP;
  44.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  45.     x.flt  = GPIO_FILTER_DISABLE;
  46.     x.type = GPIO_TYPE_TTL;
  47.     x.func = GPIO_FUNC_1;
  48.     ald_gpio_init(GPIOE, GPIO_PIN_7, &x);
其中使用的引脚有(8个):
输出类:PE15 -> CS_LCD(屏幕片选); PC13 -> RST(复位);PE3 -> DC(数据\命令);PE14 -> CS_PEN(触控片选);PB15 -> MOSI (SPI 输出);PB13 -> SCK (SPI 时钟);
输入类:PB14 -> MISO (SPI 输入);PE7 -> PEN(触控检测);

查找PDS开发板原理图,结合数据手册内容,我们选择 PA5、PA6、PA7这路硬件SPI0,预计使用的引脚如下:
输出类:PA01 -> CS_LCD(屏幕片选); PA03 -> RST(复位);PA04 -> DC(数据\命令);PC00 -> CS_PEN(触控片选);PA7 -> MOSI (SPI 输出);PA5 -> SCK (SPI 时钟);
输入类:PA6 -> MISO (SPI 输入);PC02 -> PEN(触控检测);

修改后的引脚初始化的代码如下:
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url]  lcd initialize.
  3.   * @param  display: display structure.
  4.   * @retval None
  5.   */
  6. static void oled_init(bsp_display_env_t *display)
  7. {
  8.     gpio_init_t x;
  9.     exti_init_t exti;

  10.     x.mode = GPIO_MODE_OUTPUT;
  11.     x.odos = GPIO_PUSH_PULL;
  12.     x.pupd = GPIO_PUSH_UP;
  13.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  14.     x.flt  = GPIO_FILTER_DISABLE;
  15.     x.type = GPIO_TYPE_TTL;
  16.     x.func = GPIO_FUNC_1;

  17.     /* Enable spi flash cs set */
  18.    //ald_gpio_init(GPIOE, GPIO_PIN_0, &x);
  19.    //ald_gpio_write_pin(GPIOE, GPIO_PIN_0, 1);

  20.     /* PA1 -> CS_LCD */
  21.     ald_gpio_init(GPIOA, GPIO_PIN_1, &x);
  22.     ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 1);

  23.     /* PA3 -> RST */
  24.     ald_gpio_init(GPIOA, GPIO_PIN_3, &x);
  25.     ald_gpio_write_pin(GPIOA, GPIO_PIN_3, 1);

  26.     /* PA4 -> DC */
  27.     ald_gpio_init(GPIOA, GPIO_PIN_4, &x);
  28.     ald_gpio_write_pin(GPIOA, GPIO_PIN_4, 1);

  29.     /* PC0 -> CS_PEN */
  30.     ald_gpio_init(GPIOC, GPIO_PIN_0, &x);
  31.     ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 1);

  32.     /* PA7 MOSI INIT */
  33.     x.func = GPIO_FUNC_6;
  34.     ald_gpio_init(GPIOA, GPIO_PIN_7, &x);

  35.     /* PA5 SCK INIT */
  36.     x.func = GPIO_FUNC_6;
  37.     ald_gpio_init(GPIOA, GPIO_PIN_5, &x);

  38.     /* PA6 MISO INIT */
  39.     /* MISO Initializes */
  40.     x.mode = GPIO_MODE_INPUT;
  41.     x.pupd = GPIO_PUSH_UP;
  42.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  43.     x.flt  = GPIO_FILTER_DISABLE;
  44.     x.type = GPIO_TYPE_TTL;
  45.     x.func = GPIO_FUNC_6;
  46.     ald_gpio_init(GPIOA, GPIO_PIN_6, &x);

  47.     /* PC2--> PEN */
  48.     x.mode = GPIO_MODE_INPUT;
  49.     x.odos = GPIO_PUSH_PULL;
  50.     x.pupd = GPIO_PUSH_UP;
  51.     x.odrv = GPIO_OUT_DRIVE_NORMAL;
  52.     x.flt  = GPIO_FILTER_DISABLE;
  53.     x.type = GPIO_TYPE_TTL;
  54.     x.func = GPIO_FUNC_1;
  55.     ald_gpio_init(GPIOC, GPIO_PIN_2, &x);

  56.     /* Initialize external interrupt */
  57.     exti.filter      = ENABLE;
  58.     exti.cks         = EXTI_FILTER_CLOCK_32K;
  59.     exti.filter_time = 100;
  60.     ald_gpio_exti_init(GPIOC, GPIO_PIN_2, &exti);
  61.     ald_gpio_exti_clear_flag_status(GPIO_PIN_2);
  62.     ald_gpio_exti_interrupt_config(GPIO_PIN_2, EXTI_TRIGGER_TRAILING_EDGE, ENABLE);
  63.     ald_mcu_irq_config(EXTI0_3_IRQn, 3, DISABLE);

  64.     display->h_spi.perh           = SPI0;
  65.     display->h_spi.init.mode      = SPI_MODE_MASTER;
  66.     display->h_spi.init.dir       = SPI_DIRECTION_2LINES;
  67.     display->h_spi.init.data_size = SPI_DATA_SIZE_8;
  68.     display->h_spi.init.baud      = SPI_BAUD_8;
  69.     display->h_spi.init.phase     = SPI_CPHA_FIRST;
  70.     display->h_spi.init.polarity  = SPI_CPOL_LOW;
  71.     display->h_spi.init.first_bit = SPI_FIRSTBIT_MSB;
  72.     display->h_spi.init.ss_en     = DISABLE;
  73.     display->h_spi.init.crc_calc  = DISABLE;
  74.     display->h_spi.tx_cplt_cbk    = spi_tx_cbk;
  75.     ald_spi_init(&display->h_spi);

  76.     //lcd³õʼ»¯
  77.     OLED_CS_CLR();
  78.     OLED_RST_CLR();
  79.     ald_delay_ms(20);
  80.     OLED_RST_SET();
  81.     ald_delay_ms(20);

  82.     //************* Start Initial Sequence **********//
  83.     lcd_wr_reg(display, 0xCF);
  84.     lcd_wr_data8(display, 0x00);
  85.     lcd_wr_data8(display, 0xD9);
  86.     lcd_wr_data8(display, 0x30);

  87.     lcd_wr_reg(display, 0xED);
  88.     lcd_wr_data8(display, 0x64);
  89.     lcd_wr_data8(display, 0x03);
  90.     lcd_wr_data8(display, 0X12);
  91.     lcd_wr_data8(display, 0X81);

  92.     lcd_wr_reg(display, 0xE8);
  93.     lcd_wr_data8(display, 0x85);
  94.     lcd_wr_data8(display, 0x10);
  95.     lcd_wr_data8(display, 0x78);

  96.     lcd_wr_reg(display, 0xCB);
  97.     lcd_wr_data8(display, 0x39);
  98.     lcd_wr_data8(display, 0x2C);
  99.     lcd_wr_data8(display, 0x00);
  100.     lcd_wr_data8(display, 0x34);
  101.     lcd_wr_data8(display, 0x02);

  102.     lcd_wr_reg(display, 0xF7);
  103.     lcd_wr_data8(display, 0x20);

  104.     lcd_wr_reg(display, 0xEA);
  105.     lcd_wr_data8(display, 0x00);
  106.     lcd_wr_data8(display, 0x00);

  107.     lcd_wr_reg(display, 0xC0);
  108.     lcd_wr_data8(display, 0x21);

  109.     lcd_wr_reg(display, 0xC1);
  110.     lcd_wr_data8(display, 0x12);

  111.     lcd_wr_reg(display, 0xC5);
  112.     lcd_wr_data8(display, 0x32);
  113.     lcd_wr_data8(display, 0x3C);

  114.     lcd_wr_reg(display, 0xC7);
  115.     lcd_wr_data8(display, 0xC1);

  116.     lcd_wr_reg(display, 0x36);
  117.     lcd_wr_data8(display, 0x08);

  118.     lcd_wr_reg(display, 0x3A);
  119.     lcd_wr_data8(display, 0x55);

  120.     lcd_wr_reg(display, 0xB1);
  121.     lcd_wr_data8(display, 0x00);
  122.     lcd_wr_data8(display, 0x18);

  123.     lcd_wr_reg(display, 0xB6);
  124.     lcd_wr_data8(display, 0x0A);
  125.     lcd_wr_data8(display, 0xA2);

  126.     lcd_wr_reg(display, 0xF2);
  127.     lcd_wr_data8(display, 0x00);

  128.     lcd_wr_reg(display, 0x26);
  129.     lcd_wr_data8(display, 0x01);

  130.     lcd_wr_reg(display, 0xE0);
  131.     lcd_wr_data8(display, 0x0F);
  132.     lcd_wr_data8(display, 0x20);
  133.     lcd_wr_data8(display, 0x1E);
  134.     lcd_wr_data8(display, 0x09);
  135.     lcd_wr_data8(display, 0x12);
  136.     lcd_wr_data8(display, 0x0B);
  137.     lcd_wr_data8(display, 0x50);
  138.     lcd_wr_data8(display, 0XBA);
  139.     lcd_wr_data8(display, 0x44);
  140.     lcd_wr_data8(display, 0x09);
  141.     lcd_wr_data8(display, 0x14);
  142.     lcd_wr_data8(display, 0x05);
  143.     lcd_wr_data8(display, 0x23);
  144.     lcd_wr_data8(display, 0x21);
  145.     lcd_wr_data8(display, 0x00);

  146.     lcd_wr_reg(display, 0xE1);
  147.     lcd_wr_data8(display, 0x00);
  148.     lcd_wr_data8(display, 0x19);
  149.     lcd_wr_data8(display, 0x19);
  150.     lcd_wr_data8(display, 0x00);
  151.     lcd_wr_data8(display, 0x12);
  152.     lcd_wr_data8(display, 0x07);
  153.     lcd_wr_data8(display, 0x2D);
  154.     lcd_wr_data8(display, 0x28);
  155.     lcd_wr_data8(display, 0x3F);
  156.     lcd_wr_data8(display, 0x02);
  157.     lcd_wr_data8(display, 0x0A);
  158.     lcd_wr_data8(display, 0x08);
  159.     lcd_wr_data8(display, 0x25);
  160.     lcd_wr_data8(display, 0x2D);
  161.     lcd_wr_data8(display, 0x0F);

  162.     lcd_wr_reg(display, 0x11);
  163.     ald_delay_ms(120);
  164.     lcd_wr_reg(display, 0x29);

  165.     bsp_tp_init(display);
  166. }
这边要注意一点,对应的bsp_display.h中的一些宏定义,也要做如下修改:
  1. #define OLED_CS_CLR()        ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 0);\
  2. ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 1)
  3. #define OLED_CS_SET()        ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 1);\
  4. ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 0)
  5. #define TOUCH_CS_Clr()        ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 0);\
  6. ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 1)
  7. #define TOUCH_CS_Set()        ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 1);\
  8. ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 0)
  9. #define OLED_RST_CLR() ald_gpio_write_pin(GPIOA, GPIO_PIN_3, 0)
  10. #define OLED_RST_SET() ald_gpio_write_pin(GPIOA, GPIO_PIN_3, 1)
  11. #define OLED_DC_CLR() ald_gpio_write_pin(GPIOA, GPIO_PIN_4, 0)
  12. #define OLED_DC_SET() ald_gpio_write_pin(GPIOA, GPIO_PIN_4, 1)
修改完成后,点击编译、下载,接着只需按下板子上的复位按键就可以刷屏了
然鹅~

并没有看到意料中的LOG和 “Hello Word” 字样。
到底哪边出了问题,这时候就要先抓个波形来看看(排除了供电的原因),上图:


我抓取的是SCK和MOSI这俩条线,图上只有SCK的数据并没有MOSI的数据。
稍加思索
Q1:难道是引脚配错了?
我打开了 ES32F0654LT的数据手册和PDS板的原理图,结合修改的代码,仔细的对了一遍,发现自己的引脚配置并没有错。
Q2:接线接错了?
仔细对照原理图,把所有的线都重插了一遍,还是有问题。
Q3:是显示屏坏了?
接着我又换了另外一个屏幕,还是同样有问题。
Q4: 杜邦线的问题(这个一开始没怀疑,概率有点低)?
换了根MOSI的杜邦线,结果就可以了。


O(∩_∩)O哈哈~ 屏幕可以正常显示了

本帖算是对 东软载波ESF0654 PDS开发板的一个初步了解,只用到了SPI一个简单的外设,一些特色外设如CAN等以后再慢慢挖掘。
----------END----------



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

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