【UDOO NEO Extended 开发板试用体验】CM4内核通过GPIO驱动LCD

  • 我爱下载
  • LV5工程师
  • |      2017-08-30 15:44:35
  • 浏览量 1495
  • 回复:0
本帖最后由 我爱下载 于 2017-8-30 15:46 编辑 UDOO NEO使用M4内核驱动MxDOCK 本来使系统采用硬件SPI接口来驱动这个MXDOCK上的单色LCD的,但是研究了系统的端子后让我非常困惑。根据官方资料的说明,ECSPI5默认是分配给M4内核的,如图中所表示的, ECSPI5所对应的4个引脚分别为GPIO102,GPIO100,GPIO147,GPIO146 。 但是根据手册中的描述,GPIO102和GPIO100没有任何问题,但是GPIO147和GPIO146两个引脚却没有ECSPI5的功能。这让我非常迷茫,如果有大神明白希望可以给我解释一下。 基于以上的原因,我只好采用GPIO模式的方式来完成LCD的驱动。 UDOO NEO M4 pin MXDOCK LCD pin GPIO100 SPI SCK GPIO147 SPI MOSI GPIO146 LCD CS GPIO148 LCD RESET GPIO105 LCD CD 注:由于单色LCD没有数据回读,因此spi的MISO引脚直接被忽略了。 这个应用同样是基于nxp公司提供的FreeRTOS_BSP_1.0.1_iMX6SXSDK来完成的,在这个应用基础上修改:https://bbs.icxbk.com/community/forum.php?mod=viewthread&tid=97048&extra=page%3D1%26filter%3Dtypeid%26typeid%3D281 增加GPIO驱动功能: 在board.h中增加如下宏定义:/*get 5 pin for simulate spi*/#define BOARD_GPIO_SPI_SCK_RDC_PDAP rdcPdapGpio4#define BOARD_GPIO_SPI_SCK_CONFIG (&gpioSpiSckFunc1)#define BOARD_GPIO_SPI_SCK_IRQ_NUM GPIO4_INT15_0_IRQn#define BOARD_GPIO_SPI_SCK_HANDLER GPIO4_Combined_15_0_Handler #define BOARD_GPIO_SPI_MOSI_RDC_PDAP rdcPdapGpio5#define BOARD_GPIO_SPI_MOSI_CONFIG (&gpioSpiMosiFunc1)#define BOARD_GPIO_SPI_MOSI_IRQ_NUM GPIO4_INT31_16_IRQn#define BOARD_GPIO_SPI_MOSI_HANDLER GPIO4_Combined_31_16_Handler #define BOARD_GPIO_LCD_CS_RDC_PDAP rdcPdapGpio5#define BOARD_GPIO_LCD_CS_CONFIG (&gpioLCDCSFunc1)#define BOARD_GPIO_LCD_CS_IRQ_NUM GPIO5_INT31_16_IRQn#define BOARD_GPIO_LCD_CS_HANDLER GPIO5_Combined_31_16_Handler #define BOARD_GPIO_LCD_RST_RDC_PDAP rdcPdapGpio5#define BOARD_GPIO_LCD_RST_CONFIG (&gpioLCDRSTFunc1)#define BOARD_GPIO_LCD_RST_IRQ_NUM GPIO5_INT31_16_IRQn#define BOARD_GPIO_LCD_RST_HANDLER GPIO5_Combined_31_16_Handler #define BOARD_GPIO_LCD_CD_RDC_PDAP rdcPdapGpio4#define BOARD_GPIO_LCD_CD_CONFIG (&gpioLCDCDFunc1)#define BOARD_GPIO_LCD_CD_IRQ_NUM GPIO5_INT31_16_IRQn#define BOARD_GPIO_LCD_CD_HANDLER GPIO5_Combined_31_16_Handler 在gpio_ctrl.c中增加:static void GPIO_Ctrl_InitSPIPin(){#ifdef BOARD_GPIO_SPI_SCK_CONFIG gpio_init_config_t sckInit = { .pin =BOARD_GPIO_SPI_SCK_CONFIG->pin, .direction =gpioDigitalOutput, .interruptMode = gpioNoIntmode }; gpio_init_config_t mosiInit = { .pin =BOARD_GPIO_SPI_MOSI_CONFIG->pin, .direction =gpioDigitalOutput, .interruptMode = gpioNoIntmode }; gpio_init_config_t csInit = { .pin =BOARD_GPIO_LCD_CS_CONFIG->pin, .direction =gpioDigitalOutput, .interruptMode = gpioNoIntmode }; gpio_init_config_t rstInit = { .pin =BOARD_GPIO_LCD_RST_CONFIG->pin, .direction =gpioDigitalOutput, .interruptMode = gpioNoIntmode }; gpio_init_config_t cdInit = { .pin =BOARD_GPIO_LCD_CD_CONFIG->pin, .direction =gpioDigitalOutput, .interruptMode = gpioNoIntmode }; /* Acquire RDC semaphore before access GPIO to avoid conflict, it's * necessary when GPIO RDC is configured asSemaphore Required */ RDC_SEMAPHORE_Lock(BOARD_GPIO_SPI_SCK_RDC_PDAP); GPIO_Init(BOARD_GPIO_SPI_SCK_CONFIG->base, &sckInit); RDC_SEMAPHORE_Unlock(BOARD_GPIO_SPI_SCK_RDC_PDAP); RDC_SEMAPHORE_Lock(BOARD_GPIO_SPI_MOSI_RDC_PDAP); GPIO_Init(BOARD_GPIO_SPI_MOSI_CONFIG->base, &mosiInit); RDC_SEMAPHORE_Unlock(BOARD_GPIO_SPI_MOSI_RDC_PDAP); RDC_SEMAPHORE_Lock(BOARD_GPIO_LCD_CS_RDC_PDAP); GPIO_Init(BOARD_GPIO_LCD_CS_CONFIG->base, &csInit); RDC_SEMAPHORE_Unlock(BOARD_GPIO_LCD_CS_RDC_PDAP); RDC_SEMAPHORE_Lock(BOARD_GPIO_LCD_RST_RDC_PDAP); GPIO_Init(BOARD_GPIO_LCD_RST_CONFIG->base, &rstInit); RDC_SEMAPHORE_Unlock(BOARD_GPIO_LCD_RST_RDC_PDAP); RDC_SEMAPHORE_Lock(BOARD_GPIO_LCD_CD_RDC_PDAP); GPIO_Init(BOARD_GPIO_LCD_CD_CONFIG->base, &cdInit); RDC_SEMAPHORE_Unlock(BOARD_GPIO_LCD_CD_RDC_PDAP);#endif} void GPIO_Ctrl_WriteSck(bool st){#ifdef BOARD_GPIO_SPI_SCK_CONFIG RDC_SEMAPHORE_Lock(BOARD_GPIO_SPI_SCK_RDC_PDAP); GPIO_WritePinOutput(BOARD_GPIO_SPI_SCK_CONFIG->base, BOARD_GPIO_SPI_SCK_CONFIG->pin, st ? gpioPinSet : gpioPinClear); RDC_SEMAPHORE_Unlock(BOARD_GPIO_SPI_SCK_RDC_PDAP);#endif} void GPIO_Ctrl_WriteMosi(bool st){#ifdef BOARD_GPIO_SPI_MOSI_CONFIG RDC_SEMAPHORE_Lock(BOARD_GPIO_SPI_MOSI_RDC_PDAP); GPIO_WritePinOutput(BOARD_GPIO_SPI_MOSI_CONFIG->base, BOARD_GPIO_SPI_MOSI_CONFIG->pin, st ? gpioPinSet : gpioPinClear); RDC_SEMAPHORE_Unlock(BOARD_GPIO_SPI_MOSI_RDC_PDAP);#endif} void GPIO_Ctrl_WriteCs(bool st){#ifdef BOARD_GPIO_LCD_CS_CONFIG RDC_SEMAPHORE_Lock(BOARD_GPIO_LCD_CS_RDC_PDAP); GPIO_WritePinOutput(BOARD_GPIO_LCD_CS_CONFIG->base, BOARD_GPIO_LCD_CS_CONFIG->pin, st ? gpioPinSet : gpioPinClear); RDC_SEMAPHORE_Unlock(BOARD_GPIO_LCD_CS_RDC_PDAP);#endif} void GPIO_Ctrl_WriteRst(bool st){#ifdef BOARD_GPIO_LCD_RST_CONFIG RDC_SEMAPHORE_Lock(BOARD_GPIO_LCD_RST_RDC_PDAP); GPIO_WritePinOutput(BOARD_GPIO_LCD_RST_CONFIG->base, BOARD_GPIO_LCD_RST_CONFIG->pin, st ? gpioPinSet : gpioPinClear); RDC_SEMAPHORE_Unlock(BOARD_GPIO_LCD_RST_RDC_PDAP);#endif} void GPIO_Ctrl_WriteCd(bool st){#ifdef BOARD_GPIO_LCD_CD_CONFIG RDC_SEMAPHORE_Lock(BOARD_GPIO_LCD_CD_RDC_PDAP); GPIO_WritePinOutput(BOARD_GPIO_LCD_CD_CONFIG->base, BOARD_GPIO_LCD_CD_CONFIG->pin, st ? gpioPinSet : gpioPinClear); RDC_SEMAPHORE_Unlock(BOARD_GPIO_LCD_CD_RDC_PDAP);#endif}在void GPIO_Ctrl_Init()函数中增加: GPIO_Ctrl_InitSPIPin(); 在gpio_ctrl.h中增加如下代码:void GPIO_Ctrl_WriteSck(bool st);void GPIO_Ctrl_WriteMosi(bool st);void GPIO_Ctrl_WriteCs(bool st);void GPIO_Ctrl_WriteRst(bool st);void GPIO_Ctrl_WriteCd(bool st); 修改lcd.h文件:#include "board.h" #include "gpio_ctrl.h" #define LCD_CS_HIGH() GPIO_Ctrl_WriteCs(1)#define LCD_CS_LOW() GPIO_Ctrl_WriteCs(0)#define LCD_CD_HIGH() GPIO_Ctrl_WriteCd(1)#define LCD_CD_LOW() GPIO_Ctrl_WriteCd(0)#define LCD_RST_HIGH() GPIO_Ctrl_WriteRst(1)#define LCD_RST_LOW() GPIO_Ctrl_WriteRst(0) #define SW_SPI /*使用模式spi通讯*/#ifdef SW_SPI// #defineLCD_SPI_SEND(x) SW_SPI_RxTx(x) #defineLCD_CLK_HIGH() GPIO_Ctrl_WriteSck(1) #defineLCD_CLK_LOW() GPIO_Ctrl_WriteSck(0) #defineLCD_DATA_HIGH() GPIO_Ctrl_WriteMosi(1) #defineLCD_DATA_LOW() GPIO_Ctrl_WriteMosi(0)#else。。。。。。 在 main.c中添加任务lcdTask,并创建lcdTask原型。/******************************************************************************** Function Name: main* Comments: main function, toggle LED andswitch the blinking frequency by key.*******************************************************************************/int main(void){ /* Initialize board specified hardware. */ hardware_init(); Hw_Timer_Init(); GPIO_Ctrl_Init(); PRINTF("\n\r=================Blinking Demo==================\n\r"); /* Create a the APP main task. */ xTaskCreate(ToggleTask, "Toggle Task",configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1,NULL); xTaskCreate(SwitchTask, "Switch Task",configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+2,NULL); xTaskCreate(LcdTask, "LCD Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3,NULL); /* Start FreeRTOS scheduler. */ vTaskStartScheduler(); /* should never reach this point. */ while (true);} /******************************************************************************** Function Name: LcdTask* Comments: this task is used to displayblink interval.*******************************************************************************/void LcdTask(void *pvParameters){ charstr; PRINTF("------LCDTask Start---------\n\r"); LCD_Initialize();// LCD_FillUpdate(ManleyLogo); LCD_PutString(16,20, "UDOO NEO M4"); LCD_PutString(16,40, "Blinking :0000ms"); while (true) { sprintf(str,"Blinking:%4dms",blinkingInterval); LCD_PutString(16,40, str); /* Delay for 1 second to avoid glitch */ vTaskDelay(configTICK_RATE_HZ); }} 源文件准备完成后,还是不能编译,因为必须要修改makefile文件,由于SDK采用是CMake的方式生成makefile,所以我们必须修改相应的cmakelist.txt文件打开cmakelist.txt文件后,在# ADD_EXECUTABLEADD_EXECUTABLE(blinking_imx_demo_epit 下面增加 "${ProjDirPath}/../lcd.c""${ProjDirPath}/../lcd.h"两行内容。 这其中的lcd.c和lcd.h文件来自MXDOCK的驱动程序。 系统接线及运行效果图:
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子