/*---------------------------------------------------------------------------- SPI Serial Device "LPC17xx" Write and Read a byte on SPI interface *----------------------------------------------------------------------------*/ static uint8_t SpiWriteRead (uint8_t Data) { //dummy to clear status SPI_GetStatus(SpiInfo.pSpi); //read for empty buffer SPI_ReceiveData(SpiInfo.pSpi); // Send data... SPI_SendData(SpiInfo.pSpi, Data); // Wait for transfer complete while (SPI_CheckStatus(SPI_GetStatus(SpiInfo.pSpi), SPI_STAT_SPIF) == RESET); return ((uint8_t)SPI_ReceiveData(SpiInfo.pSpi)); }
/** * \brief Interrupt handler for the SPI slave. */ void SPI_IrqHandler( void ) { uint32_t status; uint8_t startNew = 0; status = SPI_GetStatus( SPI_SLAVE_BASE ) ; if ( status & SPI_SR_NSSR ) { if ( status & SPI_SR_RXBUFF ) { /* Disable the RX and TX PDC transfer requests */ SPI_PdcDisableTx( SPI_SLAVE_BASE ) ; SPI_PdcDisableRx( SPI_SLAVE_BASE ) ; } if ( status & SPI_IDR_ENDRX ) { SPI_DisableIt( SPI_SLAVE_BASE, SPI_IDR_ENDRX ) ; } switch ( status & (SPI_SR_RXBUFF | SPI_SR_ENDRX) ) { case (SPI_SR_RXBUFF | SPI_SR_ENDRX): case (SPI_SR_RXBUFF): SpiSlaveCommandProcess() ; startNew = 1 ; break ; /* Maybe command break data transfer, start new */ case SPI_SR_ENDRX: { /* Command breaks data transfer */ SPI_PdcDisableTx( SPI_SLAVE_BASE ) ; SPI_PdcDisableRx( SPI_SLAVE_BASE ) ; SPI_Configure( SPI_SLAVE_BASE, ID_SPI, 0 ) ; SPI_ConfigureNPCS( SPI_SLAVE_BASE, 0 , 0 ) ; startNew = 1 ; } break; default: break; } if ( startNew ) { if ( spiCmd != CMD_END ) { spiStatus.cmdList[spiStatus.totalNumCommands] = spiCmd; spiStatus.totalNumCommands ++; } SpiSlaveNewCommand(); } } }
/** * \brief Perform SPI master transfer using PDC. * \param pBuf Pointer to 1st buffer to transfer. * \param size Size of the 1st buffer. * \param pNextBuf Pointer to 2nd buffer to transfer. * \param nextSize Size of the 2nd buffer. */ static void SpiMasterTransfer( void * pBuf, uint16_t size, void * pNextBuf, uint16_t nextSize ) { SPI_PdcSetTx(SPI_MASTER_BASE, pBuf, size, pNextBuf, nextSize); SPI_PdcSetRx(SPI_MASTER_BASE, pBuf, size, pNextBuf, nextSize); /* Enable the RX and TX PDC transfer requests */ SPI_PdcEnableRx(SPI_MASTER_BASE); SPI_PdcEnableTx(SPI_MASTER_BASE); /* Waiting transfer done*/ while((SPI_GetStatus(SPI_MASTER_BASE)& SPI_SR_RXBUFF) == 0); /* Disable the RX and TX PDC transfer requests */ SPI_PdcDisableTx(SPI_MASTER_BASE); SPI_PdcDisableRx(SPI_MASTER_BASE); }
void gpio_init() { SPI_CFG_Type spiInitialization; PINSEL_CFG_Type PinSelCfg; /*----------------------------------------------------------------- *--------------------------PORT 0--------------------------------- *----------------------------------------------------------------- */ GPIO_SetDir(0, 0xFFFFFFFF, OUTPUT); PinSelCfg.Portnum = PINSEL_PORT_0; // PinSelCfg.Pinnum = PINSEL_PIN_0; // PinSelCfg.Funcnum = PINSEL_FUNC_3; // PinSelCfg.OpenDrain = 0; // PinSelCfg.Pinmode = 0; // PINSEL_ConfigPin(&PinSelCfg); // // PinSelCfg.Pinnum = PINSEL_PIN_1; // PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_2; PinSelCfg.Funcnum = PINSEL_FUNC_1; PinSelCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PinSelCfg.Pinmode = PINSEL_PINMODE_PULLUP; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_3; PINSEL_ConfigPin(&PinSelCfg); GPIO_SetDir(0, 0x01<<22, INPUT); PinSelCfg.Pinnum = PINSEL_PIN_10; PinSelCfg.Funcnum = PINSEL_FUNC_2; PinSelCfg.OpenDrain = PINSEL_PINMODE_OPENDRAIN; PinSelCfg.Pinmode = PINSEL_PINMODE_TRISTATE; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_11; PINSEL_ConfigPin(&PinSelCfg); //SET FMC_I2C1 in Hi-Z GPIO_SetDir(0, 0x01<<19, INPUT); GPIO_SetDir(0, 0x01<<20, INPUT); // PinSelCfg.Pinmode = PINSEL_PINMODE_TRISTATE; // PinSelCfg.Funcnum = PINSEL_FUNC_3; // PinSelCfg.Pinnum = PINSEL_PIN_19; // PINSEL_ConfigPin(&PinSelCfg); // // PinSelCfg.Pinnum = PINSEL_PIN_20; // PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Funcnum = PINSEL_FUNC_1; PinSelCfg.OpenDrain = PINSEL_PINMODE_OPENDRAIN; PinSelCfg.Pinnum = PINSEL_PIN_27; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_28; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_29; PinSelCfg.Funcnum = PINSEL_FUNC_1; PinSelCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PinSelCfg.Pinmode = PINSEL_PINMODE_TRISTATE; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_30; PINSEL_ConfigPin(&PinSelCfg); /*----------------------------------------------------------------- *---------------------END OF PORT 0------------------------------- *----------------------------------------------------------------- *----------------------------------------------------------------- * ------------------------PORT 1---------------------------------- * ---------------------------------------------------------------- */ GPIO_SetDir(1, 0xFFFFFFFF, OUTPUT); GPIO_SetDir(1, ( 0x01<<IPMI_GA0 | 0x01<<IPMI_GA1 | 0x01<<IPMI_GA2 ), INPUT); GPIO_SetValue(LED_PORT, (0x01<<_IPMI_BLLED|0x01<<_IPMI_LED1|0x01<<_IPMI_LED2) ); // PinSelCfg.Portnum = PINSEL_PORT_1; // PinSelCfg.Pinnum = PINSEL_PIN_30; // PinSelCfg.Funcnum = PINSEL_FUNC_2; // PinSelCfg.OpenDrain = PINSEL_PINMODE_NORMAL; // PinSelCfg.Pinmode = PINSEL_PINMODE_TRISTATE; // PINSEL_ConfigPin(&PinSelCfg); GPIO_SetDir(ENA_PORT, 0x001<<ENA_PIN, INPUT); GPIO_SetDir(2, 0x0400, INPUT); GPIO_SetDir(IPMI_EJTHDL_PORT, 0x001<<IPMI_EJTHDL, INPUT); GPIO_SetDir(1, 0x01<<22, INPUT); GPIO_SetDir(PGOOD_PORT, 0x01<<PGOOD_PIN, INPUT); gpio_clr_gpio_pin(_IPMI_BLLED, LED_PORT); // turn on blue LED ASAP gpio_clr_gpio_pin(UC_PWRENOUT, UC_PWRENOUT_PORT); // turn off power enable PinSelCfg.Pinnum = PINSEL_PIN_15; PinSelCfg.Portnum = PINSEL_PORT_0; PinSelCfg.Pinmode = PINSEL_PINMODE_PULLUP; PinSelCfg.Funcnum = PINSEL_FUNC_3; PinSelCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Pinnum = PINSEL_PIN_18; PINSEL_ConfigPin(&PinSelCfg); GPIO_SetDir(1, 0x01<<26, OUTPUT); GPIO_SetValue(1, 0x01<<26); GPIO_SetDir(0, 0x01<<21, OUTPUT); GPIO_SetDir(0, 0x01<<16, OUTPUT); GPIO_SetValue(0, 0x01<<16); GPIO_SetValue(0, 0x01<<21); GPIO_SetDir(PORT_EN_0, 0x01<<EN_P1V2, OUTPUT); GPIO_SetDir(PORT_EN_0, 0x01<<EN_P1V8, OUTPUT); GPIO_SetDir(PORT_EN_0, 0x01<<EN_FMC2_P3V3, OUTPUT); GPIO_SetDir(PORT_EN_0, 0x01<<EN_FMC1_P3V3, OUTPUT); GPIO_SetDir(PORT_EN_0, 0x01<<EM_FMC1_P12V, OUTPUT); GPIO_SetDir(PORT_EN_0, 0x01<<EN_FMC2_P12V, OUTPUT); GPIO_SetDir(PORT_EN_1, 0x01<<EN_FMC1_PVADJ, OUTPUT); GPIO_SetDir(PORT_EN_1, 0x01<<EN_FMC2_PVADJ, OUTPUT); GPIO_SetDir(PORT_EN_1, 0x01<<EN_P3V3, OUTPUT); GPIO_SetDir(PORT_EN_1, 0x01<<EN_1V5_VTT, OUTPUT); GPIO_SetDir(PORT_EN_1, 0x01<<EN_RTM_CONN, OUTPUT); GPIO_SetDir(PORT_EN_0, 0x01<<RTM_PRESENCE, INPUT); GPIO_SetDir(PORT_EN_3, 0x01<<EN_P1V0, OUTPUT); setDC_DC_ConvertersON(); spiInitialization.CPOL = SPI_CPOL_LO; spiInitialization.CPHA = SPI_CPHA_FIRST; spiInitialization.Databit = SPI_DATABIT_10; spiInitialization.DataOrder = SPI_DATA_MSB_FIRST; spiInitialization.ClockRate = 10000000; SPI_Init(LPC_SPI, &spiInitialization); LPC_SPI->SPCR = 0xA24; GPIO_ClearValue(0, 0x01<<16); SPI_SendData(LPC_SPI, 0x0125); while(! ( SPI_CheckStatus( SPI_GetStatus(LPC_SPI), SPI_STAT_SPIF) )); GPIO_SetValue(0, 0x01<<16); GPIO_ClearValue(0, 0x01<<16); SPI_SendData(LPC_SPI, 0x0025); while(! ( SPI_CheckStatus( SPI_GetStatus(LPC_SPI), SPI_STAT_SPIF) )); GPIO_SetValue(0, 0x01<<16); //SCANSTA JTAG GPIO_SetDir(2, 0x0FF, OUTPUT); GPIO_SetValue(2, 0x080); GPIO_ClearValue(2, 0x07F); SPI_ConfigStructInit(&spiInitialization); //FPGA_SPI GPIO_SetDir(1, 0x01<<20, INPUT); GPIO_SetDir(1, 0x01<<21, INPUT); GPIO_SetDir(1, 0x01<<23, INPUT); GPIO_SetDir(1, 0x01<<24, INPUT); // SET PROGRAM_B AS OUTPUT // AND SET THIS PIN HIGH GPIO_SetDir(0, 0x01<<17, INPUT); // SET DONE PIN AS INPUT // turn on pull-up GPIO_SetDir(0, 0x01<<22, INPUT); //////////////////////////////////////// // P0_6 - FCS_B - use as FPGA - RST //////////////////////////////////////// GPIO_SetDir(0, 0x01<<6, INPUT); //GPIO_ClearValue(0, 0x01<<6); /////////////////////////////////////// GPIO_SetDir(0, 0x01<<7, INPUT); GPIO_SetDir(0, 0x01<<8, INPUT); #ifdef AMC_CPU_COM_Express GPIO_SetDir(0, 0x01<<9, OUTPUT); #else GPIO_SetDir(0, 0x01<<9, INPUT); #endif /////////////////////////////////////// //FMC STATUS PORTS /////////////////////////////////////// GPIO_SetDir(1, 0x1<<14, INPUT); GPIO_SetDir(1, 0x1<<15, INPUT); GPIO_SetDir(1, 0x1<<16, INPUT); GPIO_SetDir(1, 0x1<<17, INPUT); GPIO_SetDir(1, 0x1<<18, INPUT); GPIO_SetDir(1, 0x1<<19, INPUT); /////////////////////////////////////// // FPGA Reset Button EXTI_InitTypeDef EXTICfg; /* Initialize EXT pin and register */ /* P2.12 as /EINT2*/ PinSelCfg.Funcnum = PINSEL_FUNC_1; PinSelCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PinSelCfg.Pinmode = PINSEL_PINMODE_PULLUP; PinSelCfg.Pinnum = FPGA_RST_SW; PinSelCfg.Portnum = FPGA_RST_SW_PORT; PINSEL_ConfigPin(&PinSelCfg); PinSelCfg.Funcnum = PINSEL_FUNC_0; PinSelCfg.OpenDrain = PINSEL_PINMODE_NORMAL; PinSelCfg.Pinmode = PINSEL_PINMODE_PULLUP; PinSelCfg.Pinnum = FPGA_RESETn; PinSelCfg.Portnum = FPGA_RESETn_PORT; PINSEL_ConfigPin(&PinSelCfg); GPIO_SetDir(FPGA_RESETn_PORT, 1<<FPGA_RESETn, OUTPUT); EXTI_Init(); EXTICfg.EXTI_Line = EXTI_EINT2; EXTICfg.EXTI_Mode = EXTI_MODE_EDGE_SENSITIVE; EXTICfg.EXTI_polarity = EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE; EXTI_ClearEXTIFlag(EXTI_EINT2); EXTI_Config(&EXTICfg); GPIO_IntCmd(0, 0x01 << FPGA_RST_SW, 1); NVIC_SetPriorityGrouping(0); NVIC_SetPriority(EINT2_IRQn, 4); NVIC_EnableIRQ(EINT2_IRQn); }
/** * \brief SPI handler */ void SPI_Handler(void) { SPI_GetStatus(SPI); printf("%c", (char) SPI_Read(SPI)); }
/*********************************************************************//** * @brief SPI Interrupt used for reading and writing handler * @param None * @return None ***********************************************************************/ void SPI_IRQHandler(void) { SPI_DATA_SETUP_Type *xf_setup; uint16_t tmp; uint8_t dataword; xf_setup = &xferConfig; if(SPI_GetDataSize(LPC_SPI) == 8) dataword = 0; else dataword = 1; /* Dummy read to clear SPI interrupt flag */ SPI_ClearIntPending(LPC_SPI); // save status tmp = SPI_GetStatus(LPC_SPI); xf_setup->status = tmp; // Check for error if (tmp & (SPI_SPSR_ABRT | SPI_SPSR_MODF | SPI_SPSR_ROVR | SPI_SPSR_WCOL)){ xf_setup->status |= SPI_STAT_ERROR; // Disable Interrupt and call call-back SPI_IntCmd(LPC_SPI, DISABLE); // Set Complete Flag complete = SET; return; } /* Check SPI complete flag */ if (tmp & SPI_SPSR_SPIF){ // Read data from SPI data tmp = SPI_ReceiveData(LPC_SPI); if (xf_setup->rx_data != NULL) { if (dataword == 0){ *(uint8_t *)((uint8_t *)(xf_setup->rx_data) + xf_setup->counter) = (uint8_t) tmp; } else { *(uint16_t *)((uint8_t *)(xf_setup->rx_data) + xf_setup->counter) = (uint8_t) tmp; } } // Increase counter if (dataword == 0){ xf_setup->counter++; } else { xf_setup->counter += 2; } } if (xf_setup->counter < xf_setup->length){ // Write data to buffer if(xf_setup->tx_data == NULL){ if (dataword == 0){ SPI_SendData(LPC_SPI, 0xFF); } else { SPI_SendData(LPC_SPI, 0xFFFF); } } else { if (dataword == 0){ SPI_SendData(LPC_SPI, (*(uint8_t *)((uint8_t *)(xf_setup->tx_data) + xf_setup->counter))); } else { SPI_SendData(LPC_SPI, (*(uint16_t *)((uint8_t *)(xf_setup->tx_data) + xf_setup->counter))); } } } // No more data to send else { xf_setup->status |= SPI_STAT_DONE; // Disable Interrupt and call call-back SPI_IntCmd(LPC_SPI, DISABLE); // Set Complete Flag complete = SET; } }