Всем привет.
Возникла проблема с подключением указанного модуля к плате Nucleo-STM32F743ZG. Пытаюсь подключить по FSMC, используя видеоуроки от Sappise. Однако дисплей не инициализируется, что бы я ни делал, только жизнерадостно горит подсветонька. Подключаю в режиме 16 бит, пример инициализации для контроллера дисплея (S6D1121) нашел здесь, на форуме, а также в программке одного поляка. Исходя из того, что они совпадают, пришел к выводу, что ошибка не в инициализации.
Инициализация F7 и модуля FSMC происходит с помощью HALCubeMX, тактовая частота на MCO совпадает с требуемой, а отладчик говорит, что весь код инициализации успешно выполняется, и программа переходит в главный цикл, то есть проблема не в зависании.
Инициализация FSMC (в F7 он обозначен как FMC):
CODE
/* FMC initialization function */
static void MX_FMC_Init(void)
{
FMC_NORSRAM_TimingTypeDef Timing;
/** Perform the SRAM1 memory initialization sequence
*/
hsram1.Instance = FMC_NORSRAM_DEVICE;
hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 255;
Timing.BusTurnAroundDuration = 15;
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FMC_ACCESS_MODE_A;
/* ExtTiming */
if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
Заголовочный файл с адресами для записи и чтения:
Код
#ifndef LCD_H
#define LCD_H
#include "stm32f7xx_hal.h"
#define CMD_ADR ((*(uint32_t*)0x60000000))
#define DAT_ADR ((*(uint32_t*)0x60020000))
#define S6D1121_GRAM 0x22
void lcdInit(void);
#endif
И файл с функциями:
CODE
#include "lcd.h"
void lcdWriteReg(uint16_t reg, uint16_t dat)
{
CMD_ADR = reg;
DAT_ADR = dat;
}
void lcdWriteDat(uint16_t dat)
{
DAT_ADR = dat;
}
uint16_t lcdReadReg(uint8_t LCD_Reg)
{
uint16_t val = 0;
CMD_ADR = LCD_Reg;
val = DAT_ADR; // Read 16-bit Reg
return val;
}
void lcdGRAMReady(void)
{
CMD_ADR = S6D1121_GRAM;
}
void lcdClear(uint32_t color)
{
lcdGRAMReady();
for (uint32_t i = 0; i < 320 * 240; i++)
{
DAT_ADR = color;
}
}
void lcdInit(void)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET);
HAL_Delay(1000);
// lcdReadReg(0x00);
lcdWriteReg(0x11,0x2004);
lcdWriteReg(0x13,0xCC00);
lcdWriteReg(0x15,0x2600);
lcdWriteReg(0x14,0x252A);
lcdWriteReg(0x12,0x0033);
lcdWriteReg(0x13,0xCC04);
HAL_Delay(5);
lcdWriteReg(0x13,0xCC06);
HAL_Delay(5);
lcdWriteReg(0x13,0xCC4F);
HAL_Delay(5);
lcdWriteReg(0x13,0x674F);
lcdWriteReg(0x11,0x2003);
HAL_Delay(5);
lcdWriteReg(0x30,0x2609);
lcdWriteReg(0x31,0x242C);
lcdWriteReg(0x32,0x1F23);
lcdWriteReg(0x33,0x2425);
lcdWriteReg(0x34,0x2226);
lcdWriteReg(0x35,0x2523);
lcdWriteReg(0x36,0x1C1A);
lcdWriteReg(0x37,0x131D);
lcdWriteReg(0x38,0x0B11);
lcdWriteReg(0x39,0x1210);
lcdWriteReg(0x3A,0x1315);
lcdWriteReg(0x3B,0x3619);
lcdWriteReg(0x3C,0x0D00);
lcdWriteReg(0x3D,0x000D);
lcdWriteReg(0x16,0x0007);
lcdWriteReg(0x02,0x0013);
lcdWriteReg(0x03,0x8003);
lcdWriteReg(0x01,0x0127);
HAL_Delay(5);
lcdWriteReg(0x08,0x0303);
lcdWriteReg(0x0A,0x000B);
lcdWriteReg(0x0B,0x0003);
lcdWriteReg(0x0C,0x0000);
lcdWriteReg(0x41,0x0000);
lcdWriteReg(0x50,0x0000);
lcdWriteReg(0x60,0x0005);
lcdWriteReg(0x70,0x000B);
lcdWriteReg(0x71,0x0000);
lcdWriteReg(0x78,0x0000);
lcdWriteReg(0x7A,0x0000);
lcdWriteReg(0x79,0x0007);
lcdWriteReg(0x07,0x0051);
HAL_Delay(5);
lcdWriteReg(0x07,0x0053);
lcdWriteReg(0x79,0x0000);
HAL_Delay(50);
lcdClear(0x0000);
HAL_Delay(50);
}
По идее, после инициализации дисплейчик должен окрашивать в жизнеутверждающий черный цвет, вот только этого ни разу не происходит.
Флешка на этом же модуле работает как часы.
Потратил уже несколько дней, но никакого решения проблемы так и не нашел, поэтому буду благодарен за любую помощь.
Сообщение отредактировал IgorKossak - Oct 17 2017, 18:00
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!