STM32 STM32, FSMC LCD display

Артём Баровик

✩✩✩✩✩✩✩
11 Май 2019
2
0
Здравствуйте, пытаюсь разобраться с протоколом FSMC, в частности подключить TFT дисплей, использую CMSIS для полного понимания изучения, проблема в следующем, дисплей не реагирует на команды которые я пытаюсь слать, использую библиотеку для ILI9341, которую не много переписал для CMSIS, думаю что проблема или в адресации или в инициализации самого протокола, не могли бы помочь, может что упускаю?

C:
void PortInit(void){
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; //Включаем тактирование порта GPIOD
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; //Включаем тактирование порта GPIOE
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; //Включаем тактирование порта GPIOB
    RCC->AHB3ENR |= RCC_AHB3ENR_FSMCEN; //Включаем тактирование порта FSMC

    GPIOB -> MODER |= (0b01<< GPIO_MODER_MODE1_Pos);//BL-PB1
    GPIOB -> OSPEEDR |= (0b00<< GPIO_OSPEEDR_OSPEED1_Pos);//BL-PB1
    GPIOB -> OTYPER |= (0b0<< GPIO_OTYPER_OT1_Pos);//BL-PB1
    GPIOB -> PUPDR |= (0b00<< GPIO_PUPDR_PUPD1_Pos);//BL-PB1
    GPIOB -> BSRR = (1 << (1+16));

    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE7_Pos);//CS-NE1-PD7
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE5_Pos);//WR-PD5
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE4_Pos);//RD-PD4
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE13_Pos);//RS-PD13-A18

    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE10_Pos);//D15-PD10
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE9_Pos);//D14-PD9
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE8_Pos);//D13-PD8
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE15_Pos);//D12-PE15
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE14_Pos);//D11-PE14
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE13_Pos);//D10-PE13
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE12_Pos);//D9-PE12
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE11_Pos);//D8-PE11
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE10_Pos);//D7-PE10
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE9_Pos);//D6-PE9
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE8_Pos);//D5-PE8
    GPIOE -> MODER |= (0b10<< GPIO_MODER_MODE7_Pos);//D4-PE7
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE1_Pos);//D3-PD1
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE0_Pos);//D2-PD0
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE15_Pos);//D1-PD15
    GPIOD -> MODER |= (0b10<< GPIO_MODER_MODE14_Pos);//D0-PD14

    FSMC_Bank1E->BWTR[FSMC_Bank1_NORSRAM1] = 0x0FFFFFFF;

                                                                                     // BCR&BTR Register
    FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM1] =
                                        0 << FSMC_BCR1_CBURSTRW_Pos  |       // write 0 - async 1 - sycnc
                                        0 << FSMC_BCR1_ASYNCWAIT_Pos |       // Wait signal during asynchronous transfers
                                        0 << FSMC_BCR1_EXTMOD_Pos    |       // Extended mode enable. Use BWTR register or no
                                        0 << FSMC_BCR1_WAITEN_Pos    |       // Wait enable bit.
                                        1 << FSMC_BCR1_WREN_Pos      |       // Write enable bit
                                        0 << FSMC_BCR1_WAITCFG_Pos   |       // Wait timing configuration. 0: NWAIT signal is active one data cycle before wait state 1: NWAIT signal is active during wait state
                                        0 << FSMC_BCR1_WRAPMOD_Pos   |       // Wrapped burst mode support
                                        0 << FSMC_BCR1_WAITPOL_Pos   |       // Wait signal polarity bit. 0: NWAIT active low. 1: NWAIT active high
                                        0 << FSMC_BCR1_BURSTEN_Pos   |       // Burst enable bit
                                        1 << FSMC_BCR1_FACCEN_Pos    |       // Flash access enable
                                        1 << FSMC_BCR1_MWID_Pos      |       // 0 = 8b 1 = 16b
                                        0 << FSMC_BCR1_MTYP_Pos      |       // 0 = SRAM 1 = CRAM 2 = NOR
                                        0 << FSMC_BCR1_MUXEN_Pos     |       // Multiplexing Address/Data
                                        1 << FSMC_BCR1_MBKEN_Pos;            // Memory bank enable bit



    FSMC_Bank1->BTCR[FSMC_Bank1_NORSRAM1 + 1] =
                                        1 << FSMC_BTR1_ADDSET_Pos  |    // Address setup phase duration 0..F * HCLK
                                        0b1111 << FSMC_BTR1_ADDHLD_Pos  |    // Address-hold phase duration 1..F * 2 * HCLK
                                        0b0101 << FSMC_BTR1_DATAST_Pos  |    // Data-phase duration 1..FF * 2 * HCLK
                                        0 << FSMC_BTR1_BUSTURN_Pos |    // Bus turnaround phase duration 0...F
                                        0b1111 << FSMC_BTR1_CLKDIV_Pos  |    // for FSMC_CLK signal 1 = HCLK/2, 2 = HCLK/3 ...  F= HCLK/16
                                        0b1111 << FSMC_BTR1_DATLAT_Pos  |    // Data latency for synchronous NOR Flash memory 0(2CK)...F(17CK)
                                        0 << FSMC_BTR1_ACCMOD_Pos;      // Access mode 0 = A, 1 = B, 2 = C, 3 = D Use w/EXTMOD bit
}
Отправка команд и данных:
#define LCD_BL_ON()  GPIOB -> BSRR = 1<<1;
#define LCD_BL_OFF() GPIOB -> BSRR = 1 << (1+16U);

#define LCD_BASE0                ((uint32_t)0x60000000)
#define LCD_BASE1                ((uint32_t)0x60080000)

#define LCD_CmdWrite(command)    *(volatile uint16_t *) (LCD_BASE0) = (command)
#define LCD_DataWrite(data)        *(volatile uint16_t *) (LCD_BASE1) = (data)