void SpiInit( Spi_t *obj, PinNames mosi, PinNames miso, PinNames sclk, PinNames nss ) { __HAL_RCC_SPI1_FORCE_RESET( ); __HAL_RCC_SPI1_RELEASE_RESET( ); __HAL_RCC_SPI1_CLK_ENABLE( ); obj->Spi.Instance = ( SPI_TypeDef *) SPI1_BASE; GpioInit( &obj->Mosi, mosi, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, GPIO_AF5_SPI1 ); GpioInit( &obj->Miso, miso, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, GPIO_AF5_SPI1 ); GpioInit( &obj->Sclk, sclk, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, GPIO_AF5_SPI1 ); if( nss != NC ) { GpioInit( &obj->Nss, nss, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF5_SPI1 ); } else { obj->Spi.Init.NSS = SPI_NSS_SOFT; } if( nss == NC ) { SpiFormat( obj, SPI_DATASIZE_8BIT, SPI_POLARITY_LOW, SPI_PHASE_1EDGE, 0 ); } else { SpiFormat( obj, SPI_DATASIZE_8BIT, SPI_POLARITY_LOW, SPI_PHASE_1EDGE, 1 ); } SpiFrequency( obj, 10000000 ); HAL_SPI_Init( &obj->Spi ); }
void SpiInit( Spi_t *obj, PinNames mosi, PinNames miso, PinNames sclk, PinNames nss ) { GpioInit( &obj->Mosi, mosi, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0 ); GpioInit( &obj->Miso, miso, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0 ); GpioInit( &obj->Sclk, sclk, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0 ); // TODO: Make independent of stm32l1xx_gpio.h GPIO_PinAFConfig( obj->Mosi.port, ( obj->Mosi.pin & 0x0F ), GPIO_AF_SPI2 ); GPIO_PinAFConfig( obj->Miso.port, ( obj->Miso.pin & 0x0F ), GPIO_AF_SPI2 ); GPIO_PinAFConfig( obj->Sclk.port, ( obj->Sclk.pin & 0x0F ), GPIO_AF_SPI2 ); if( nss != NC ) { GpioInit( &obj->Nss, nss, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, 1 ); // TODO: Make independent of stm32l1xx_gpio.h GPIO_PinAFConfig( obj->Nss.port, ( obj->Nss.pin & 0x0F ), GPIO_AF_SPI2 ); } else { SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; } // Choose SPI interface according to the given pins obj->Spi = ( SPI_TypeDef* )SPI2_BASE; //RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE ); RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE ); RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE ); /* used for SPI2 */ RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB | RCC_AHBPeriph_GPIOC, ENABLE ); if( nss == NC ) { // 8 bits, CPOL = 0, CPHA = 0, MASTER SpiFormat( obj, 8, 0, 0, 0 ); } else { // 8 bits, CPOL = 0, CPHA = 0, SLAVE SpiFormat( obj, 8, 0, 0, 1 ); } SpiFrequency( obj, 10000000 ); SPI_Cmd( obj->Spi, ENABLE ); }
void SpiInit(Spi_t *obj, PinNames mosi, PinNames miso, PinNames sclk, PinNames nss) { /* Check if a proper channel was selected */ if (g_spiBase[obj->instance] == NULL) return; obj->Spi = g_spiBase[obj->instance]; GpioInit(&obj->Mosi, mosi, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0); GpioInit(&obj->Miso, miso, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0); GpioInit(&obj->Sclk, sclk, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0); if (nss != NC) GpioInit(&obj->Nss, nss, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 1); /* Enable clock for SPI.*/ CLOCK_SYS_EnableSpiClock(obj->instance); // Initialize the SPI module registers to default value, which disables the module SPI_HAL_Init(obj->Spi); // Set the SPI pin mode to normal mode SPI_HAL_SetPinMode(obj->Spi, kSpiPinMode_Normal); #if FSL_FEATURE_SPI_FIFO_SIZE if (g_spiFifoSize[obj->instance] != 0) { // If SPI module contains a FIFO, disable it and set watermarks to half full/empty SPI_HAL_SetFifoMode(obj->Spi, false, kSpiTxFifoOneHalfEmpty, kSpiRxFifoOneHalfFull); } #endif if (!obj->isSlave) { // 8 bits, CPOL = 0, CPHA = 0, MASTER SpiFormat(obj, 8, 0, 0, 0); } else { // 8 bits, CPOL = 0, CPHA = 0, SLAVE SpiFormat(obj, 8, 0, 0, 1); } SpiFrequency(obj, 10000000); /* Enable Spi module */ SPI_HAL_Enable(obj->Spi); }
void SpiInit(Spi_t *obj, PinNames mosi, PinNames miso, PinNames sclk, PinNames nss) { /* Check if a proper channel was selected */ if (g_dspiBase[obj->instance] == NULL) return; obj->Spi = g_dspiBase[obj->instance]; GpioInit(&obj->Mosi, mosi, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0); GpioInit(&obj->Miso, miso, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0); GpioInit(&obj->Sclk, sclk, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_DOWN, 0); if (nss != NC) GpioInit(&obj->Nss, nss, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, 1); if (!obj->isSlave) { // Enable DSPI clock. CLOCK_SYS_EnableSpiClock(obj->instance); // Initialize the DSPI module registers to default value, which disables the module DSPI_HAL_Init(obj->Spi); // Set to master mode. DSPI_HAL_SetMasterSlaveMode(obj->Spi, kDspiMaster); // Configure for continuous SCK operation DSPI_HAL_SetContinuousSckCmd(obj->Spi, false); // Configure for peripheral chip select polarity DSPI_HAL_SetPcsPolarityMode(obj->Spi, kDspiPcs0, kDspiPcs_ActiveLow); // Disable FIFO operation. DSPI_HAL_SetFifoCmd(obj->Spi, false, false); // Initialize the configurable delays: PCS-to-SCK, prescaler = 0, scaler = 1 DSPI_HAL_SetDelay(obj->Spi, kDspiCtar0, 0, 1, kDspiPcsToSck); // DSPI system enable DSPI_HAL_Enable(obj->Spi); // 8 bits, CPOL = 0, CPHA = 0, MASTER SpiFormat(obj, 8, 0, 0, 0); } else { // 8 bits, CPOL = 0, CPHA = 0, SLAVE SpiFormat(obj, 8, 0, 0, 1); } SpiFrequency(obj, 10000000); }