|
У кого-нибудь есть готовый пример проекта с дисплеем ILI9320 и FSMC на 100 ногий контроллер? |
|
|
|
Apr 6 2013, 11:27
|
Местный
  
Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856

|
Цитата(Salamander @ Apr 6 2013, 13:58)  ПОпытался переделать таковой под Z серию - что-то не работает... может вот это поможет: http://code.google.com/p/rt-thread/source/...ili9320.c?r=438https://github.com/AndreyFursov/AFGUIЯ неделю уже воюю с ILI9325, но я через "ногодрыгательство" по 16 битной шине, на STM32F100RB. Щас возник вопрос чем "приготовить" картинки в удобном виде для вписывания в флеш контроллера. Ну и с отрисовкой шрифтов тоже есть проблемы. Так что если есть что почитать на данную тему буду рад.
|
|
|
|
|
Apr 6 2013, 12:24
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(DASM @ Apr 6 2013, 15:47)  Тем что нужен FSMC. Цитата(alexdos @ Apr 6 2013, 15:27)  может вот это поможет: http://code.google.com/p/rt-thread/source/...ili9320.c?r=438https://github.com/AndreyFursov/AFGUIЯ неделю уже воюю с ILI9325, но я через "ногодрыгательство" по 16 битной шине, на STM32F100RB. Щас возник вопрос чем "приготовить" картинки в удобном виде для вписывания в флеш контроллера. Ну и с отрисовкой шрифтов тоже есть проблемы. Так что если есть что почитать на данную тему буду рад. Тут какая-то фигня с разводкой FSMC http://code.google.com/p/rt-thread/source/...ili9320.c?r=438Код /***************************** ** Ó²¼þÁ¬½Ó˵Ã÷ ** ** STM32 ili9320 ** ** PE0~15 <----> DB0~15 ** ** PD15 <----> nRD ** ** PD14 <----> RS ** ** PD13 <----> nWR ** ** PD12 <----> nCS ** ** PD11 <----> nReset ** ** PC0 <----> BK_LED ** ******************************/
|
|
|
|
|
Apr 6 2013, 14:45
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Нашел библиотеку, пытаюсь прикрутить. Вопрос собственно по FSMC CODE static void LCD_CtrlLinesConfig(void) { GPIO_InitTypeDef GPIO_InitStructure;
/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO, ENABLE);
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14), PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), PE.14(D11), PE.15(D12) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_WriteBit(GPIOE, GPIO_Pin_6, Bit_SET); /* Set PF.00(A0 (RS)) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_11; GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PD.7(NE1 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOD, &GPIO_InitStructure); }
/******************************************************************************* * Function Name : LCD_FSMCConfig * Description : Configures the Parallel interface (FSMC) for LCD(Parallel mode) * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_FSMCConfig(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p;
/*-- FSMC Configuration ------------------------------------------------------*/ /*----------------------- SRAM Bank 4 ----------------------------------------*/ /* FSMC_Bank1_NORSRAM4 configuration */ p.FSMC_AddressSetupTime = 0; p.FSMC_AddressHoldTime = 0; p.FSMC_DataSetupTime = 2; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_A;
/* Color LCD configuration ------------------------------------ LCD configured as follow: - Data/Address MUX = Disable - Memory Type = SRAM - Data Width = 16bit - Write Operation = Enable - Extended Mode = Enable - Asynchronous Wait = Disable */ FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM2; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM2, ENABLE); } У меня, чисто из соображдений удобства разводки вместо A0 используется A16. А вместо NE4 - NE1. В конфигурации ножек вроде бы все поменял. Где менять A0 на A16 ?
Сообщение отредактировал IgorKossak - Apr 7 2013, 08:30
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Apr 6 2013, 19:11
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Таки сломал весь мозг... Уже и мнотаж и исправность пинов проверял - все ОК. А экран не закрашивается... CODE /******************** © COPYRIGHT 2008 STMicroelectronics ******************** * File Name : lcd.c * Author : MCD Application Team * Version : V1.0.0 * Date : 07/22/2008 * Description : This file includes the LCD driver for AM-240320L8TNQW00H * (LCD_ILI9320) Liquid Crystal Display Module of STM3210E-EVAL * board. ******************************************************************************** * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. *******************************************************************************/
/* Includes ------------------------------------------------------------------*/ //#include "fonts.h" #include "lcd.h" #include "stm32f10x.h" #include "stm32f10x_fsmc.h" /* Private typedef -----------------------------------------------------------*/ typedef struct { vu16 LCD_REG; vu16 LCD_RAM; } LCD_TypeDef;
/* LCD is connected to the FSMC_Bank1_NOR/SRAM1 and NE4 is used as ship select signal */ #define LCD_BASE ((u32)0x60000000) #define LCD ((LCD_TypeDef *) LCD_BASE)
/* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Global variables to set the written text color */ static vu16 TextColor = 0x0000, BackColor = 0xFFFF; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/
/******************************************************************************* * Function Name : STM3210E_LCD_Init * Description : Initializes the LCD. * Input : None * Output : None * Return : None *******************************************************************************/ void STM3210E_LCD_Init(void) { /* Configure the LCD Control pins --------------------------------------------*/ LCD_CtrlLinesConfig();
/* Configure the FSMC Parallel interface -------------------------------------*/ LCD_FSMCConfig();
Delay(50); /* delay 50 ms */ /* Start Initial Sequence ----------------------------------------------------*/ LCD_WriteReg(0x00E3,0x3008); /* Set the internal vcore voltage */ LCD_WriteReg(0x00E7, 0x0012); // Set internal timing LCD_WriteReg(0x00EF, 0x1231); // Set internal timing LCD_WriteReg(R0, 0x0001); /* Start internal OSC. */ LCD_WriteReg(R1, 0x0100); /* set SS and SM bit */ LCD_WriteReg(R2, 0x0200); /* set 1 line inversion */ LCD_WriteReg(R3, 0x1030); /* set GRAM write direction and BGR=1. */ LCD_WriteReg(R4, 0x0000); /* Resize register */ LCD_WriteReg(R8, 0x0207); /* set the back porch and front porch */ LCD_WriteReg(R9, 0x0000); /* set non-display area refresh cycle ISC[3:0] */ LCD_WriteReg(R10, 0x0000); /* FMARK function */ LCD_WriteReg(R12, 0x0000); /* RGB interface setting */ LCD_WriteReg(R13, 0x0000); /* Frame marker Position */ LCD_WriteReg(R15, 0x0000); /* RGB interface polarity */
//LCD_WriteReg(0x00e5,0x78F0); /* Power On sequence ---------------------------------------------------------*/ LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_WriteReg(R17, 0x0007); /* DC1[2:0], DC0[2:0], VC[2:0] */ LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */ LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude */ LCD_WriteReg(0x0007, 0x0001); Delay(200); /* Dis-charge capacitor power voltage (200ms) */ LCD_WriteReg(R16, 0x1690); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_WriteReg(R17, 0x0227); /* DC1[2:0], DC0[2:0], VC[2:0] */ Delay(50); /* Delay 50 ms */ LCD_WriteReg(R18, 0x000D); /* VREG1OUT voltage */ Delay(50); /* Delay 50 ms */ LCD_WriteReg(R19, 0x1200); /* VDV[4:0] for VCOM amplitude */ LCD_WriteReg(R41, 0x000A); /* VCM[4:0] for VCOMH */ LCD_WriteReg(0x002B, 0x000D); Delay(50); /* Delay 50 ms */ LCD_WriteReg(R32, 0x0000); /* GRAM horizontal Address */ LCD_WriteReg(R33, 0x0000); /* GRAM Vertical Address */
/* Adjust the Gamma Curve ----------------------------------------------------*/ LCD_WriteReg(R48, 0x0000); LCD_WriteReg(R49, 0x0404); LCD_WriteReg(R50, 0x0003); LCD_WriteReg(R53, 0x0405); LCD_WriteReg(R54, 0x0808); LCD_WriteReg(R55, 0x0407); LCD_WriteReg(R56, 0x0303); LCD_WriteReg(R57, 0x0707); LCD_WriteReg(R60, 0x0504); LCD_WriteReg(R61, 0x0808); /* Set GRAM area -------------------------------------------------------------*/ LCD_WriteReg(R80, 0x0000); /* Horizontal GRAM Start Address */ LCD_WriteReg(R81, 0x00EF); /* Horizontal GRAM End Address */ LCD_WriteReg(R82, 0x0000); /* Vertical GRAM Start Address */ LCD_WriteReg(R83, 0x013F); /* Vertical GRAM End Address */
LCD_WriteReg(R96, 0xA700); /* Gate Scan Line */ LCD_WriteReg(R97, 0x0001); /* NDL,VLE, REV */ LCD_WriteReg(R106, 0x0000); /* set scrolling line */
/* Partial Display Control ---------------------------------------------------*/ LCD_WriteReg(R128, 0x0000); LCD_WriteReg(R129, 0x0000); LCD_WriteReg(R130, 0x0000); LCD_WriteReg(R131, 0x0000); LCD_WriteReg(R132, 0x0000); LCD_WriteReg(R133, 0x0000);
/* Panel Control -------------------------------------------------------------*/ LCD_WriteReg(R144, 0x0010); LCD_WriteReg(R146, 0x0000); LCD_WriteReg(0x0007, 0x0133); /* LCD_WriteReg(R149, 0x0110); LCD_WriteReg(R151, 0x0000); LCD_WriteReg(R152, 0x0000);*/
/* Set GRAM write direction and BGR = 1 */ /* I/D=01 (Horizontal : increment, Vertical : decrement) */ /* AM=1 (address is updated in vertical writing direction) */ LCD_WriteReg(R3, 0x1018);
LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */ }
/******************************************************************************* * Function Name : LCD_WriteReg * Description : Writes to the selected LCD register. * Input : - LCD_Reg: address of the selected register. * - LCD_RegValue: value to write to the selected register. * Output : None * Return : None *******************************************************************************/ void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue) { /* Write 16-bit Index, then Write Reg */ LCD->LCD_REG = LCD_Reg; /* Write 16-bit Reg */ LCD->LCD_RAM = LCD_RegValue; }
/******************************************************************************* * Function Name : LCD_ReadReg * Description : Reads the selected LCD Register. * Input : None * Output : None * Return : LCD Register Value. *******************************************************************************/ u16 LCD_ReadReg(u8 LCD_Reg) { /* Write 16-bit Index (then Read Reg) */ LCD->LCD_REG = LCD_Reg; /* Read 16-bit Reg */ return (LCD->LCD_RAM); }
/******************************************************************************* * Function Name : LCD_WriteRAM_Prepare * Description : Prepare to write to the LCD RAM. * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_WriteRAM_Prepare(void) { LCD->LCD_REG = R34; }
/******************************************************************************* * Function Name : LCD_WriteRAM * Description : Writes to the LCD RAM. * Input : - RGB_Code: the pixel color in RGB mode (5-6-5). * Output : None * Return : None *******************************************************************************/ void LCD_WriteRAM(u16 RGB_Code) { /* Write 16-bit GRAM Reg */ LCD->LCD_RAM = RGB_Code; }
/******************************************************************************* * Function Name : LCD_ReadRAM * Description : Reads the LCD RAM. * Input : None * Output : None * Return : LCD RAM Value. *******************************************************************************/ u16 LCD_ReadRAM(void) { /* Write 16-bit Index (then Read Reg) */ LCD->LCD_REG = R34; /* Select GRAM Reg */ /* Read 16-bit Reg */ return LCD->LCD_RAM; }
/******************************************************************************* * Function Name : LCD_PowerOn * Description : Power on the LCD. * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_PowerOn(void) { /* Power On sequence ---------------------------------------------------------*/ LCD_WriteReg(R16, 0x0000); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_WriteReg(R17, 0x0000); /* DC1[2:0], DC0[2:0], VC[2:0] */ LCD_WriteReg(R18, 0x0000); /* VREG1OUT voltage */ LCD_WriteReg(R19, 0x0000); /* VDV[4:0] for VCOM amplitude*/ Delay(200); /* Dis-charge capacitor power voltage (200ms) */ LCD_WriteReg(R16, 0x17B0); /* SAP, BT[3:0], AP, DSTB, SLP, STB */ LCD_WriteReg(R17, 0x0137); /* DC1[2:0], DC0[2:0], VC[2:0] */ Delay(50); /* Delay 50 ms */ LCD_WriteReg(R18, 0x0139); /* VREG1OUT voltage */ Delay(50); /* Delay 50 ms */ LCD_WriteReg(R19, 0x1d00); /* VDV[4:0] for VCOM amplitude */ LCD_WriteReg(R41, 0x0013); /* VCM[4:0] for VCOMH */ Delay(50); /* Delay 50 ms */ LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */ }
/******************************************************************************* * Function Name : LCD_DisplayOn * Description : Enables the Display. * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_DisplayOn(void) { /* Display On */ LCD_WriteReg(R7, 0x0173); /* 262K color and display ON */ }
/******************************************************************************* * Function Name : LCD_DisplayOff * Description : Disables the Display. * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_DisplayOff(void) { /* Display Off */ LCD_WriteReg(R7, 0x0); }
/******************************************************************************* * Function Name : RESET_line_config * Description : Configures LCD Reset * Input : None * Output : None * Return : None *******************************************************************************/ void RESET_line_config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/******************************************************************************* * Function Name : LCD_CtrlLinesConfig * Description : Configures LCD Control lines (FSMC Pins) in alternate function Push-Pull mode. * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_CtrlLinesConfig(void) { GPIO_InitTypeDef GPIO_InitStructure;
/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE /*| RCC_APB2Periph_AFIO*/, ENABLE);
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.07(NE1/CS), PD.08(D13), PD.09(D14), PD.10(D15), PD.11(A16/RS) PD.14(D0), PD.15(D1) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), PE.14(D11), PE.15(D12) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/******************************************************************************* * Function Name : LCD_FSMCConfig * Description : Configures the Parallel interface (FSMC) for LCD(Parallel mode) * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_FSMCConfig(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p;
/*-- FSMC Configuration ------------------------------------------------------*/ /* FSMC_Bank1_NORSRAM4 timing configuration */ p.FSMC_AddressSetupTime = 1; p.FSMC_AddressHoldTime = 0; p.FSMC_DataSetupTime = 2; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_B;
/* FSMC_Bank1_NORSRAM4 configured as follows: - Data/Address MUX = Disable - Memory Type = SRAM - Data Width = 16bit - Write Operation = Enable - Extended Mode = Disable - Asynchronous Wait = Disable */ FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = 0x00; //FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; // FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC_Bank1_NORSRAM1 */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); }
/******************* © COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
Сообщение отредактировал IgorKossak - Apr 7 2013, 08:32
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Apr 7 2013, 13:49
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата Ссылочку на панель применённую вами (не на чип) приложите. Так я не с панелью работаю, а с собственной платой. Ссылка на нее http://electronix.ru/forum/index.php?showtopic=109835Цитата Вместо FSMC использовать "ногодрыг" попробуйте ОК. Тогда придется раскидывать 16 бит слова данных... Я с утра уже голову ломаю - что-то не получается. DA0-DA15 разкиданы по портам D и E. С портом E у меня получилось писать биты слова 4-12 в биты порта 7-15: GPIOE=((СЛОВО_ДАННЫХ <<3) & 0xFF80); А как с портом D быть? Там должно быть так: А именно GPIOD.0 = бит_данных.2 GPIOD.1 - бит_данных.3 GPIOD.8 - бит_данных.13 GPIOD.9 - бит_данных.14 GPIOD.10 - бит_данных.15 GPIOD.14 - бит_данных.0 GPIOD.15 - бит_данных.1 Подскажите пожалуйста. Тихо сам с собою.... Получилось писать вот так: Цитата GPIOE=((SRC <<3) & 0xFF80);
GPIOD &= ~(0xC703); //очищаем все биты которые будем копировать GPIOD |= (SRC & 0x0004) >> (2-0); //выделили 2й бит и сдвинули его на нулевую позицию GPIOD |= (SRC & 0x0008) >> (3-1);//выделили 3й бит и сдвинули на 1ю позицию GPIOD |= (SRC & 0x2000) >> (13-8);//выделили 13й бит и сдвинули на 8ю позицию GPIOD |= (SRC & 0x4000) >> (14-9);//выделили 14й бит и сдвинули на 9ю позицию GPIOD |= (SRC & 0x8000) >> (15-10);//выделили 15й бит и сдвинули на 10ю позицию
GPIOD |= (SRC & 0x0001) << (14);//выделили 0й бит и сдвинули на 14ю позицию GPIOD |= (SRC & 0x0002) << (14);//выделили 1й бит и сдвинули на 15ю позицию Теперь попробую читать...
Сообщение отредактировал Salamander - Apr 7 2013, 13:11
|
|
|
|
|
Apr 7 2013, 23:25
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Хочу обратить Ваше внимание на диапазон допустимых напряжений питания контроллера дисплея. То, что в даташите написано до 3.3 вольта - это верхняя граница вместе с отклонениями. т.е., 2.9...3.0 для этого дисплея было бы в самый раз. Серьёзно обращать внимание на это стоит потому, что иногда дисплеи перестают работать... Например, в контроллере дисплея LPH88 при 3.3 вольт питания в девяти из десяти случаев не включался преобразователь приания LCD. Попробуйте понизить всё питание платы, или, в крайнем случае, - поставить диод последовательно в питание дисплея.
UPD: Хотя, в evaluation board от ST панель с данным контроллером подключена к +3.3 напрямую. А проверьте, хоть chip id читается? Это должно происходить независимо от состояния преобразователя или инициализированности развёрток панели.
Upd2: Что стряслось? Биты не в том порядке развели?
Сообщение отредактировал Genadi Zawidowski - Apr 7 2013, 23:33
|
|
|
|
|
Apr 8 2013, 02:54
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
КТо рано встает, тому бог подает.
Встал в 5 утра и копался.... ПРозвонил каждый бит, проверил пайку, убедился что каждый бит попадает на шлейф дисплея - не работает. И вот только что, похоже причину нашел. Оказывается, эти китайские дисплеи очень тонкие, чувственные натуры - требуют чтения данных из себя. Я взял китайскую плату, с заведомо рабочим железом и кодом. Функция LCD_ReadReg встречается один лишь раз - в чтении идентификатора (тип дисплея). А дальше, в зависимости от типа дисплея соответствующий код. Я закомментировал LCD_ReadReg и указал тип дисплея - не работает. Я даже тип дисплея предварительно прочитал.
В FSMC библиотеке, что я использовал, тип дисплея не читался.
|
|
|
|
|
Apr 9 2013, 17:53
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Даташит выкладываю. Господа, раскидыванием битов я добился работы дисплея в ногодрыгательном режиме. То есть исправность контроллера, исправность дисплея и правильность монтажа подтвердились. Помогите что ли с настройкой смаого FSMC. Есть в частности два вопроса: 1. У меня 100-ногий контроллер, соответственно, использую адресную линию A16. Чему в этом случае должен быть равен параметр FSMC_NORSRAMInitStructure.FSMC_DataAddressMux - Enable или Disable? В интернете крайне противоречивая информация об этом. 2. Адрес первого банка - правильно ли я указал Код #define LCD_BASE ((u32)0x60020000) #define LCD ((LCD_TypeDef *) LCD_BASE) Вот инициализация: CODE /******************************************************************************* * Function Name : RESET_line_config * Description : Configures LCD Reset * Input : None * Output : None * Return : None *******************************************************************************/ void RESET_line_config(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/******************************************************************************* * Function Name : LCD_CtrlLinesConfig * Description : Configures LCD Control lines (FSMC Pins) in alternate function Push-Pull mode. * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_CtrlLinesConfig(void) { GPIO_InitTypeDef GPIO_InitStructure;
/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.07(NE1/CS), PD.08(D13), PD.09(D14), PD.10(D15), PD.11(A16/RS) PD.14(D0), PD.15(D1) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), PE.14(D11), PE.15(D12) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/******************************************************************************* * Function Name : LCD_FSMCConfig * Description : Configures the Parallel interface (FSMC) for LCD(Parallel mode) * Input : None * Output : None * Return : None *******************************************************************************/ void LCD_FSMCConfig(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p;
/*-- FSMC Configuration ------------------------------------------------------*/ /* FSMC_Bank1_NORSRAM4 timing configuration */ p.FSMC_AddressSetupTime = 1; p.FSMC_AddressHoldTime = 0; p.FSMC_DataSetupTime = 2; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_B;
/* FSMC_Bank1_NORSRAM4 configured as follows: - Data/Address MUX = Disable - Memory Type = SRAM - Data Width = 16bit - Write Operation = Enable - Extended Mode = Disable - Asynchronous Wait = Disable */ FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = 0x00; //FSMC_MemoryType_SRAM; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC_Bank1_NORSRAM1 */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); }
/******************* © COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
Ну и запуск - два варианта: CODE void LCD_Init(void) { static uint16_t DeviceCode; unsigned char i; /* Configure the LCD Control pins --------------------------------------------*/ LCD_CtrlLinesConfig(); /* Configure the FSMC Parallel interface -------------------------------------*/ LCD_FSMCConfig();
LCD_WriteReg(0x0000,0x0001); Delay(5); // LCD_Delay 50 ms
DeviceCode = LCD_ReadReg(0x0000);
//DeviceCode=0x9325; if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325 { LCD_WriteReg(0x00e5,0x78F0); // LCD_WriteReg(0x0000,0x0001); LCD_WriteReg(0x0001,0x0100); LCD_WriteReg(0x0002,0x0700); LCD_WriteReg(0x0003,0x1030); LCD_WriteReg(0x0004,0x0000); LCD_WriteReg(0x0008,0x0202); LCD_WriteReg(0x0009,0x0000); LCD_WriteReg(0x000a,0x0000); LCD_WriteReg(0x000c,0x0001); LCD_WriteReg(0x000d,0x0000); LCD_WriteReg(0x000f,0x0000); //Power On sequence // LCD_WriteReg(0x0010,0x0000); LCD_WriteReg(0x0011,0x0007); LCD_WriteReg(0x0012,0x0000); LCD_WriteReg(0x0013,0x0000); LCD_WriteReg(0x0007,0x0001); Delay(5); LCD_WriteReg(0x0010,0x1690); LCD_WriteReg(0x0011,0x0227); Delay(5); LCD_WriteReg(0x0012,0x009d); Delay(5); LCD_WriteReg(0x0013,0x1900); LCD_WriteReg(0x0029,0x0025); LCD_WriteReg(0x002b,0x000d); Delay(5); LCD_WriteReg(0x0020,0x0000); LCD_WriteReg(0x0021,0x0000); Delay(5); //Ù¤ÂíУÕý LCD_WriteReg(0x0030,0x0007); LCD_WriteReg(0x0031,0x0303); LCD_WriteReg(0x0032,0x0003); LCD_WriteReg(0x0035,0x0206); LCD_WriteReg(0x0036,0x0008); LCD_WriteReg(0x0037,0x0406); LCD_WriteReg(0x0038,0x0304); LCD_WriteReg(0x0039,0x0007); LCD_WriteReg(0x003c,0x0602); LCD_WriteReg(0x003d,0x0008); Delay(5); LCD_WriteReg(0x0050,0x0000); LCD_WriteReg(0x0051,0x00ef); LCD_WriteReg(0x0052,0x0000); LCD_WriteReg(0x0053,0x013f); LCD_WriteReg(0x0060,0xa700); LCD_WriteReg(0x0061,0x0001); LCD_WriteReg(0x006a,0x0000); LCD_WriteReg(0x0080,0x0000); LCD_WriteReg(0x0081,0x0000); LCD_WriteReg(0x0082,0x0000); LCD_WriteReg(0x0083,0x0000); LCD_WriteReg(0x0084,0x0000); LCD_WriteReg(0x0085,0x0000); LCD_WriteReg(0x0090,0x0010); LCD_WriteReg(0x0092,0x0600); LCD_WriteReg(0x0007,0x0133); } else if(DeviceCode==0x9320||DeviceCode==0x9300) { LCD_WriteReg(0x00,0x0000); LCD_WriteReg(0x01,0x0100); //Driver Output Contral. LCD_WriteReg(0x02,0x0700); //LCD Driver Waveform Contral. LCD_WriteReg(0x03,0x1030);//Entry Mode Set. //LCD_WriteReg(0x03,0x1018); //Entry Mode Set. LCD_WriteReg(0x04,0x0000); //Scalling Contral. LCD_WriteReg(0x08,0x0202); //Display Contral 2.(0x0207) LCD_WriteReg(0x09,0x0000); //Display Contral 3.(0x0000) LCD_WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000) LCD_WriteReg(0x0c,(1<<0)); //Extern Display Interface Contral 1.(0x0000) LCD_WriteReg(0x0d,0x0000); //Frame Maker Position. LCD_WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2. Delay(10); LCD_WriteReg(0x07,0x0101); //Display Contral. Delay(10); LCD_WriteReg(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //Power Control 1.(0x16b0) LCD_WriteReg(0x11,0x0007); //Power Control 2.(0x0001) LCD_WriteReg(0x12,(1<<8)|(1<<4)|(0<<0)); //Power Control 3.(0x0138) LCD_WriteReg(0x13,0x0b00); //Power Control 4. LCD_WriteReg(0x29,0x0000); //Power Control 7. LCD_WriteReg(0x2b,(1<<14)|(1<<4)); LCD_WriteReg(0x50,0); //Set X Star //ˮƽGRAMÖÕֹλÖÃSet X End. LCD_WriteReg(0x51,239); //Set Y Star LCD_WriteReg(0x52,0); //Set Y End.t. LCD_WriteReg(0x53,319); // LCD_WriteReg(0x60,0x2700); //Driver Output Control. LCD_WriteReg(0x61,0x0001); //Driver Output Control. LCD_WriteReg(0x6a,0x0000); //Vertical Srcoll Control. LCD_WriteReg(0x80,0x0000); //Display Position? Partial Display 1. LCD_WriteReg(0x81,0x0000); //RAM Address Start? Partial Display 1. LCD_WriteReg(0x82,0x0000); //RAM Address End-Partial Display 1. LCD_WriteReg(0x83,0x0000); //Displsy Position? Partial Display 2. LCD_WriteReg(0x84,0x0000); //RAM Address Start? Partial Display 2. LCD_WriteReg(0x85,0x0000); //RAM Address End? Partial Display 2. LCD_WriteReg(0x90,(0<<7)|(16<<0)); //Frame Cycle Contral.(0x0013) LCD_WriteReg(0x92,0x0000); //Panel Interface Contral 2.(0x0000) LCD_WriteReg(0x93,0x0001); //Panel Interface Contral 3. LCD_WriteReg(0x95,0x0110); //Frame Cycle Contral.(0x0110) LCD_WriteReg(0x97,(0<<8)); // LCD_WriteReg(0x98,0x0000); //Frame Cycle Contral. LCD_WriteReg(0x07,0x0173); //(0x0173) Delay(10); }
LCD_Clear(0x0FF0); }
В main.c CODE GPIOD->BSRR =GPIO_BSRR_BR12; //передергиваем RESET delay_ms(50); GPIOD->BSRR =GPIO_BSRR_BS12; delay_ms(50);
LCD_PowerOn(); LCD_DisplayOn(); STM3210E_LCD_Init();
/* Clear the LCD */ LCD_Clear(0x0000);
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|