打印
[国产单片机]

【东软载波ESF0654 PDS开发板活动】2.8 寸TFT_LCD屏驱动显示

[复制链接]
661|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)这个函数,其中有一段关于引脚初始化的代码。
    gpio_init_t x;
    exti_init_t exti;

    x.mode = GPIO_MODE_OUTPUT;
    x.odos = GPIO_PUSH_PULL;
    x.pupd = GPIO_PUSH_UP;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_TTL;
    x.func = GPIO_FUNC_1;

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

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

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

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

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

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

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

    /* PB14 MISO INIT */
    /* MISO Initializes */
    x.mode = GPIO_MODE_INPUT;
    x.pupd = GPIO_PUSH_UP;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_TTL;
    x.func = GPIO_FUNC_4;
    ald_gpio_init(GPIOB, GPIO_PIN_14, &x);

    /* PE7--> PEN */
    x.mode = GPIO_MODE_INPUT;
    x.odos = GPIO_PUSH_PULL;
    x.pupd = GPIO_PUSH_UP;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_TTL;
    x.func = GPIO_FUNC_1;
    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(触控检测);

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

    x.mode = GPIO_MODE_OUTPUT;
    x.odos = GPIO_PUSH_PULL;
    x.pupd = GPIO_PUSH_UP;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_TTL;
    x.func = GPIO_FUNC_1;

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

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

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

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

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

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

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

    /* PA6 MISO INIT */
    /* MISO Initializes */
    x.mode = GPIO_MODE_INPUT;
    x.pupd = GPIO_PUSH_UP;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_TTL;
    x.func = GPIO_FUNC_6;
    ald_gpio_init(GPIOA, GPIO_PIN_6, &x);

    /* PC2--> PEN */
    x.mode = GPIO_MODE_INPUT;
    x.odos = GPIO_PUSH_PULL;
    x.pupd = GPIO_PUSH_UP;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_TTL;
    x.func = GPIO_FUNC_1;
    ald_gpio_init(GPIOC, GPIO_PIN_2, &x);

    /* Initialize external interrupt */
    exti.filter      = ENABLE;
    exti.cks         = EXTI_FILTER_CLOCK_32K;
    exti.filter_time = 100;
    ald_gpio_exti_init(GPIOC, GPIO_PIN_2, &exti);
    ald_gpio_exti_clear_flag_status(GPIO_PIN_2);
    ald_gpio_exti_interrupt_config(GPIO_PIN_2, EXTI_TRIGGER_TRAILING_EDGE, ENABLE);
    ald_mcu_irq_config(EXTI0_3_IRQn, 3, DISABLE);

    display->h_spi.perh           = SPI0;
    display->h_spi.init.mode      = SPI_MODE_MASTER;
    display->h_spi.init.dir       = SPI_DIRECTION_2LINES;
    display->h_spi.init.data_size = SPI_DATA_SIZE_8;
    display->h_spi.init.baud      = SPI_BAUD_8;
    display->h_spi.init.phase     = SPI_CPHA_FIRST;
    display->h_spi.init.polarity  = SPI_CPOL_LOW;
    display->h_spi.init.first_bit = SPI_FIRSTBIT_MSB;
    display->h_spi.init.ss_en     = DISABLE;
    display->h_spi.init.crc_calc  = DISABLE;
    display->h_spi.tx_cplt_cbk    = spi_tx_cbk;
    ald_spi_init(&display->h_spi);

    //lcd³õʼ»¯
    OLED_CS_CLR();
    OLED_RST_CLR();
    ald_delay_ms(20);
    OLED_RST_SET();
    ald_delay_ms(20);

    //************* Start Initial Sequence **********//
    lcd_wr_reg(display, 0xCF);
    lcd_wr_data8(display, 0x00);
    lcd_wr_data8(display, 0xD9);
    lcd_wr_data8(display, 0x30);

    lcd_wr_reg(display, 0xED);
    lcd_wr_data8(display, 0x64);
    lcd_wr_data8(display, 0x03);
    lcd_wr_data8(display, 0X12);
    lcd_wr_data8(display, 0X81);

    lcd_wr_reg(display, 0xE8);
    lcd_wr_data8(display, 0x85);
    lcd_wr_data8(display, 0x10);
    lcd_wr_data8(display, 0x78);

    lcd_wr_reg(display, 0xCB);
    lcd_wr_data8(display, 0x39);
    lcd_wr_data8(display, 0x2C);
    lcd_wr_data8(display, 0x00);
    lcd_wr_data8(display, 0x34);
    lcd_wr_data8(display, 0x02);

    lcd_wr_reg(display, 0xF7);
    lcd_wr_data8(display, 0x20);

    lcd_wr_reg(display, 0xEA);
    lcd_wr_data8(display, 0x00);
    lcd_wr_data8(display, 0x00);

    lcd_wr_reg(display, 0xC0);
    lcd_wr_data8(display, 0x21);

    lcd_wr_reg(display, 0xC1);
    lcd_wr_data8(display, 0x12);

    lcd_wr_reg(display, 0xC5);
    lcd_wr_data8(display, 0x32);
    lcd_wr_data8(display, 0x3C);

    lcd_wr_reg(display, 0xC7);
    lcd_wr_data8(display, 0xC1);

    lcd_wr_reg(display, 0x36);
    lcd_wr_data8(display, 0x08);

    lcd_wr_reg(display, 0x3A);
    lcd_wr_data8(display, 0x55);

    lcd_wr_reg(display, 0xB1);
    lcd_wr_data8(display, 0x00);
    lcd_wr_data8(display, 0x18);

    lcd_wr_reg(display, 0xB6);
    lcd_wr_data8(display, 0x0A);
    lcd_wr_data8(display, 0xA2);

    lcd_wr_reg(display, 0xF2);
    lcd_wr_data8(display, 0x00);

    lcd_wr_reg(display, 0x26);
    lcd_wr_data8(display, 0x01);

    lcd_wr_reg(display, 0xE0);
    lcd_wr_data8(display, 0x0F);
    lcd_wr_data8(display, 0x20);
    lcd_wr_data8(display, 0x1E);
    lcd_wr_data8(display, 0x09);
    lcd_wr_data8(display, 0x12);
    lcd_wr_data8(display, 0x0B);
    lcd_wr_data8(display, 0x50);
    lcd_wr_data8(display, 0XBA);
    lcd_wr_data8(display, 0x44);
    lcd_wr_data8(display, 0x09);
    lcd_wr_data8(display, 0x14);
    lcd_wr_data8(display, 0x05);
    lcd_wr_data8(display, 0x23);
    lcd_wr_data8(display, 0x21);
    lcd_wr_data8(display, 0x00);

    lcd_wr_reg(display, 0xE1);
    lcd_wr_data8(display, 0x00);
    lcd_wr_data8(display, 0x19);
    lcd_wr_data8(display, 0x19);
    lcd_wr_data8(display, 0x00);
    lcd_wr_data8(display, 0x12);
    lcd_wr_data8(display, 0x07);
    lcd_wr_data8(display, 0x2D);
    lcd_wr_data8(display, 0x28);
    lcd_wr_data8(display, 0x3F);
    lcd_wr_data8(display, 0x02);
    lcd_wr_data8(display, 0x0A);
    lcd_wr_data8(display, 0x08);
    lcd_wr_data8(display, 0x25);
    lcd_wr_data8(display, 0x2D);
    lcd_wr_data8(display, 0x0F);

    lcd_wr_reg(display, 0x11);
    ald_delay_ms(120);
    lcd_wr_reg(display, 0x29);

    bsp_tp_init(display);
}
这边要注意一点,对应的bsp_display.h中的一些宏定义,也要做如下修改:
#define OLED_CS_CLR()        ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 0);\
ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 1)
#define OLED_CS_SET()        ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 1);\
ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 0)
#define TOUCH_CS_Clr()        ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 0);\
ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 1)
#define TOUCH_CS_Set()        ald_gpio_write_pin(GPIOC, GPIO_PIN_0, 1);\
ald_gpio_write_pin(GPIOA, GPIO_PIN_1, 0)
#define OLED_RST_CLR() ald_gpio_write_pin(GPIOA, GPIO_PIN_3, 0)
#define OLED_RST_SET() ald_gpio_write_pin(GPIOA, GPIO_PIN_3, 1)
#define OLED_DC_CLR() ald_gpio_write_pin(GPIOA, GPIO_PIN_4, 0)
#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

粉丝