//***************************************************************************** // //! Configure a set of IOs for standard I2C peripheral control // //***************************************************************************** void IOCPinTypeI2c(uint32_t ui32Base, uint32_t ui32Data, uint32_t ui32Clk) { uint32_t ui32IOConfig; // // Check the arguments. // ASSERT((ui32Data <= IOID_31) || (ui32Data == IOID_UNUSED)); ASSERT((ui32Clk <= IOID_31) || (ui32Clk == IOID_UNUSED)); // // Define the IO configuration parameters. // ui32IOConfig = IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_UP | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_OPEN_DRAIN_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE; // // Setup the IOs in the desired configuration. // IOCPortConfigureSet(ui32Data, IOC_PORT_MCU_I2C_MSSDA, ui32IOConfig); IOCPortConfigureSet(ui32Clk, IOC_PORT_MCU_I2C_MSSCL, ui32IOConfig); }
//***************************************************************************** // // Configure a set of IOs for standard UART peripheral control // //***************************************************************************** void IOCPinTypeUart(uint32_t ui32Base, uint32_t ui32Rx, uint32_t ui32Tx, uint32_t ui32Cts, uint32_t ui32Rts) { // Check the arguments. ASSERT(ui32Base == UART0_BASE); ASSERT((ui32Rx <= IOID_31) || (ui32Rx == IOID_UNUSED)); ASSERT((ui32Tx <= IOID_31) || (ui32Tx == IOID_UNUSED)); ASSERT((ui32Cts <= IOID_31) || (ui32Cts == IOID_UNUSED)); ASSERT((ui32Rts <= IOID_31) || (ui32Rts == IOID_UNUSED)); // Setup the IOs in the desired configuration. if(ui32Rx != IOID_UNUSED) { IOCPortConfigureSet(ui32Rx, IOC_PORT_MCU_UART0_RX, IOC_STD_INPUT); } if(ui32Tx != IOID_UNUSED) { IOCPortConfigureSet(ui32Tx, IOC_PORT_MCU_UART0_TX, IOC_STD_OUTPUT); } if(ui32Cts != IOID_UNUSED) { IOCPortConfigureSet(ui32Cts, IOC_PORT_MCU_UART0_CTS, IOC_STD_INPUT); } if(ui32Rts != IOID_UNUSED) { IOCPortConfigureSet(ui32Rts, IOC_PORT_MCU_UART0_RTS, IOC_STD_OUTPUT); } }
//***************************************************************************** // //! Configure a set of IOs for standard SPIS peripheral control // //***************************************************************************** void IOCPinTypeSpis(uint32_t ui32Rx, uint32_t ui32Tx, uint32_t ui32Fss, uint32_t ui32Clk) { // // Check the arguments. // ASSERT((ui32Rx <= IOID_31) || (ui32Rx == IOID_UNUSED)); ASSERT((ui32Tx <= IOID_31) || (ui32Tx == IOID_UNUSED)); ASSERT((ui32Fss <= IOID_31) || (ui32Fss == IOID_UNUSED)); ASSERT((ui32Clk <= IOID_31) || (ui32Clk == IOID_UNUSED)); // // Setup the IOs in the desired configuration. // if(ui32Rx != IOID_UNUSED) { IOCPortConfigureSet(ui32Rx, IOC_PORT_AON_SDI, IOC_STD_INPUT); } if(ui32Tx != IOID_UNUSED) { IOCPortConfigureSet(ui32Tx, IOC_PORT_AON_SDO, IOC_STD_OUTPUT); } if(ui32Fss != IOID_UNUSED) { IOCPortConfigureSet(ui32Fss, IOC_PORT_AON_SCS, IOC_STD_INPUT); } if(ui32Clk != IOID_UNUSED) { IOCPortConfigureSet(ui32Clk, IOC_PORT_AON_SCK, IOC_STD_INPUT); } }
/*#####################################################*/ void _mcspi_close(new_mcspi *McspiStruct) { SSIDisable(McspiStruct->BaseAddr); switch(McspiStruct->McspiNr) { case 0: IOCPortConfigureSet(McspiStruct->SckPin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->SckPin); IOCPortConfigureSet(McspiStruct->MisoPin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->MisoPin); IOCPortConfigureSet(McspiStruct->MosiPin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->MosiPin); IOCPortConfigureSet(McspiStruct->CsPin[0], IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->CsPin[0]); SSIConfigSetExpClk(SSI0_BASE, CoreFreq, SSI_FRF_MOTO_MODE_0, McspiStruct->Mode, McspiStruct->ClkDiv[McspiStruct->McspiNr], McspiStruct->WordSize); McspiStruct->BaseAddr = 0; break; case 1: IOCPortConfigureSet(McspiStruct->SckPin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->SckPin); IOCPortConfigureSet(McspiStruct->MisoPin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->MisoPin); IOCPortConfigureSet(McspiStruct->MosiPin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->MosiPin); IOCPortConfigureSet(McspiStruct->CsPin[0], IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->CsPin[0]); SSIConfigSetExpClk(SSI1_BASE, CoreFreq, SSI_FRF_MOTO_MODE_0, McspiStruct->Mode, McspiStruct->ClkDiv[McspiStruct->McspiNr], McspiStruct->WordSize); McspiStruct->BaseAddr = 0; break; } }
bool _gpio_function_set(new_gpio *gpio_struct, gpio_type_enum function) { if(gpio_struct == NULL) return NULL; unsigned long pin_func = 0; switch(function) { case GPIO_OUT_PUSH_PULL: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= 1 << gpio_struct->Pin; break; case GPIO_IN_FLOATING: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << gpio_struct->Pin); break; case GPIO_IN_PULL_DOWN: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_DOWN | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= 1 << gpio_struct->Pin; break; case GPIO_IN_PULL_UP: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_UP | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= 1 << gpio_struct->Pin; break; case GPIO_OUT_OPEN_DRAIN: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_UP | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_OPEN_DRAIN_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= 1 << gpio_struct->Pin; break; default: return false; } IOCPortConfigureSet(gpio_struct->Pin, IOC_PORT_GPIO, pin_func); return true; }
void initGPIOInterrupts(void){ // Config IOID4 for external interrupt on rising edge and wake up IOCPortConfigureSet(BOARD_IOID_KEY_RIGHT, IOC_PORT_GPIO, IOC_IOMODE_NORMAL | IOC_FALLING_EDGE | IOC_INT_ENABLE | IOC_IOPULL_UP | IOC_INPUT_ENABLE | IOC_WAKE_ON_LOW); // REED_SWITCH = IOID_25, external interrupt on rising edge and wake up IOCPortConfigureSet(REED_SWITCH, IOC_PORT_GPIO, IOC_IOMODE_NORMAL | IOC_RISING_EDGE | IOC_INT_ENABLE | IOC_IOPULL_DOWN | IOC_INPUT_ENABLE | IOC_WAKE_ON_HIGH); // BAT_LOW = IOID_28, external interrupt on rising edge and wake up IOCPortConfigureSet(BAT_LOW, IOC_PORT_GPIO, IOC_IOMODE_NORMAL | IOC_FALLING_EDGE | IOC_INT_ENABLE | IOC_IOPULL_UP | IOC_INPUT_ENABLE | IOC_WAKE_ON_LOW); // Clear GPIO Register HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) & GPIO_O_DOUTCLR31_0; }
//***************************************************************************** // //! Configure a set of IOs for standard SSI peripheral slave control // //***************************************************************************** void IOCPinTypeSsiSlave(uint32_t ui32Base, uint32_t ui32Rx, uint32_t ui32Tx, uint32_t ui32Fss, uint32_t ui32Clk) { // // Check the arguments. // ASSERT((ui32Base == SSI0_BASE) || (ui32Base == SSI1_BASE)); ASSERT((ui32Rx <= IOID_31) || (ui32Rx == IOID_UNUSED)); ASSERT((ui32Tx <= IOID_31) || (ui32Tx == IOID_UNUSED)); ASSERT((ui32Fss <= IOID_31) || (ui32Fss == IOID_UNUSED)); ASSERT((ui32Clk <= IOID_31) || (ui32Clk == IOID_UNUSED)); // // Setup the IOs in the desired configuration. // if(ui32Base == SSI0_BASE) { if(ui32Rx != IOID_UNUSED) { IOCPortConfigureSet(ui32Rx, IOC_PORT_MCU_SSI0_RX, IOC_STD_INPUT); } if(ui32Tx != IOID_UNUSED) { IOCPortConfigureSet(ui32Tx, IOC_PORT_MCU_SSI0_TX, IOC_STD_OUTPUT); } if(ui32Fss != IOID_UNUSED) { IOCPortConfigureSet(ui32Fss, IOC_PORT_MCU_SSI0_FSS, IOC_STD_INPUT); } if(ui32Clk != IOID_UNUSED) { IOCPortConfigureSet(ui32Clk, IOC_PORT_MCU_SSI0_CLK, IOC_STD_INPUT); } } else { if(ui32Rx != IOID_UNUSED) { IOCPortConfigureSet(ui32Rx, IOC_PORT_MCU_SSI1_RX, IOC_STD_INPUT); } if(ui32Tx != IOID_UNUSED) { IOCPortConfigureSet(ui32Tx, IOC_PORT_MCU_SSI1_TX, IOC_STD_OUTPUT); } if(ui32Fss != IOID_UNUSED) { IOCPortConfigureSet(ui32Fss, IOC_PORT_MCU_SSI1_FSS, IOC_STD_INPUT); } if(ui32Clk != IOID_UNUSED) { IOCPortConfigureSet(ui32Clk, IOC_PORT_MCU_SSI1_CLK, IOC_STD_INPUT); } } }
void bspBuzzerInit(void) { // Configure pin as PWM output IOCPortConfigureSet(BSP_IOID_BUZZER, IOC_PORT_MCU_PORT_EVENT0, IOC_STD_OUTPUT); // Use GPT0, Channel A (16 bit timer) TimerConfigure(GPT0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM); }
void _gpio_free(new_gpio *gpio_struct) { if(gpio_struct == NULL) return; IOCPortConfigureSet(gpio_struct->Pin, IOC_PORT_GPIO, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << gpio_struct->Pin); free(gpio_struct); }
//***************************************************************************** // // Configure an IO for AUX control // //***************************************************************************** void IOCPinTypeAux(uint32_t ui32IOId) { // Check the arguments. ASSERT((ui32IOId <= IOID_31) || (ui32IOId == IOID_UNUSED)); // Setup the IO. IOCPortConfigureSet(ui32IOId, IOC_PORT_AUX_IO, IOC_STD_INPUT); }
/** * Function documented in platform/uart.h */ otError otPlatUartDisable(void) { UARTDisable(UART0_BASE); UARTIntUnregister(UART0_BASE); UARTIntDisable(UART0_BASE, UART_INT_RX | UART_INT_RT); IOCPortConfigureSet(IOID_2, IOC_PORT_GPIO, IOC_STD_INPUT); IOCPortConfigureSet(IOID_3, IOC_PORT_GPIO, IOC_STD_INPUT); PRCMPeripheralRunDisable(PRCM_PERIPH_UART0); PRCMPeripheralSleepDisable(PRCM_PERIPH_UART0); PRCMPeripheralDeepSleepDisable(PRCM_PERIPH_UART0); PRCMLoadSet(); /** * \warn this assumes that there are no other devices being used in the * serial power domain */ PRCMPowerDomainOff(PRCM_DOMAIN_SERIAL); return OT_ERROR_NONE; }
//***************************************************************************** // // Setup an IO for standard GPIO output // //***************************************************************************** void IOCPinTypeGpioOutput(uint32_t ui32IOId) { // Check the arguments. ASSERT(ui32IOId <= IOID_31); // Setup the IO for standard input. IOCPortConfigureSet(ui32IOId, IOC_PORT_GPIO, IOC_STD_OUTPUT); // Enable output mode in the GPIO module. GPIO_setOutputEnableDio(ui32IOId, GPIO_OUTPUT_ENABLE); }
//***************************************************************************** // //! Setup an IO for standard GPIO output // //***************************************************************************** void IOCPinTypeGpioOutput(uint32_t ui32IOId) { // // Check the arguments. // ASSERT(ui32IOId <= IOID_31); // // Setup the IO for standard input. // IOCPortConfigureSet(ui32IOId, IOC_PORT_GPIO, IOC_STD_OUTPUT); // // Enable output mode in the GPIO module. // GPIODirModeSet(1 << ui32IOId, GPIO_DIR_MODE_OUT); }
new_gpio *_gpio_assign(unsigned int PortNr, unsigned int PinNr, gpio_type_enum function, bool Multipin) { new_gpio* GpioStruct = new_(new_gpio); if(GpioStruct == NULL) return NULL; GpioStruct->BaseAddr = 0; GpioStruct->Pin = PinNr; GpioStruct->Direction = function; GpioStruct->PortNr = PortNr; GpioStruct->Multipin = Multipin; unsigned long pin_func = 0; switch(function) { case GPIO_OUT_PUSH_PULL: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= 1 << PinNr; break; case GPIO_IN_FLOATING: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << PinNr); break; case GPIO_IN_PULL_DOWN: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_DOWN | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << PinNr); break; case GPIO_IN_PULL_UP: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_UP | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << PinNr); break; case GPIO_OUT_OPEN_DRAIN: pin_func = (IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_IOPULL_UP | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_OPEN_DRAIN_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE ); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= 1 << PinNr; break; default: _gpio_free(GpioStruct); return NULL; } IOCPortConfigureSet(PinNr, IOC_PORT_GPIO, pin_func); return GpioStruct; }
bool _mcspi_open(new_mcspi *McspiStruct) { switch(McspiStruct->McspiNr) { case 0: SSIDisable(SSI0_BASE); IOCPortConfigureSet(McspiStruct->SckPin, IOC_PORT_MCU_SSI0_CLK, IOC_CURRENT_8MA | IOC_STRENGTH_MAX | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= (1 << McspiStruct->SckPin); IOCPortConfigureSet(McspiStruct->MisoPin, IOC_PORT_MCU_SSI0_RX, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->MisoPin); IOCPortConfigureSet(McspiStruct->MosiPin, IOC_PORT_MCU_SSI0_TX, IOC_CURRENT_8MA | IOC_STRENGTH_MAX | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= (1 << McspiStruct->MosiPin); IOCPortConfigureSet(McspiStruct->CsPin[0], IOC_PORT_MCU_SSI0_FSS, IOC_CURRENT_8MA | IOC_STRENGTH_MAX | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= (1 << McspiStruct->CsPin[0]); SSIConfigSetExpClk(SSI0_BASE, CoreFreq, SSI_FRF_MOTO_MODE_3, McspiStruct->Mode, McspiStruct->ClkDiv[McspiStruct->McspiNr], McspiStruct->WordSize); McspiStruct->BaseAddr = SSI0_BASE; break; case 1: SSIDisable(SSI1_BASE); IOCPortConfigureSet(McspiStruct->SckPin, IOC_PORT_MCU_SSI1_CLK, IOC_CURRENT_8MA | IOC_STRENGTH_MAX | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= (1 << McspiStruct->SckPin); IOCPortConfigureSet(McspiStruct->MisoPin, IOC_PORT_MCU_SSI1_RX, IOC_CURRENT_2MA | IOC_STRENGTH_AUTO | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_ENABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) &= ~(1 << McspiStruct->MisoPin); IOCPortConfigureSet(McspiStruct->MosiPin, IOC_PORT_MCU_SSI1_TX, IOC_CURRENT_8MA | IOC_STRENGTH_MAX | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= (1 << McspiStruct->MosiPin); IOCPortConfigureSet(McspiStruct->CsPin[0], IOC_PORT_MCU_SSI1_FSS, IOC_CURRENT_8MA | IOC_STRENGTH_MAX | IOC_NO_IOPULL | IOC_SLEW_DISABLE | IOC_HYST_DISABLE | IOC_NO_EDGE | IOC_INT_DISABLE | IOC_IOMODE_NORMAL | IOC_NO_WAKE_UP | IOC_INPUT_DISABLE); HWREG(GPIO_BASE + GPIO_O_DOE31_0) |= (1 << McspiStruct->CsPin[0]); SSIConfigSetExpClk(SSI1_BASE, CoreFreq, SSI_FRF_MOTO_MODE_3, McspiStruct->Mode, McspiStruct->ClkDiv[McspiStruct->McspiNr], McspiStruct->WordSize); McspiStruct->BaseAddr = SSI1_BASE; break; default: return false; } SSIEnable(McspiStruct->BaseAddr); return true;//spi_enable(McspiStruct); }
/* * ======== SENSORTAG_CC2650_initGPIO ======== */ Void SENSORTAG_CC2650_initGPIO(Void) { Bits32 pin; /* Power up the GPIO module. */ GPIO_open(); /* Setup the LED1 (red) GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_LED1].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_OUTPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_OUT); /* Setup the LED2 (green) GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_LED2].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_OUTPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_OUT); /* Setup the Button1 GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_BUTTON1].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_INPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_IN); IOCIOPortPullSet(PIN2IOID(pin), IOC_IOPULL_UP); /* Setup the Button2 GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_BUTTON2].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_INPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_IN); IOCIOPortPullSet(PIN2IOID(pin), IOC_IOPULL_UP); /* Setup the Reed relay GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_REED_INT].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_INPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_IN); IOCIOPortPullSet(PIN2IOID(pin), IOC_IOPULL_DOWN); /* Setup the FLASH_CS pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_FLASH_CS].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_OUTPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_OUT); IOCIOPortPullSet(PIN2IOID(pin), IOC_NO_IOPULL); /* Setup the BUZZER_EN pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_BUZZER_EN].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_OUTPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_OUT); /* Setup the MPU_POWER GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_MPU_POWER].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_OUTPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_OUT); /* Setup the MPU_INT GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_MPU_INT].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_INPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_IN); IOCIOPortPullSet(PIN2IOID(pin), IOC_IOPULL_DOWN); /* Setup the TMP_RDY GPIO pin. */ pin = gpioHWAttrs[SENSORTAG_CC2650_TMP_RDY].pin; IOCPortConfigureSet(PIN2IOID(pin), IOC_PORT_GPIO, IOC_STD_INPUT); GPIODirModeSet(pin, GPIO_DIR_MODE_IN); /* Once GPIO_init is called, GPIO_config cannot be changed */ GPIO_init(); /* Set some of the IO pins */ GPIO_write(SENSORTAG_CC2650_LED1, SENSORTAG_CC2650_LED_OFF); GPIO_write(SENSORTAG_CC2650_LED2, SENSORTAG_CC2650_LED_OFF); GPIO_write(SENSORTAG_CC2650_MPU_POWER, SENSORTAG_CC2650_MPU_POWER_ON); GPIO_write(SENSORTAG_CC2650_MIC_POWER, SENSORTAG_CC2650_MIC_POWER_OFF); GPIO_write(SENSORTAG_CC2650_FLASH_CS, SENSORTAG_CC2650_FLASH_CS_OFF); }
int main(void) { uint8_t payload[ADVLEN]; //Disable JTAG to allow for Standby AONWUCJtagPowerOff(); //Force AUX on powerEnableAuxForceOn(); powerEnableRFC(); powerEnableXtalInterface(); // Divide INF clk to save Idle mode power (increases interrupt latency) powerDivideInfClkDS(PRCM_INFRCLKDIVDS_RATIO_DIV32); initRTC(); powerEnablePeriph(); powerEnableGPIOClockRunMode(); /* Wait for domains to power on */ while((PRCMPowerDomainStatus(PRCM_DOMAIN_PERIPH) != PRCM_DOMAIN_POWER_ON)); sensorsInit(); ledInit(); //Config IOID4 for external interrupt on rising edge and wake up //IOCPortConfigureSet(BOARD_IOID_KEY_RIGHT, IOC_PORT_GPIO, IOC_IOMODE_NORMAL | IOC_FALLING_EDGE | IOC_INT_ENABLE | IOC_IOPULL_UP | IOC_INPUT_ENABLE | IOC_WAKE_ON_LOW); // Config reedSwitch as input IOCPortConfigureSet(BOARD_IOID_DP0, IOC_PORT_GPIO, IOC_IOMODE_NORMAL | IOC_RISING_EDGE | IOC_INT_ENABLE | IOC_IOPULL_DOWN | IOC_INPUT_ENABLE | IOC_WAKE_ON_HIGH); //Set device to wake MCU from standby on PIN 4 (BUTTON1) HWREG(AON_EVENT_BASE + AON_EVENT_O_MCUWUSEL) = AON_EVENT_MCUWUSEL_WU0_EV_PAD; //Does not work with AON_EVENT_MCUWUSEL_WU0_EV_PAD4 --> WHY?? IntEnable(INT_EDGE_DETECT); powerDisablePeriph(); //Disable clock for GPIO in CPU run mode HWREGBITW(PRCM_BASE + PRCM_O_GPIOCLKGR, PRCM_GPIOCLKGR_CLK_EN_BITN) = 0; // Load clock settings HWREGBITW(PRCM_BASE + PRCM_O_CLKLOADCTL, PRCM_CLKLOADCTL_LOAD_BITN) = 1; initInterrupts(); initRadio(); // baek: before while powerEnablePeriph(); powerEnableGPIOClockRunMode(); /* Wait for domains to power on */ while((PRCMPowerDomainStatus(PRCM_DOMAIN_PERIPH) != PRCM_DOMAIN_POWER_ON)); // CRASH !!!!!!!!!!!!!! sensorsInit(); ledInit(); // end baek: // Turn off FLASH in idle mode powerDisableFlashInIdle(); // Cache retention must be enabled in Idle if flash domain is turned off (to avoid cache corruption) powerEnableCacheRetention(); //AUX - request to power down (takes no effect since force on is set) powerEnableAUXPdReq(); powerDisableAuxRamRet(); //Clear payload buffer memset(payload, 0, ADVLEN); while(1) { //if((g_count& 0x04)== 1){ rfBootDone = 0; rfSetupDone = 0; rfAdvertisingDone = 0; select_bmp_280(); // activates I2C for bmp-sensor enable_bmp_280(1); // works //Wait until RF Core PD is ready before accessing radio waitUntilRFCReady(); initRadioInts(); runRadio(); //Wait until AUX is ready before configuring oscillators waitUntilAUXReady(); //Enable 24MHz XTAL OSCHF_TurnOnXosc(); //IDLE until BOOT_DONE interrupt from RFCore is triggered while( ! rfBootDone) { powerDisableCPU(); PRCMDeepSleep(); } //This code runs after BOOT_DONE interrupt has woken up the CPU again // -> //Request radio to keep on system bus radioCmdBusRequest(true); //Patch CM0 - no RFE patch needed for TX only radioPatch(); //Start radio timer radioCmdStartRAT(); //Enable Flash access while doing radio setup powerEnableFlashInIdle(); //Switch to XTAL while( !OSCHF_AttemptToSwitchToXosc()) {} /* baek: before while powerEnablePeriph(); powerEnableGPIOClockRunMode(); /* Wait for domains to power on */ /* while((PRCMPowerDomainStatus(PRCM_DOMAIN_PERIPH) != PRCM_DOMAIN_POWER_ON)); // CRASH !!!!!!!!!!!!!! sensorsInit(); ledInit(); */ /*****************************************************************************************/ // Read sensor values uint32_t pressure = 0; // only 3 Bytes used //uint32_t temp = 0; select_bmp_280(); // activates I2C for bmp-sensor enable_bmp_280(1); // works do{ pressure = value_bmp_280(BMP_280_SENSOR_TYPE_PRESS); // read and converts in pascal (96'000 Pa) //temp = value_bmp_280(BMP_280_SENSOR_TYPE_TEMP); }while(pressure == 0x80000000); if(pressure == 0x80000000){ CPUdelay(100); pressure = value_bmp_280(BMP_280_SENSOR_TYPE_PRESS); // read and converts in pascal (96'000 Pa) } //Start Temp measurement uint16_t temperature; enable_tmp_007(1); //Wait for, read and calc temperature { int count = 0; do{ temperature = value_tmp_007(TMP_007_SENSOR_TYPE_AMBIENT); //g_count++; }while( ((temperature == 0x80000000) || (temperature == 0)) && (count <=5) ); count++; count--; } enable_tmp_007(0); char char_temp[2]; //start hum measurement configure_hdc_1000(); start_hdc_1000(); // //Wait for, read and calc humidity while(!read_data_hdc_1000()); int humidity = value_hdc_1000(HDC_1000_SENSOR_TYPE_HUMIDITY); // char char_hum[5]; //END read sensor values /*****************************************************************************************/ powerDisablePeriph(); // Disable clock for GPIO in CPU run mode HWREGBITW(PRCM_BASE + PRCM_O_GPIOCLKGR, PRCM_GPIOCLKGR_CLK_EN_BITN) = 0; // Load clock settings HWREGBITW(PRCM_BASE + PRCM_O_CLKLOADCTL, PRCM_CLKLOADCTL_LOAD_BITN) = 1; /*****************************************************************************************/ // Set payload and transmit uint8_t p; p = 0; /*jedes 5.te mal senden*/ payload[p++] = ADVLEN-1; /* len */ payload[p++] = 0x03; payload[p++] = 0xde; payload[p++] = 0xba; payload[p++] =(sequenceNumber >> 8); // laufnummer payload[p++] = sequenceNumber; // Speed payload[p++] = g_diff >> 24; // higher seconds payload[p++] = g_diff >> 16; // lower seconds payload[p++] = g_diff >> 8; // higher subseconds payload[p++] = g_diff; // lower subseconds //pressure payload[p++] = 0; payload[p++] = 0; //(pressure >> 16); payload[p++] = 0; //(pressure >> 8); payload[p++] = 0; //pressure; //temperature payload[p++] = 0; payload[p++] = 0; // char_temp[2]; payload[p++] = 0;//temperature >> 8; // char_temp[1]; payload[p++] = 0; //temperature; //char_temp[0]; // huminity payload[p++] = 0; payload[p++] = 0;//char_hum[0]; payload[p++] = 0;//char_hum[1]; payload[p++] = 0;//char_hum[2]; payload[p++] = 0; payload[p++] = 0; //Start radio setup and linked advertisment radioUpdateAdvData(ADVLEN, payload); //Start radio setup and linked advertisment radioSetupAndTransmit(); //} //END: Transmit /*****************************************************************************************/ //Wait in IDLE for CMD_DONE interrupt after radio setup. ISR will disable radio interrupts while( ! rfSetupDone) { powerDisableCPU(); PRCMDeepSleep(); } //Disable flash in IDLE after CMD_RADIO_SETUP is done (radio setup reads FCFG trim values) powerDisableFlashInIdle(); //Wait in IDLE for LAST_CMD_DONE after 3 adv packets while( ! rfAdvertisingDone) { powerDisableCPU(); PRCMDeepSleep(); } //Request radio to not force on system bus any more radioCmdBusRequest(false); // } // end if // g_count++; // // Standby procedure // powerDisableXtal(); // Turn off radio powerDisableRFC(); // Switch to RCOSC_HF OSCHfSourceSwitch(); // Allow AUX to turn off again. No longer need oscillator interface powerDisableAuxForceOn(); // Goto Standby. MCU will now request to be powered down on DeepSleep powerEnableMcuPdReq(); // Disable cache and retention powerDisableCache(); powerDisableCacheRetention(); //Calculate next recharge SysCtrlSetRechargeBeforePowerDown(XOSC_IN_HIGH_POWER_MODE); // Synchronize transactions to AON domain to ensure AUX has turned off SysCtrlAonSync(); // // Enter Standby // powerDisableCPU(); PRCMDeepSleep(); SysCtrlAonUpdate(); SysCtrlAdjustRechargeAfterPowerDown(); SysCtrlAonSync(); // // Wakeup from RTC, code starts execution from here // powerEnableRFC(); powerEnableAuxForceOn(); //Re-enable cache and retention powerEnableCache(); powerEnableCacheRetention(); //MCU will not request to be powered down on DeepSleep -> System goes only to IDLE powerDisableMcuPdReq(); } }