本帖最后由 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----------
|