// 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 }
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)); }
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)); }
/** * \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); }
// 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); }
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); }
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); }