void LCD_Init(void){ GPIO->GPIO_PORT[OLED1_DISPLAY_MOSI_PIN/32].GPIO_GPERC = OELD1_DISPLAY_MOSI_GPIO; GPIO->GPIO_PORT[OLED1_DISPLAY_SCK_PIN/32].GPIO_GPERC = OLED1_DISPLAY_SCK_GPIO; gpio_set_mux(OELD1_DISPLAY_MOSI_GPIO, OLED1_DISPLAY_MOSI_PIN, MUX_PERIPHERAL_A); gpio_set_mux(OLED1_DISPLAY_SCK_GPIO, OLED1_DISPLAY_SCK_PIN, MUX_PERIPHERAL_B); // CS pin as output gpio_set_output(OLED1_DISPLAY_SS_GPIO, OLED1_DISPLAY_SS_PIN); GPIO->GPIO_PORT[OLED1_DISPLAY_SS_PIN/32].GPIO_OVRS = OLED1_DISPLAY_SS_GPIO; // OLED reset pin as output gpio_set_output(OLED1_DISPLAY_RESET_GPIO, OLED1_DISPLAY_RESET_PIN); GPIO->GPIO_PORT[OLED1_DISPLAY_RESET_PIN/32].GPIO_OVRS = OLED1_DISPLAY_RESET_GPIO; // OLED data/cmd pin as output gpio_set_output(OLED1_DATACMD_GPIO, OLED1_DATACMD_PIN); GPIO->GPIO_PORT[OLED1_DATACMD_PIN/32].GPIO_OVRS = OLED1_DATACMD_GPIO; // Enable SPI clock. PM->PM_UNLOCK = PM_UNLOCK_KEY(0xAA) | PM_UNLOCK_ADDR(0x028); PM->PM_PBAMASK |= PM_PBAMASK_SPI; // Set up SPI mode SPI->SPI_MR |= SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PCS(0b1011); // Configure NPCS2 SPI->SPI_CSR[2] |= SPI_CSR_SCBR(1) | SPI_CSR_DLYBCT(0x01) | SPI_CSR_CPOL; //Enable the SPI module. SPI->SPI_CR |= SPI_CR_SPIEN; LCD_Poweron_Reset(); #if 1 //128x32 //Set Display off LCD_buffer[0] = OLED_SET_DISPLAY_OFF; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display clock Div Ration LCD_buffer[0] = OLED_SET_FREQUENCY; LCD_buffer[1] = 0x80; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display mux ratio LCD_buffer[0] = OLED_SET_MUX_RATIO; LCD_buffer[1] = 0x1F; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display offset LCD_buffer[0] = OLED_SET_DISP_OFFSET; LCD_buffer[1] = 0x00; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display Start line LCD_buffer[0] = OLED_SET_START_LINE(0); SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Enable charge pump LCD_buffer[0] = 0x8D; LCD_buffer[1] = 0x14; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display Segment remap LCD_buffer[0] = OLED_SET_SEG_REMAP_REW; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display COM Scan Direction LCD_buffer[0] = OLED_SET_COM_SCAN_DIR_REW; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set COM pins HW Config LCD_buffer[0] = OLED_SET_COM_HW_CONF; LCD_buffer[1] = 0x02; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Contrast LCD_buffer[0] = OLED_SET_CONTRAST; LCD_buffer[1] = 0x8F; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Precharge LCD_buffer[0] = OLED_SET_PRECHARGE; LCD_buffer[1] = 0x22; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set VCOMH Deselect Level LCD_buffer[0] = OLED_SET_VCOM_DESELECT; LCD_buffer[1] = 0x40; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display On/Off LCD_buffer[0] = OLED_ENTIRE_DISPLAY_OFF; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display Normal/Inverse LCD_buffer[0] = OLED_SET_DISPLAY_NORMAL; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display On LCD_buffer[0] = OLED_SET_DISPLAY_ON; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); #else //128x64 //Set Display off LCD_buffer[0] = OLED_SET_DISPLAY_OFF; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display clock Div Ration LCD_buffer[0] = OLED_SET_FREQUENCY; LCD_buffer[1] = 0x80; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display mux ratio LCD_buffer[0] = OLED_SET_MUX_RATIO; LCD_buffer[1] = 0x1F; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display offset LCD_buffer[0] = OLED_SET_DISP_OFFSET; LCD_buffer[1] = 0x00; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display Start line LCD_buffer[0] = OLED_SET_START_LINE(0); SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Enable charge pump LCD_buffer[0] = 0x8D; LCD_buffer[1] = 0x14; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display Segment remap LCD_buffer[0] = OLED_SET_SEG_REMAP_REW; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display COM Scan Direction LCD_buffer[0] = OLED_SET_COM_SCAN_DIR_REW; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set COM pins HW Config LCD_buffer[0] = OLED_SET_COM_HW_CONF; LCD_buffer[1] = 0x12; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Contrast LCD_buffer[0] = OLED_SET_CONTRAST; LCD_buffer[1] = 0x9F; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Precharge LCD_buffer[0] = OLED_SET_PRECHARGE; LCD_buffer[1] = 0x22; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set VCOMH Deselect Level LCD_buffer[0] = OLED_SET_VCOM_DESELECT; LCD_buffer[1] = 0x30; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); //Set Display On/Off LCD_buffer[0] = OLED_ENTIRE_DISPLAY_OFF; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display Normal/Inverse LCD_buffer[0] = OLED_SET_DISPLAY_NORMAL; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); //Set Display On LCD_buffer[0] = OLED_SET_DISPLAY_ON; SPI_Send_Buffer(&LCD_buffer[0], 1, LCD_COMMAND); #endif //Clear all RAM for(uint8_t page = 0; page<8; page++) { SPI_Send_Byte(LCD_COMMAND, OLED_SET_START_PAGE(page)); for(uint8_t col = 0; col<128; col++){ SPI_Send_Byte(LCD_DATA, 0x00); } } SPI_Send_Byte(LCD_COMMAND, OLED_SET_START_PAGE(0)); LCD_buffer[0] = 0x22; LCD_buffer[1] = 0; LCD_buffer[2] = 3; SPI_Send_Buffer(&LCD_buffer[0], 3, LCD_COMMAND); LCD_buffer[0] = OLED_SET_ADDRESS_MODE; LCD_buffer[1] = 0x00; SPI_Send_Buffer(&LCD_buffer[0], 2, LCD_COMMAND); }
static inline void sam_init_pbamask(void) { /* Select the non-optional peripherals */ uint32_t mask = 0; uint32_t divmask = 0; /* OR in the user selected peripherals */ #ifdef CONFIG_SAM32_RESET_PERIPHCLKS #ifdef CONFIG_SAM34_IISC mask |= PM_PBAMASK_IISC; /* IISC */ #endif #ifdef CONFIG_SAM34_SPI0 mask |= PM_PBAMASK_SPI; /* SPI */ #endif #ifdef CONFIG_SAM34_TC0 mask |= PM_PBAMASK_TC0; /* TC0 */ divmask |= PM_PBADIVMASK_TIMER_CLOCKS; #endif #ifdef CONFIG_SAM34_TC1 mask |= PM_PBAMASK_TC1; /* TC1 */ divmask |= PM_PBADIVMASK_TIMER_CLOCKS; #endif #ifdef CONFIG_SAM34_TWIM0 mask |= PM_PBAMASK_TWIM0; /* TWIM0 */ #endif #ifdef CONFIG_SAM34_TWIS0 mask |= PM_PBAMASK_TWIS0; /* TWIS0 */ #endif #ifdef CONFIG_SAM34_TWIM1 mask |= PM_PBAMASK_TWIM1; /* TWIM1 */ #endif #ifdef CONFIG_SAM34_TWIS1 mask |= PM_PBAMASK_TWIS1; /* TWIS1 */ #endif #ifdef CONFIG_SAM34_USART0 mask |= PM_PBAMASK_USART0; /* USART0 */ divmask |= PM_PBADIVMASK_CLK_USART; #endif #ifdef CONFIG_SAM34_USART1 mask |= PM_PBAMASK_USART1; /* USART1 */ divmask |= PM_PBADIVMASK_CLK_USART; #endif #ifdef CONFIG_SAM34_USART2 mask |= PM_PBAMASK_USART2; /* USART2 */ divmask |= PM_PBADIVMASK_CLK_USART; #endif #ifdef CONFIG_SAM34_USART3 mask |= PM_PBAMASK_USART3; /* USART3 */ divmask |= PM_PBADIVMASK_CLK_USART; #endif #ifdef CONFIG_SAM34_ADCIFE mask |= PM_PBAMASK_ADCIFE; /* ADCIFE */ #endif #ifdef CONFIG_SAM34_DACC mask |= PM_PBAMASK_DACC; /* DACC */ #endif #ifdef CONFIG_SAM34_ACIFC mask |= PM_PBAMASK_ACIFC; /* ACIFC */ #endif #ifdef CONFIG_SAM34_GLOC mask |= PM_PBAMASK_GLOC; /* GLOC */ #endif #ifdef CONFIG_SAM34_ABDACB mask |= PM_PBAMASK_ABDACB; /* ABDACB */ #endif #ifdef CONFIG_SAM34_TRNG mask |= PM_PBAMASK_TRNG; /* TRNG */ #endif #ifdef CONFIG_SAM34_PARC mask |= PM_PBAMASK_PARC; /* PARC */ #endif #ifdef CONFIG_SAM34_CATB mask |= PM_PBAMASK_CATB; /* CATB */ #endif #ifdef CONFIG_SAM34_TWIM2 mask |= PM_PBAMASK_TWIM2; /* TWIM2 */ #endif #ifdef CONFIG_SAM34_TWIM3 mask |= PM_PBAMASK_TWIM3; /* TWIM3 */ #endif #ifdef CONFIG_SAM34_LCDCA mask |= PM_PBAMASK_LCDCA; /* LCDCA*/ #endif #endif /* Save the new PBA mask */ putreg32(PM_UNLOCK_KEY(0xaa) | PM_UNLOCK_ADDR(SAM_PM_PBAMASK_OFFSET), SAM_PM_UNLOCK); putreg32(mask, SAM_PM_PBAMASK); /* Set the peripheral divider mask as necessary */ putreg32(PM_UNLOCK_KEY(0xaa) | PM_UNLOCK_ADDR(SAM_PM_PBADIVMASK_OFFSET), SAM_PM_UNLOCK); putreg32(divmask, SAM_PM_PBADIVMASK); }