Здравствуйте, пытаюсь разобраться с протоколом 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)