void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) { GPIO_InitTypeDef GPIO_InitStruct; if(hspi->Instance == SPI4) //Plan board, SPI Slave { //Enable GPIO clock __GPIOE_CLK_ENABLE(); //Enable peripheral clock __SPI4_CLK_ENABLE(); //SPI4 pins: //=-=-=-=-= //NSS4: PE4 //MOSI4: PE6 //MISO4: PE5 //SCK4: PE2 //All but NSS: GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); //It seems that NSS can't be used as a good CS => set as input, ISR on change GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); //Enable interrupts/NVIC for SPI data lines HAL_NVIC_SetPriority(SPI4_IRQn, 0, 1); HAL_NVIC_EnableIRQ(SPI4_IRQn); //And for the the CS pin HAL_NVIC_SetPriority(EXTI4_IRQn, EXT4_IRQ_CHANNEL, EXT4_IRQ_SUBCHANNEL); HAL_NVIC_EnableIRQ(EXTI4_IRQn); } else if(hspi->Instance == SPI5) //FLASH, SPI Master { //Enable GPIO clock __GPIOF_CLK_ENABLE(); //Enable peripheral clock __SPI5_CLK_ENABLE(); //SPI5 pins: //=-=-=-=-= //NSS5: PF6 //MOSI5: PF9 //MISO5: PF8 //SCK5: PF7 //All but NSS: GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); //Enable interrupts/NVIC for SPI data lines HAL_NVIC_SetPriority(SPI5_IRQn, 7, 7); HAL_NVIC_EnableIRQ(SPI5_IRQn); } else if(hspi->Instance == SPI6) //Expansion connector, SPI Master { //Enable GPIO clock __GPIOG_CLK_ENABLE(); //Enable peripheral clock __SPI6_CLK_ENABLE(); //SPI6 pins: //=-=-=-=-= //NSS6: PG8 //MOSI6: PG14 //MISO6: PG12 //SCK6: PG13 //All but NSS: GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Alternate = GPIO_AF5_SPI6; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); //Enable interrupts/NVIC for SPI data lines HAL_NVIC_SetPriority(SPI6_IRQn, 7, 7); HAL_NVIC_EnableIRQ(SPI6_IRQn); } else { //Trying to configure a port that doesn't exist, flag the error flexsea_error(SE_INVALID_SPI); } }
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk) { // Determine the SPI to use SPIName spi_mosi = (SPIName)pinmap_peripheral(mosi, PinMap_SPI_MOSI); SPIName spi_miso = (SPIName)pinmap_peripheral(miso, PinMap_SPI_MISO); SPIName spi_sclk = (SPIName)pinmap_peripheral(sclk, PinMap_SPI_SCLK); SPIName spi_data = (SPIName)pinmap_merge(spi_mosi, spi_miso); SPIName instance = (SPIName)pinmap_merge(spi_data, spi_sclk); MBED_ASSERT(instance != (SPIName)NC); // Enable SPI clock and set the right module number switch(instance) { case SPI_1: __SPI1_CLK_ENABLE(); obj->spi.module = 0; break; case SPI_2: __SPI2_CLK_ENABLE(); obj->spi.module = 1; break; case SPI_3: __SPI3_CLK_ENABLE(); obj->spi.module = 2; break; #if MODULES_SIZE_SPI > 3 case SPI_4: __SPI4_CLK_ENABLE(); obj->spi.module = 3; break; #endif #if MODULES_SIZE_SPI > 4 case SPI_5: __SPI5_CLK_ENABLE(); obj->spi.module = 4; break; #endif #if MODULES_SIZE_SPI > 5 case SPI_6: __SPI6_CLK_ENABLE(); obj->spi.module = 5; break; #endif default: break; } // Configure the SPI pins pinmap_pinout(mosi, PinMap_SPI_MOSI); pinmap_pinout(miso, PinMap_SPI_MISO); pinmap_pinout(sclk, PinMap_SPI_SCLK); obj->spi.pin_miso = miso; obj->spi.pin_mosi = mosi; obj->spi.pin_sclk = sclk; // initialize the handle for this master! SPI_HandleTypeDef *handle = &SpiHandle[obj->spi.module]; handle->Instance = (SPI_TypeDef *)(instance); handle->Init.Mode = SPI_MODE_MASTER; handle->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; handle->Init.Direction = SPI_DIRECTION_2LINES; handle->Init.CLKPhase = SPI_PHASE_1EDGE; handle->Init.CLKPolarity = SPI_POLARITY_LOW; handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED; handle->Init.CRCPolynomial = 7; handle->Init.DataSize = SPI_DATASIZE_8BIT; handle->Init.FirstBit = SPI_FIRSTBIT_MSB; handle->Init.NSS = SPI_NSS_SOFT; handle->Init.TIMode = SPI_TIMODE_DISABLED; DEBUG_PRINTF("SPI%u: Init\n", obj->spi.module+1); init_spi(obj); }