/******************************************************************************* ** ** ** FUNC-NAME : SCP_Init() ** ** ** *******************************************************************************/ void SCP_Init(void) { /* Init SPI peripheral */ pinMode(SCK_PIN, OUTPUT); pinMode(MOSI_PIN, OUTPUT); pinMode(MISO_PIN, INPUT); pinMode(SS_PIN, OUTPUT); SPI_SetMode(_BV(SPIE) | _BV(SPR1)); /* enable SPI ISR, Fosc/16 (250kHz) */ /* Attach external interrupt to the DRDY pin, SCP1000 data ready. MEGA pin 19 */ attachInterrupt(EXTERNAL_INT_4, Scp_DataReadyISR, RISING); }
static rt_err_t configure(struct rt_spi_device *device, struct rt_spi_configuration *configuration) { struct rt_spi_bus *spi_bus = (struct rt_spi_bus *)device->bus; struct tina_spi_cs *tina_spi_cs = device->parent.user_data; struct tina_spi *_spi_info = (struct tina_spi *)spi_bus->parent.user_data; SPI_T *spi = _spi_info->spi; DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); RT_ASSERT(device != RT_NULL); RT_ASSERT(configuration != RT_NULL); DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); DEBUG_PRINTF("spi address: %08X\n", (rt_uint32_t)spi); SPI_Disable(spi); SPI_Reset(spi); SPI_ResetRxFifo(spi); SPI_ResetTxFifo(spi); DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); /* data_width */ if (configuration->data_width != 8) { DEBUG_PRINTF("error: data_width is %d\n", configuration->data_width); return RT_EIO; } DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); SPI_SetDuplex(spi, SPI_TCTRL_DHB_FULL_DUPLEX); SPI_SetMode(spi, SPI_CTRL_MODE_MASTER); /* MSB or LSB */ if (configuration->mode & RT_SPI_MSB) { SPI_SetFirstTransmitBit(spi, SPI_TCTRL_FBS_MSB); } else { SPI_SetFirstTransmitBit(spi, SPI_TCTRL_FBS_LSB); } switch (configuration->mode) { case RT_SPI_MODE_0: SPI_SetSclkMode(spi, SPI_SCLK_Mode0); break; case RT_SPI_MODE_1: SPI_SetSclkMode(spi, SPI_SCLK_Mode1); break; case RT_SPI_MODE_2: SPI_SetSclkMode(spi, SPI_SCLK_Mode2); break; case RT_SPI_MODE_3: SPI_SetSclkMode(spi, SPI_SCLK_Mode3); break; } /* baudrate */ { unsigned int spi_clock = 0; rt_uint32_t max_hz; rt_uint32_t div; DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); max_hz = configuration->max_hz; if (max_hz > SPI_BUS_MAX_CLK) { max_hz = SPI_BUS_MAX_CLK; } spi_clock = ahb_get_clk(); DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); div = (spi_clock + max_hz - 1) / max_hz; dbg_log(DBG_LOG, "configuration->max_hz: %d\n", configuration->max_hz); dbg_log(DBG_LOG, "max freq: %d\n", max_hz); dbg_log(DBG_LOG, "spi_clock: %d\n", spi_clock); dbg_log(DBG_LOG, "div: %d\n", div); SPI_SetClkDiv(spi, div / 2); } /* baudrate */ SPI_ManualChipSelect(spi, tina_spi_cs->cs); SPI_SetDataSize(spi, 0, 0); SPI_Enable(spi); DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); return RT_EOK; };