Exemple #1
0
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);
}