[FL-1666] Bootloader: info screen when we going to DFU. FuriHal: port SPI to LL. Cleanup. (#634)
* FuriHal: port spi to ll. Bootloader: add spi and display. * Makefile: rollback disabled freertos introspection * FuriHal: spi lock asserts. F6: minor cleanup port sdcard shenanigans to furi_hal_gpio. * SdCard: port missing bits to furi-hal-gpio * FuriHal: fix broken RX in SPI, update SPI API usage. RFAL: more asserts in SPI platform code. * GUI: clear canvas on start. FuriHal: no pullup on radio spi bus. * FuriHal: use check instead of assert in spi lock routines * FuriHal: remove timeouts * SdHal: add guard time to SDCARD CS PIN control. * FuriHal: proper name for SPI device reconfigure routine. SdHal: one more enterprise delay and better documentation. * Bootloader: update DFU text and add image. * FuriHal: drop unused ST HAL modules. * SdHal: fixed swapped hal_gpio_init_ex arguments * SpiHal: fixed swapped hal_gpio_init_ex arguments * IrdaHal: use hal_gpio_init instead of hal_gpio_init_ex * RfidHal: fixed swapped hal_gpio_init_ex arguments Co-authored-by: DrZlo13 <who.just.the.doctor@gmail.com>
This commit is contained in:
		| @@ -1,128 +0,0 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    adc.c | ||||
|   * @brief   This file provides code for the configuration | ||||
|   *          of the ADC instances. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "adc.h" | ||||
|  | ||||
| /* USER CODE BEGIN 0 */ | ||||
|  | ||||
| /* USER CODE END 0 */ | ||||
|  | ||||
| ADC_HandleTypeDef hadc1; | ||||
|  | ||||
| /* ADC1 init function */ | ||||
| void MX_ADC1_Init(void) | ||||
| { | ||||
|   ADC_ChannelConfTypeDef sConfig = {0}; | ||||
|  | ||||
|   /** Common config | ||||
|   */ | ||||
|   hadc1.Instance = ADC1; | ||||
|   hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; | ||||
|   hadc1.Init.Resolution = ADC_RESOLUTION_12B; | ||||
|   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; | ||||
|   hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; | ||||
|   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; | ||||
|   hadc1.Init.LowPowerAutoWait = DISABLE; | ||||
|   hadc1.Init.ContinuousConvMode = DISABLE; | ||||
|   hadc1.Init.NbrOfConversion = 1; | ||||
|   hadc1.Init.DiscontinuousConvMode = DISABLE; | ||||
|   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; | ||||
|   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; | ||||
|   hadc1.Init.DMAContinuousRequests = DISABLE; | ||||
|   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; | ||||
|   hadc1.Init.OversamplingMode = DISABLE; | ||||
|   if (HAL_ADC_Init(&hadc1) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|   /** Configure Regular Channel | ||||
|   */ | ||||
|   sConfig.Channel = ADC_CHANNEL_14; | ||||
|   sConfig.Rank = ADC_REGULAR_RANK_1; | ||||
|   sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; | ||||
|   sConfig.SingleDiff = ADC_SINGLE_ENDED; | ||||
|   sConfig.OffsetNumber = ADC_OFFSET_NONE; | ||||
|   sConfig.Offset = 0; | ||||
|   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) | ||||
| { | ||||
|  | ||||
|   GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|   if(adcHandle->Instance==ADC1) | ||||
|   { | ||||
|   /* USER CODE BEGIN ADC1_MspInit 0 */ | ||||
|  | ||||
|   /* USER CODE END ADC1_MspInit 0 */ | ||||
|     /* ADC1 clock enable */ | ||||
|     __HAL_RCC_ADC_CLK_ENABLE(); | ||||
|  | ||||
|     __HAL_RCC_GPIOC_CLK_ENABLE(); | ||||
|     /**ADC1 GPIO Configuration | ||||
|     PC5     ------> ADC1_IN14 | ||||
|     */ | ||||
|     GPIO_InitStruct.Pin = RFID_RF_IN_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     HAL_GPIO_Init(RFID_RF_IN_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* ADC1 interrupt Init */ | ||||
|     HAL_NVIC_SetPriority(ADC1_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(ADC1_IRQn); | ||||
|   /* USER CODE BEGIN ADC1_MspInit 1 */ | ||||
|  | ||||
|   /* USER CODE END ADC1_MspInit 1 */ | ||||
|   } | ||||
| } | ||||
|  | ||||
| void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) | ||||
| { | ||||
|  | ||||
|   if(adcHandle->Instance==ADC1) | ||||
|   { | ||||
|   /* USER CODE BEGIN ADC1_MspDeInit 0 */ | ||||
|  | ||||
|   /* USER CODE END ADC1_MspDeInit 0 */ | ||||
|     /* Peripheral clock disable */ | ||||
|     __HAL_RCC_ADC_CLK_DISABLE(); | ||||
|  | ||||
|     /**ADC1 GPIO Configuration | ||||
|     PC5     ------> ADC1_IN14 | ||||
|     */ | ||||
|     HAL_GPIO_DeInit(RFID_RF_IN_GPIO_Port, RFID_RF_IN_Pin); | ||||
|  | ||||
|     /* ADC1 interrupt Deinit */ | ||||
|     HAL_NVIC_DisableIRQ(ADC1_IRQn); | ||||
|   /* USER CODE BEGIN ADC1_MspDeInit 1 */ | ||||
|  | ||||
|   /* USER CODE END ADC1_MspDeInit 1 */ | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* USER CODE BEGIN 1 */ | ||||
|  | ||||
| /* USER CODE END 1 */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @@ -1,82 +0,0 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    crc.c | ||||
|   * @brief   This file provides code for the configuration | ||||
|   *          of the CRC instances. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "crc.h" | ||||
|  | ||||
| /* USER CODE BEGIN 0 */ | ||||
|  | ||||
| /* USER CODE END 0 */ | ||||
|  | ||||
| CRC_HandleTypeDef hcrc; | ||||
|  | ||||
| /* CRC init function */ | ||||
| void MX_CRC_Init(void) | ||||
| { | ||||
|  | ||||
|   hcrc.Instance = CRC; | ||||
|   hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; | ||||
|   hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; | ||||
|   hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; | ||||
|   hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; | ||||
|   hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; | ||||
|   if (HAL_CRC_Init(&hcrc) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle) | ||||
| { | ||||
|  | ||||
|   if(crcHandle->Instance==CRC) | ||||
|   { | ||||
|   /* USER CODE BEGIN CRC_MspInit 0 */ | ||||
|  | ||||
|   /* USER CODE END CRC_MspInit 0 */ | ||||
|     /* CRC clock enable */ | ||||
|     __HAL_RCC_CRC_CLK_ENABLE(); | ||||
|   /* USER CODE BEGIN CRC_MspInit 1 */ | ||||
|  | ||||
|   /* USER CODE END CRC_MspInit 1 */ | ||||
|   } | ||||
| } | ||||
|  | ||||
| void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle) | ||||
| { | ||||
|  | ||||
|   if(crcHandle->Instance==CRC) | ||||
|   { | ||||
|   /* USER CODE BEGIN CRC_MspDeInit 0 */ | ||||
|  | ||||
|   /* USER CODE END CRC_MspDeInit 0 */ | ||||
|     /* Peripheral clock disable */ | ||||
|     __HAL_RCC_CRC_CLK_DISABLE(); | ||||
|   /* USER CODE BEGIN CRC_MspDeInit 1 */ | ||||
|  | ||||
|   /* USER CODE END CRC_MspDeInit 1 */ | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* USER CODE BEGIN 1 */ | ||||
|  | ||||
| /* USER CODE END 1 */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @@ -1,26 +1,18 @@ | ||||
| #include "main.h" | ||||
| #include "furi-hal-spi.h" | ||||
| #include <furi-hal.h> | ||||
| #include <furi.h> | ||||
|  | ||||
| #define SD_DUMMY_BYTE 0xFF | ||||
|  | ||||
| const uint32_t SpiTimeout = 1000; | ||||
| uint8_t SD_IO_WriteByte(uint8_t Data); | ||||
| static const FuriHalSpiDevice* sd_spi_dev = &furi_hal_spi_devices[FuriHalSpiDeviceIdSdCardFast]; | ||||
|  | ||||
| static const FuriHalSpiDevice* sd_spi_dev = &furi_hal_spi_devices[FuriHalSpiDeviceIdSdCardFast]; | ||||
|  | ||||
| /****************************************************************************** | ||||
|                             BUS OPERATIONS | ||||
|  *******************************************************************************/ | ||||
|  | ||||
| /** | ||||
|  * @brief  SPI error treatment function | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_Error(void) { | ||||
|     /* Re-Initiaize the SPI communication BUS */ | ||||
|     furi_hal_spi_bus_reset(sd_spi_dev->bus); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  SPI Write byte(s) to device | ||||
|  * @param  DataIn: Pointer to data buffer to write | ||||
| @@ -29,13 +21,7 @@ static void SPIx_Error(void) { | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SPIx_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t DataLength) { | ||||
|     bool status = furi_hal_spi_bus_trx(sd_spi_dev->bus, (uint8_t*)DataIn, DataOut, DataLength, SpiTimeout); | ||||
|  | ||||
|     /* Check the communication status */ | ||||
|     if(!status) { | ||||
|         /* Execute user timeout callback */ | ||||
|         SPIx_Error(); | ||||
|     } | ||||
|     furi_check(furi_hal_spi_bus_trx(sd_spi_dev->bus, (uint8_t*)DataIn, DataOut, DataLength, SpiTimeout)); | ||||
| } | ||||
|  | ||||
| /** | ||||
| @@ -44,15 +30,7 @@ static void SPIx_WriteReadData(const uint8_t* DataIn, uint8_t* DataOut, uint16_t | ||||
|  * @retval None | ||||
|  */ | ||||
| __attribute__((unused)) static void SPIx_Write(uint8_t Value) { | ||||
|     uint8_t data; | ||||
|  | ||||
|     bool status = furi_hal_spi_bus_trx(sd_spi_dev->bus, (uint8_t*)&Value, &data, 1, SpiTimeout); | ||||
|  | ||||
|     /* Check the communication status */ | ||||
|     if(!status) { | ||||
|         /* Execute user timeout callback */ | ||||
|         SPIx_Error(); | ||||
|     } | ||||
|     furi_check(furi_hal_spi_bus_tx(sd_spi_dev->bus, (uint8_t*)&Value, 1, SpiTimeout)); | ||||
| } | ||||
|  | ||||
| /****************************************************************************** | ||||
| @@ -70,6 +48,7 @@ void SD_IO_Init(void) { | ||||
|  | ||||
|     /* SD chip select high */ | ||||
|     hal_gpio_write(sd_spi_dev->chip_select, true); | ||||
|     delay_us(10); | ||||
|  | ||||
|     /* Send dummy byte 0xFF, 10 times with CS high */ | ||||
|     /* Rise CS and MOSI for 80 clocks cycles */ | ||||
| @@ -85,10 +64,13 @@ void SD_IO_Init(void) { | ||||
|  * @retval None | ||||
|  */ | ||||
| void SD_IO_CSState(uint8_t val) { | ||||
|     /* Some SD Cards are prone to fail if CLK-ed too soon after CS transition. Worst case found: 8us */ | ||||
|     if(val == 1) { | ||||
|         delay_us(10); // Exit guard time for some SD cards | ||||
|         hal_gpio_write(sd_spi_dev->chip_select, true); | ||||
|     } else { | ||||
|         hal_gpio_write(sd_spi_dev->chip_select, false); | ||||
|         delay_us(10); // Entry guard time for some SD cards | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -91,8 +91,9 @@ | ||||
| #include "stdlib.h" | ||||
| #include "string.h" | ||||
| #include "stdio.h" | ||||
| #include "spi.h" | ||||
| #include <furi-hal-spi.h> | ||||
| #include <furi-hal-gpio.h> | ||||
| #include <furi-hal-resources.h> | ||||
| #include <furi-hal-power.h> | ||||
| #include <furi-hal-delay.h> | ||||
| #include <furi-hal-sd.h> | ||||
| @@ -282,6 +283,25 @@ static uint8_t SD_ReadData(void); | ||||
|  | ||||
| /* Private functions ---------------------------------------------------------*/ | ||||
|  | ||||
| void SD_SPI_Bus_To_Down_State(){ | ||||
|     hal_gpio_init_ex(&gpio_spi_d_miso, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh, GpioAltFnUnused); | ||||
|     hal_gpio_init_ex(&gpio_spi_d_mosi, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh, GpioAltFnUnused); | ||||
|     hal_gpio_init_ex(&gpio_spi_d_sck, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh, GpioAltFnUnused); | ||||
|  | ||||
|     hal_gpio_write(&gpio_sdcard_cs, false); | ||||
|     hal_gpio_write(&gpio_spi_d_miso, false); | ||||
|     hal_gpio_write(&gpio_spi_d_mosi, false); | ||||
|     hal_gpio_write(&gpio_spi_d_sck, false); | ||||
| } | ||||
|  | ||||
| void SD_SPI_Bus_To_Normal_State(){ | ||||
|     hal_gpio_write(&gpio_sdcard_cs, true); | ||||
|  | ||||
|     hal_gpio_init_ex(&gpio_spi_d_miso, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedVeryHigh, GpioAltFn5SPI2); | ||||
|     hal_gpio_init_ex(&gpio_spi_d_mosi, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedVeryHigh, GpioAltFn5SPI2); | ||||
|     hal_gpio_init_ex(&gpio_spi_d_sck, GpioModeAltFunctionPushPull, GpioPullUp, GpioSpeedVeryHigh, GpioAltFn5SPI2); | ||||
| } | ||||
|  | ||||
| /** @defgroup STM32_ADAFRUIT_SD_Private_Functions | ||||
|   * @{ | ||||
|   */ | ||||
| @@ -295,9 +315,7 @@ static uint8_t SD_ReadData(void); | ||||
|   */ | ||||
| uint8_t BSP_SD_Init(bool reset_card) { | ||||
|     /* Slow speed init */ | ||||
|     const FuriHalSpiDevice* sd_spi_slow_dev = &furi_hal_spi_devices[FuriHalSpiDeviceIdSdCardSlow]; | ||||
|     furi_hal_spi_bus_lock(sd_spi_slow_dev->bus); | ||||
|     furi_hal_spi_bus_configure(sd_spi_slow_dev->bus, sd_spi_slow_dev->config); | ||||
|     const FuriHalSpiDevice* sd_spi_slow_dev = furi_hal_spi_device_get(FuriHalSpiDeviceIdSdCardSlow); | ||||
|  | ||||
|     /* We must reset card in spi_lock context */ | ||||
|     if(reset_card) { | ||||
| @@ -326,7 +344,7 @@ uint8_t BSP_SD_Init(bool reset_card) { | ||||
|         if(res == BSP_SD_OK) break; | ||||
|     } | ||||
|  | ||||
|     furi_hal_spi_bus_unlock(sd_spi_slow_dev->bus); | ||||
|     furi_hal_spi_device_return(sd_spi_slow_dev); | ||||
|  | ||||
|     /* SD initialized and set to SPI mode properly */ | ||||
|     return res; | ||||
|   | ||||
| @@ -35,7 +35,6 @@ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "user_diskio.h" | ||||
| #include "spi.h" | ||||
| #include "furi-hal-spi.h" | ||||
| /* Private typedef -----------------------------------------------------------*/ | ||||
| /* Private define ------------------------------------------------------------*/ | ||||
| @@ -53,7 +52,6 @@ static DSTATUS User_CheckStatus(BYTE lun) { | ||||
|     return Stat; | ||||
| } | ||||
|  | ||||
| static const FuriHalSpiDevice* sd_spi_fast_dev = &furi_hal_spi_devices[FuriHalSpiDeviceIdSdCardFast]; | ||||
| /* USER CODE END DECL */ | ||||
|  | ||||
| /* Private function prototypes -----------------------------------------------*/ | ||||
| @@ -89,12 +87,11 @@ Diskio_drvTypeDef USER_Driver = { | ||||
| DSTATUS USER_initialize(BYTE pdrv) { | ||||
|     /* USER CODE BEGIN INIT */ | ||||
|  | ||||
|     furi_hal_spi_bus_lock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_bus_configure(sd_spi_fast_dev->bus, sd_spi_fast_dev->config); | ||||
|     const FuriHalSpiDevice* sd_spi_fast_dev = furi_hal_spi_device_get(FuriHalSpiDeviceIdSdCardFast); | ||||
|  | ||||
|     DSTATUS status = User_CheckStatus(pdrv); | ||||
|  | ||||
|     furi_hal_spi_bus_unlock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_device_return(sd_spi_fast_dev); | ||||
|  | ||||
|     return status; | ||||
|     /* USER CODE END INIT */ | ||||
| @@ -123,8 +120,7 @@ DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { | ||||
|     /* USER CODE BEGIN READ */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|  | ||||
|     furi_hal_spi_bus_lock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_bus_configure(sd_spi_fast_dev->bus, sd_spi_fast_dev->config); | ||||
|     const FuriHalSpiDevice* sd_spi_fast_dev = furi_hal_spi_device_get(FuriHalSpiDeviceIdSdCardFast); | ||||
|  | ||||
|     if(BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the read operation is finished */ | ||||
| @@ -133,7 +129,7 @@ DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { | ||||
|         res = RES_OK; | ||||
|     } | ||||
|  | ||||
|     furi_hal_spi_bus_unlock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_device_return(sd_spi_fast_dev); | ||||
|  | ||||
|     return res; | ||||
|     /* USER CODE END READ */ | ||||
| @@ -153,8 +149,7 @@ DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { | ||||
|     /* USER CODE HERE */ | ||||
|     DRESULT res = RES_ERROR; | ||||
|  | ||||
|     furi_hal_spi_bus_lock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_bus_configure(sd_spi_fast_dev->bus, sd_spi_fast_dev->config); | ||||
|     const FuriHalSpiDevice* sd_spi_fast_dev = furi_hal_spi_device_get(FuriHalSpiDeviceIdSdCardFast); | ||||
|  | ||||
|     if(BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) { | ||||
|         /* wait until the Write operation is finished */ | ||||
| @@ -163,7 +158,7 @@ DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { | ||||
|         res = RES_OK; | ||||
|     } | ||||
|  | ||||
|     furi_hal_spi_bus_unlock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_device_return(sd_spi_fast_dev); | ||||
|  | ||||
|     return res; | ||||
|     /* USER CODE END WRITE */ | ||||
| @@ -185,8 +180,7 @@ DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff) { | ||||
|  | ||||
|     if(Stat & STA_NOINIT) return RES_NOTRDY; | ||||
|  | ||||
|     furi_hal_spi_bus_lock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_bus_configure(sd_spi_fast_dev->bus, sd_spi_fast_dev->config); | ||||
|     const FuriHalSpiDevice* sd_spi_fast_dev = furi_hal_spi_device_get(FuriHalSpiDeviceIdSdCardFast); | ||||
|  | ||||
|     switch(cmd) { | ||||
|     /* Make sure that no pending write process */ | ||||
| @@ -219,7 +213,7 @@ DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff) { | ||||
|         res = RES_PARERR; | ||||
|     } | ||||
|  | ||||
|     furi_hal_spi_bus_unlock(sd_spi_fast_dev->bus); | ||||
|     furi_hal_spi_device_return(sd_spi_fast_dev); | ||||
|  | ||||
|     return res; | ||||
|     /* USER CODE END IOCTL */ | ||||
|   | ||||
| @@ -67,12 +67,6 @@ void MX_GPIO_Init(void) { | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     HAL_GPIO_Init(RFID_PULL_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /*Configure GPIO pin : PtPin */ | ||||
|     GPIO_InitStruct.Pin = CC1101_G0_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; | ||||
|     GPIO_InitStruct.Pull = GPIO_PULLDOWN; | ||||
|     // HAL_GPIO_Init(CC1101_G0_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /*Configure GPIO pins : PBPin PBPin PBPin */ | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
| @@ -107,22 +101,6 @@ void MX_GPIO_Init(void) { | ||||
|     GPIO_InitStruct.Pin = DISPLAY_RST_Pin; | ||||
|     HAL_GPIO_Init(DISPLAY_RST_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* NFC_CS */ | ||||
|     HAL_GPIO_WritePin(NFC_CS_GPIO_Port, NFC_CS_Pin, GPIO_PIN_SET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|     GPIO_InitStruct.Pin = NFC_CS_Pin; | ||||
|     HAL_GPIO_Init(NFC_CS_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* DISPLAY_CS */ | ||||
|     HAL_GPIO_WritePin(DISPLAY_CS_GPIO_Port, DISPLAY_CS_Pin, GPIO_PIN_SET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Pin = DISPLAY_CS_Pin; | ||||
|     HAL_GPIO_Init(DISPLAY_CS_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* DISPLAY_DI */ | ||||
|     HAL_GPIO_WritePin(DISPLAY_DI_GPIO_Port, DISPLAY_DI_Pin, GPIO_PIN_RESET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
| @@ -137,21 +115,6 @@ void MX_GPIO_Init(void) { | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     HAL_GPIO_Init(SD_CD_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* SD_CS */ | ||||
|     GPIO_InitStruct.Pin = SD_CS_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|     HAL_GPIO_Init(SD_CS_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* CC1101_CS */ | ||||
|     HAL_GPIO_WritePin(CC1101_CS_GPIO_Port, CC1101_CS_Pin, GPIO_PIN_SET); | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|     GPIO_InitStruct.Pin = CC1101_CS_Pin; | ||||
|     HAL_GPIO_Init(CC1101_CS_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     /* Enable all NVIC lines related to gpio */ | ||||
|     HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); | ||||
|     HAL_NVIC_EnableIRQ(EXTI0_IRQn); | ||||
|   | ||||
| @@ -1,374 +0,0 @@ | ||||
| /** | ||||
|   ****************************************************************************** | ||||
|   * @file    spi.c | ||||
|   * @brief   This file provides code for the configuration | ||||
|   *          of the SPI instances. | ||||
|   ****************************************************************************** | ||||
|   * @attention | ||||
|   * | ||||
|   * <h2><center>© Copyright (c) 2021 STMicroelectronics. | ||||
|   * All rights reserved.</center></h2> | ||||
|   * | ||||
|   * This software component is licensed by ST under Ultimate Liberty license | ||||
|   * SLA0044, the "License"; You may not use this file except in compliance with | ||||
|   * the License. You may obtain a copy of the License at: | ||||
|   *                             www.st.com/SLA0044 | ||||
|   * | ||||
|   ****************************************************************************** | ||||
|   */ | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "spi.h" | ||||
| #include <cmsis_os2.h> | ||||
|  | ||||
| /* USER CODE BEGIN 0 */ | ||||
| void Enable_SPI(SPI_HandleTypeDef* spi); | ||||
| /* USER CODE END 0 */ | ||||
|  | ||||
| SPI_HandleTypeDef hspi1; | ||||
| SPI_HandleTypeDef hspi2; | ||||
|  | ||||
| /* SPI1 init function */ | ||||
| void MX_SPI1_Init(void) | ||||
| { | ||||
|  | ||||
|   hspi1.Instance = SPI1; | ||||
|   hspi1.Init.Mode = SPI_MODE_MASTER; | ||||
|   hspi1.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|   hspi1.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|   hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; | ||||
|   hspi1.Init.NSS = SPI_NSS_SOFT; | ||||
|   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; | ||||
|   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|   hspi1.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|   hspi1.Init.CRCPolynomial = 7; | ||||
|   hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|   hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; | ||||
|   if (HAL_SPI_Init(&hspi1) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|  | ||||
| } | ||||
| /* SPI2 init function */ | ||||
| void MX_SPI2_Init(void) | ||||
| { | ||||
|  | ||||
|   hspi2.Instance = SPI2; | ||||
|   hspi2.Init.Mode = SPI_MODE_MASTER; | ||||
|   hspi2.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|   hspi2.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|   hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|   hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; | ||||
|   hspi2.Init.NSS = SPI_NSS_SOFT; | ||||
|   hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; | ||||
|   hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|   hspi2.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|   hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|   hspi2.Init.CRCPolynomial = 7; | ||||
|   hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|   hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; | ||||
|   if (HAL_SPI_Init(&hspi2) != HAL_OK) | ||||
|   { | ||||
|     Error_Handler(); | ||||
|   } | ||||
|  | ||||
| } | ||||
|  | ||||
| void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) | ||||
| { | ||||
|  | ||||
|   GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|   if(spiHandle->Instance==SPI1) | ||||
|   { | ||||
|   /* USER CODE BEGIN SPI1_MspInit 0 */ | ||||
|  | ||||
|   /* USER CODE END SPI1_MspInit 0 */ | ||||
|     /* SPI1 clock enable */ | ||||
|     __HAL_RCC_SPI1_CLK_ENABLE(); | ||||
|  | ||||
|     __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|     /**SPI1 GPIO Configuration | ||||
|     PA5     ------> SPI1_SCK | ||||
|     PB4     ------> SPI1_MISO | ||||
|     PB5     ------> SPI1_MOSI | ||||
|     */ | ||||
|     GPIO_InitStruct.Pin = SPI_R_SCK_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; | ||||
|     HAL_GPIO_Init(SPI_R_SCK_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     GPIO_InitStruct.Pin = SPI_R_MISO_Pin|SPI_R_MOSI_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; | ||||
|     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); | ||||
|  | ||||
|   /* USER CODE BEGIN SPI1_MspInit 1 */ | ||||
|  | ||||
|   /* USER CODE END SPI1_MspInit 1 */ | ||||
|   } | ||||
|   else if(spiHandle->Instance==SPI2) | ||||
|   { | ||||
|   /* USER CODE BEGIN SPI2_MspInit 0 */ | ||||
|  | ||||
|   /* USER CODE END SPI2_MspInit 0 */ | ||||
|     /* SPI2 clock enable */ | ||||
|     __HAL_RCC_SPI2_CLK_ENABLE(); | ||||
|  | ||||
|     __HAL_RCC_GPIOC_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOB_CLK_ENABLE(); | ||||
|     __HAL_RCC_GPIOD_CLK_ENABLE(); | ||||
|     /**SPI2 GPIO Configuration | ||||
|     PC2     ------> SPI2_MISO | ||||
|     PB15     ------> SPI2_MOSI | ||||
|     PD1     ------> SPI2_SCK | ||||
|     */ | ||||
|     GPIO_InitStruct.Pin = GPIO_PIN_2; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; | ||||
|     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); | ||||
|  | ||||
|     GPIO_InitStruct.Pin = SPI_D_MOSI_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; | ||||
|     HAL_GPIO_Init(SPI_D_MOSI_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|     GPIO_InitStruct.Pin = SPI_D_SCK_Pin; | ||||
|     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|     GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|     GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; | ||||
|     HAL_GPIO_Init(SPI_D_SCK_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|   /* USER CODE BEGIN SPI2_MspInit 1 */ | ||||
|    | ||||
|   // SD Card need faster spi gpio | ||||
|   GPIO_InitStruct.Pin = GPIO_PIN_2; | ||||
|   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|   GPIO_InitStruct.Pull = GPIO_PULLUP; | ||||
|   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|   GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; | ||||
|   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); | ||||
|  | ||||
|   GPIO_InitStruct.Pin = SPI_D_MOSI_Pin; | ||||
|   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|   GPIO_InitStruct.Pull = GPIO_PULLUP; | ||||
|   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|   GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; | ||||
|   HAL_GPIO_Init(SPI_D_MOSI_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|   GPIO_InitStruct.Pin = SPI_D_SCK_Pin; | ||||
|   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|   GPIO_InitStruct.Pull = GPIO_PULLUP; | ||||
|   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|   GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; | ||||
|   HAL_GPIO_Init(SPI_D_SCK_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|   /* USER CODE END SPI2_MspInit 1 */ | ||||
|   } | ||||
| } | ||||
|  | ||||
| void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) | ||||
| { | ||||
|  | ||||
|   if(spiHandle->Instance==SPI1) | ||||
|   { | ||||
|   /* USER CODE BEGIN SPI1_MspDeInit 0 */ | ||||
|  | ||||
|   /* USER CODE END SPI1_MspDeInit 0 */ | ||||
|     /* Peripheral clock disable */ | ||||
|     __HAL_RCC_SPI1_CLK_DISABLE(); | ||||
|  | ||||
|     /**SPI1 GPIO Configuration | ||||
|     PA5     ------> SPI1_SCK | ||||
|     PB4     ------> SPI1_MISO | ||||
|     PB5     ------> SPI1_MOSI | ||||
|     */ | ||||
|     HAL_GPIO_DeInit(SPI_R_SCK_GPIO_Port, SPI_R_SCK_Pin); | ||||
|  | ||||
|     HAL_GPIO_DeInit(GPIOB, SPI_R_MISO_Pin|SPI_R_MOSI_Pin); | ||||
|  | ||||
|   /* USER CODE BEGIN SPI1_MspDeInit 1 */ | ||||
|  | ||||
|   /* USER CODE END SPI1_MspDeInit 1 */ | ||||
|   } | ||||
|   else if(spiHandle->Instance==SPI2) | ||||
|   { | ||||
|   /* USER CODE BEGIN SPI2_MspDeInit 0 */ | ||||
|  | ||||
|   /* USER CODE END SPI2_MspDeInit 0 */ | ||||
|     /* Peripheral clock disable */ | ||||
|     __HAL_RCC_SPI2_CLK_DISABLE(); | ||||
|  | ||||
|     /**SPI2 GPIO Configuration | ||||
|     PC2     ------> SPI2_MISO | ||||
|     PB15     ------> SPI2_MOSI | ||||
|     PD1     ------> SPI2_SCK | ||||
|     */ | ||||
|     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2); | ||||
|  | ||||
|     HAL_GPIO_DeInit(SPI_D_MOSI_GPIO_Port, SPI_D_MOSI_Pin); | ||||
|  | ||||
|     HAL_GPIO_DeInit(SPI_D_SCK_GPIO_Port, SPI_D_SCK_Pin); | ||||
|  | ||||
|   /* USER CODE BEGIN SPI2_MspDeInit 1 */ | ||||
|  | ||||
|   /* USER CODE END SPI2_MspDeInit 1 */ | ||||
|   } | ||||
| } | ||||
|  | ||||
| /* USER CODE BEGIN 1 */ | ||||
|  | ||||
| void NFC_SPI_Reconfigure() { | ||||
|   osKernelLock(); | ||||
|  | ||||
|   SPI_R.Init.Mode = SPI_MODE_MASTER; | ||||
|   SPI_R.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|   SPI_R.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|   SPI_R.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|   SPI_R.Init.CLKPhase = SPI_PHASE_2EDGE; | ||||
|   SPI_R.Init.NSS = SPI_NSS_SOFT; | ||||
|   SPI_R.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 8mhz, 10mhz is max | ||||
|   SPI_R.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|   SPI_R.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|   SPI_R.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|   SPI_R.Init.CRCPolynomial = 7; | ||||
|   SPI_R.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|   SPI_R.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; | ||||
|  | ||||
|   if (HAL_SPI_Init(&SPI_R) != HAL_OK) { | ||||
|       Error_Handler(); | ||||
|   } | ||||
|  | ||||
|   Enable_SPI(&SPI_R); | ||||
|  | ||||
|   osKernelUnlock(); | ||||
| } | ||||
|  | ||||
| void SD_SPI_Reconfigure_Slow(void) { | ||||
|   osKernelLock(); | ||||
|  | ||||
|   SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; | ||||
|   SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|   SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|   SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|   SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; | ||||
|   SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; | ||||
|   SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; | ||||
|   SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|   SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|   SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|   SPI_SD_HANDLE.Init.CRCPolynomial = 7; | ||||
|   SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|   SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; | ||||
|  | ||||
|   if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { | ||||
|       Error_Handler(); | ||||
|   } | ||||
|  | ||||
|   Enable_SPI(&SPI_SD_HANDLE); | ||||
|  | ||||
|   osKernelUnlock(); | ||||
| } | ||||
|  | ||||
| void SD_SPI_Reconfigure_Fast(void) { | ||||
|   osKernelLock(); | ||||
|  | ||||
|   SPI_SD_HANDLE.Init.Mode = SPI_MODE_MASTER; | ||||
|   SPI_SD_HANDLE.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|   SPI_SD_HANDLE.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|   SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|   SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE; | ||||
|   SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT; | ||||
|   SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; | ||||
|   SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|   SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|   SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|   SPI_SD_HANDLE.Init.CRCPolynomial = 7; | ||||
|   SPI_SD_HANDLE.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|   SPI_SD_HANDLE.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; | ||||
|  | ||||
|   if(HAL_SPI_Init(&SPI_SD_HANDLE) != HAL_OK) { | ||||
|       Error_Handler(); | ||||
|   } | ||||
|  | ||||
|   Enable_SPI(&SPI_SD_HANDLE); | ||||
|  | ||||
|   osKernelUnlock(); | ||||
| } | ||||
|  | ||||
| void CC1101_SPI_Reconfigure(void) { | ||||
|   osKernelLock(); | ||||
|  | ||||
|   SPI_R.Init.Mode = SPI_MODE_MASTER; | ||||
|   SPI_R.Init.Direction = SPI_DIRECTION_2LINES; | ||||
|   SPI_R.Init.DataSize = SPI_DATASIZE_8BIT; | ||||
|   SPI_R.Init.CLKPolarity = SPI_POLARITY_LOW; | ||||
|   SPI_R.Init.CLKPhase = SPI_PHASE_1EDGE; | ||||
|   SPI_R.Init.NSS = SPI_NSS_SOFT; | ||||
|   SPI_R.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; | ||||
|   SPI_R.Init.FirstBit = SPI_FIRSTBIT_MSB; | ||||
|   SPI_R.Init.TIMode = SPI_TIMODE_DISABLE; | ||||
|   SPI_R.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; | ||||
|   SPI_R.Init.CRCPolynomial = 7; | ||||
|   SPI_R.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; | ||||
|   SPI_R.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; | ||||
|  | ||||
|   if(HAL_SPI_Init(&SPI_R) != HAL_OK) { | ||||
|       Error_Handler(); | ||||
|   } | ||||
|  | ||||
|   Enable_SPI(&SPI_R); | ||||
|  | ||||
|   osKernelUnlock(); | ||||
| } | ||||
|  | ||||
| void Enable_SPI(SPI_HandleTypeDef* spi_instance){ | ||||
|   if((spi_instance->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) { | ||||
|     __HAL_SPI_ENABLE(spi_instance); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void SD_SPI_Bus_To_Down_State(){ | ||||
|   GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; | ||||
|  | ||||
|   GPIO_InitStruct.Pin = GPIO_PIN_2; | ||||
|   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|   GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); | ||||
|  | ||||
|   GPIO_InitStruct.Pin = SPI_D_MOSI_Pin; | ||||
|   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|   GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|   HAL_GPIO_Init(SPI_D_MOSI_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|   GPIO_InitStruct.Pin = SPI_D_SCK_Pin; | ||||
|   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; | ||||
|   GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|   HAL_GPIO_Init(SPI_D_SCK_GPIO_Port, &GPIO_InitStruct); | ||||
|  | ||||
|   HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_RESET); | ||||
|   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET); | ||||
|   HAL_GPIO_WritePin(SPI_D_MOSI_GPIO_Port, SPI_D_MOSI_Pin, GPIO_PIN_RESET); | ||||
|   HAL_GPIO_WritePin(SPI_D_SCK_GPIO_Port, SPI_D_SCK_Pin, GPIO_PIN_RESET); | ||||
| } | ||||
|  | ||||
| void SD_SPI_Bus_To_Normal_State(){ | ||||
|   HAL_GPIO_WritePin(SD_CS_GPIO_Port, SD_CS_Pin, GPIO_PIN_SET); | ||||
|   HAL_SPI_MspInit(&SPI_SD_HANDLE); | ||||
| } | ||||
| /* USER CODE END 1 */ | ||||
|  | ||||
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | ||||
| @@ -4,7 +4,6 @@ | ||||
| #include "task.h" | ||||
|  | ||||
| extern PCD_HandleTypeDef hpcd_USB_FS; | ||||
| extern ADC_HandleTypeDef hadc1; | ||||
| extern COMP_HandleTypeDef hcomp1; | ||||
| extern RTC_HandleTypeDef hrtc; | ||||
| extern TIM_HandleTypeDef htim1; | ||||
| @@ -20,10 +19,6 @@ void SysTick_Handler(void) { | ||||
|     HAL_IncTick(); | ||||
| } | ||||
|  | ||||
| void ADC1_IRQHandler(void) { | ||||
|     HAL_ADC_IRQHandler(&hadc1); | ||||
| } | ||||
|  | ||||
| void USB_LP_IRQHandler(void) { | ||||
|     HAL_PCD_IRQHandler(&hpcd_USB_FS); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user