// spiClock is 0 to 6, relecting AVR clock dividers 2,4,8,16,32,64,128
// Due can only go as slow as AVR divider 32 -- slowest Due clock is 329,412 Hz
void HAL::spiInit(uint8_t spiClock)
{
#if MOTHERBOARD == 500 || MOTHERBOARD == 501
  if (spiInitMaded == false)
  {
#endif
    if (spiClock > 4) spiClock = 1;
#if MOTHERBOARD == 500 || MOTHERBOARD == 501
    // Set SPI mode 1, clock, select not active after transfer, with delay between transfers
    SPI_ConfigureNPCS(SPI0, SPI_CHAN_DAC,
                      SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiClock]) |
                      SPI_CSR_DLYBCT(1));
    // Set SPI mode 0, clock, select not active after transfer, with delay between transfers
    SPI_ConfigureNPCS(SPI0, SPI_CHAN_EEPROM1, SPI_CSR_NCPHA |
                      SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiClock]) |
                      SPI_CSR_DLYBCT(1));
#endif// MOTHERBOARD==500 || MOTHERBOARD==501
    // Set SPI mode 0, clock, select not active after transfer, with delay between transfers
    SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA |
                      SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiClock]) |
                      SPI_CSR_DLYBCT(1));
    SPI_Enable(SPI0);
#if MOTHERBOARD == 500 || MOTHERBOARD == 501
    spiInitMaded = true;
  }
#endif
}
Example #2
0
void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode) {
	uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(_pin);
	mode[ch] = _mode | SPI_CSR_CSAAT;
	// SPI_CSR_DLYBCT(1) keeps CS enabled for 32 MCLK after a completed
	// transfer. Some device needs that for working properly. //TODO: See if this is needed for Flutter
	SPI_ConfigureNPCS(spi, ch, mode[ch] | SPI_CSR_SCBR(divider[ch]) | SPI_CSR_DLYBCT(1));
}
Example #3
0
File: SPI.cpp Project: Eih3/v0.83
void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider) {
	uint32_t ch = BOARD_PIN_TO_SPI_CHANNEL(_pin);
	divider[ch] = _divider;
	// SPI_CSR_DLYBCT(1) keeps CS enabled for 32 MCLK after a completed
	// transfer. Some device needs that for working properly.
	SPI_ConfigureNPCS(spi, ch, mode[ch] | SPI_CSR_SCBR(divider[ch]) | SPI_CSR_DLYBCT(1));
}
Example #4
0
/**
 * \brief Initialization of the SPI for communication with ADS7843 component.
 */
extern void ADS7843_Initialize( void )
{
    volatile uint32_t uDummy;

    /* Configure pins */
    PIO_Configure(pinsSPI, PIO_LISTSIZE(pinsSPI));

    PIO_Configure(pinBusy, PIO_LISTSIZE(pinBusy));

    SPI_Configure(BOARD_TSC_SPI_BASE,
                  BOARD_TSC_SPI_ID,
                  SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_PCS(BOARD_TSC_NPCS) /* Value of the SPI configuration register. */
    );

    SPI_ConfigureNPCS(BOARD_TSC_SPI_BASE, BOARD_TSC_NPCS,
                      SPI_CSR_NCPHA | SPI_CSR_DLYBS(DELAY_BEFORE_SPCK) |
                      SPI_CSR_DLYBCT(DELAY_BETWEEN_CONS_COM) | SPI_CSR_SCBR(0xC8) );

    SPI_Enable(BOARD_TSC_SPI_BASE);

    for (uDummy=0; uDummy<100000; uDummy++);

    uDummy = REG_SPI_SR;
    uDummy = REG_SPI_RDR;

    SendCommand(CMD_ENABLE_PENIRQ);
}
Example #5
0
 // spiClock is 0 to 6, relecting AVR clock dividers 2,4,8,16,32,64,128
 // Due can only go as slow as AVR divider 32 -- slowest Due clock is 329,412 Hz
  void HAL::spiInit(uint8_t spiClock) 
 {
      if(spiClock>4) spiClock = 1;
      // Set SPI mode 0, clock, select not active after transfer, with delay between transfers
      SPI_ConfigureNPCS(SPI0, SPI_CHAN, SPI_CSR_NCPHA |
                       SPI_CSR_CSAAT | SPI_CSR_SCBR(spiDueDividors[spiClock]) | 
                       SPI_CSR_DLYBCT(1));
     SPI_Enable(SPI0);
 }
