/*========================= IMPLEMENTATION =========================*/ int spi_init(SpiMaster_t SpiMasterEnable, SpiMode_t SpiMode, SpiDataOrder_t DataOrder, SpiSpeed_t SpiSpeed) { // enable SPI module PRR &= ~(1 << PRSPI); // I/O interface IO_INPUT_NO_PULLUP(SPI, 1, MISO); IO_OUTPUT(SPI, 3, MOSI, SCK, SS); // set default value SS pin IO_SET(SPI,1,SS); // Clear interrupt flag (and write SPI2X) IO_PUT(SPSR,(1<<SPIF) | (SpiSpeed & (1<<(SPI2X+MAGIC_OFFSET)))>>MAGIC_OFFSET); // init buffer sgSpi.buffer.in_ptr = NULL; sgSpi.buffer.out_ptr = NULL; sgSpi.buffer.end = NULL; sgSpi.buffer.size = 0; sgSpi.busy = false; // Configure SPI and enable the SPI interface SPCR = (uint8_t)SpiMasterEnable | (uint8_t)SpiMode | (uint8_t)DataOrder | ((uint8_t)(SpiSpeed & ((1<<SPR1) | (1<<SPR0)))) | (1<<SPE); return 0; }
void InitIO() { IO_OUTPUT(DATA_OUT_TRIGGER_PIN); ANSELBIT(DATA_OUT_TRIGGER_AN_PIN) = 0; IO_OUTPUT(ALERT_PIN); ANSELBIT(ALERT_AN_PIN) = 0; IO_OUTPUT(DATA_OUT0_PIN); ANSELBIT(DATA_OUT0_AN_PIN) = 0; IO_OUTPUT(DATA_OUT1_PIN); // ANSELBIT(DATA_OUT0_AN_PIN) = 0; IO_OUTPUT(DATA_OUT2_PIN); ANSELBIT(DATA_OUT0_AN_PIN) = 0; IO_OUTPUT(DATA_OUT3_PIN); ANSELBIT(DATA_OUT0_AN_PIN) = 0; IO_INPUT(DATA_IN0_PIN); ANSELBIT(DATA_IN0_AN_PIN) = 0; IO_INPUT(DATA_IN1_PIN); ANSELBIT(DATA_IN1_AN_PIN) = 0; IO_INPUT(DATA_IN2_PIN); // ANSELBIT(DATA_IN2_AN_PIN) = 0; IO_INPUT(DATA_IN3_PIN); // ANSELBIT(DATA_IN3_AN_PIN) = 0; }
// Does the basic GPIO/function configuration of a pin using the pin config constant. void configPin(const uint32_t pin) { PINSEL_CFG_Type PinCfg; PinCfg.Pinnum = IO_PIN(pin); PinCfg.Portnum = IO_PORT(pin); PinCfg.Funcnum = IO_FUNC(pin); PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; PINSEL_ConfigPin(&PinCfg); GPIO_SetDir(IO_PORT(pin), 1<<IO_PIN(pin), IO_OUTPUT(pin) ? 1 : 0); }