Example #6
0
void hwspi0_init_default(void){
	pmc_enable_periph_clk(ID_SPI0);
	pmc_enable_periph_clk(ID_PIOA);
	
	PIO_Configure(PIOA, PIO_PERIPH_A, PIO_MOSI, PIO_DEFAULT); 
	PIO_Configure(PIOA, PIO_PERIPH_A, PIO_MISO, PIO_DEFAULT); 
	PIO_Configure(PIOA, PIO_PERIPH_A, PIO_SCK, 	PIO_DEFAULT); 
	
	SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_PS | SPI_MR_MODFDIS);
	SPI_Enable(SPI0);
	
	SPI_ConfigureNPCS(SPI0, 0, SPI_CSR_CSAAT | SPI_MODE0 | SPI_CSR_SCBR(SPI_CLOCK_DIV16) | SPI_CSR_DLYBCT(1));
	SPI_ConfigureNPCS(SPI0, 1, SPI_CSR_CSAAT | SPI_MODE0 | SPI_CSR_SCBR(SPI_CLOCK_DIV16) | SPI_CSR_DLYBCT(1));
	SPI_ConfigureNPCS(SPI0, 2, SPI_CSR_CSAAT | SPI_MODE0 | SPI_CSR_SCBR(SPI_CLOCK_DIV16) | SPI_CSR_DLYBCT(1));
	SPI_ConfigureNPCS(SPI0, 3, SPI_CSR_CSAAT | SPI_MODE0 | SPI_CSR_SCBR(SPI_CLOCK_DIV16) | SPI_CSR_DLYBCT(1));
	//SPI_ConfigureNPCS(SPI0, 0, SPI_BITS_8 | SCBR);
}
Example #7
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);
}
void ledsInit(void){

    uint8_t i;

    //init SPI
    SPI_Configure(SPI0, ID_SPI0, SPI_MR_MSTR | SPI_MR_MODFDIS | SPI_MR_PCS(0));
    SPI_ConfigureNPCS(SPI0, 0 , SPI_CSR_NCPHA | SPI_CSR_BITS_12_BIT | SPI_CSR_SCBR(3) | SPI_CSR_DLYBS(2) | SPI_CSR_DLYBCT(0)); //30MHz spi speed
    SPI_Enable(SPI0);
    SPI0->SPI_IDR = 0xFFFFFFFF;
    NVIC_EnableIRQ(SPI0_IRQn);

    //init pins: SPI
    gpioSetFun(MISO, GPIO_FUNC_A);
    gpioSetFun(MOSI, GPIO_FUNC_A);
    gpioSetFun(SCLK, GPIO_FUNC_A);

    //init pins: debug LED
    gpioSetFun(DBGLED, GPIO_FUNC_GPIO);
    gpioSetDir(DBGLED, 0);
    gpioSetVal(DBGLED, 0);

    //init pins: latch
    gpioSetFun(XLAT, GPIO_FUNC_GPIO);
    gpioSetDir(XLAT, 0);
    gpioSetVal(XLAT, 0);

    //init pins: blanking
    for(i = 0; i < sizeof(blanks); i++){
        gpioSetFun(blanks[i], GPIO_FUNC_GPIO);
        gpioSetDir(blanks[i], 0);
        gpioSetVal(blanks[i], 1);
    }

    periodicAdd(ledUpdate, 0, 4);
}