Browse Source

Transfer SPI1 Init to board module.

Vladimir N. Shilov 3 years ago
parent
commit
01312da3fc
2 changed files with 50 additions and 106 deletions
  1. 43 0
      Src/board.c
  2. 7 106
      Src/main.c

+ 43 - 0
Src/board.c

@@ -6,6 +6,7 @@
 #include "stm32g0xx_ll_dma.h"
 #include "stm32g0xx_ll_dmamux.h"
 #include "stm32g0xx_ll_i2c.h"
+#include "stm32g0xx_ll_spi.h"
 
 /* private variables */
 
@@ -13,6 +14,7 @@
 static void GPIO_Init(void);
 static void DMA_Init(void);
 static void I2C1_Init(void);
+static void SPI1_Init(void);
 static void TIM1_Init(void);
 static void TIM3_Init(void);
 static void TIM14_Init(void);
@@ -43,6 +45,7 @@ void Board_Init(void)
   GPIO_Init();
   DMA_Init();
   I2C1_Init();
+  SPI1_Init();
 
   /* Start RGB & Tube Power PWM */
   TIM1_Init();
@@ -230,6 +233,46 @@ static void I2C1_Init(void)
   I2C1->CR1 = I2C_CR1_PE;
 }
 
+/**
+  * @brief SPI1 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void SPI1_Init(void)
+{
+  /* Peripheral clock enable */
+  RCC->APBENR2 |= RCC_APBENR2_SPI1EN;
+  RCC->IOPENR |= RCC_IOPENR_GPIOBEN;
+
+  /**SPI1 GPIO Configuration
+  PB3   ------> SPI1_SCK
+  PB5   ------> SPI1_MOSI
+  */
+  GPIO_SetPinMode(GPIOB, GPIO_PIN_3, GPIO_MODE_AFF);
+  GPIO_SetPinOutputType(GPIOB, GPIO_PIN_3, GPIO_OTYPE_OD);
+  GPIO_SetPinSpeed(GPIOB, GPIO_PIN_3, GPIO_OSPEED_HI);
+
+  GPIO_SetPinMode(GPIOB, GPIO_PIN_5, GPIO_MODE_AFF);
+  GPIO_SetPinOutputType(GPIOB, GPIO_PIN_5, GPIO_OTYPE_OD);
+  GPIO_SetPinSpeed(GPIOB, GPIO_PIN_5, GPIO_OSPEED_HI);
+
+  /* SPI1 DMA Init */
+
+  /* SPI1_TX Init: Priority high, Memory increment, read from memory, circular mode,
+     Enable DMA transfer complete/error interrupts */
+  DMA1_Channel1->CCR = (DMA_CCR_PL_1 | DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_TEIE | DMA_CCR_TCIE);
+  /* Route DMA channel 1 to SPI1 TX */
+  DMAMUX1_Channel1->CCR = 0x11;
+
+  /* SPI1 interrupt Init */
+  NVIC_SetPriority(SPI1_IRQn, 0);
+  NVIC_EnableIRQ(SPI1_IRQn);
+
+  /* SPI1 parameter configuration: master mode, data 8 bit, divider = 16, TX DMA */
+  SPI1->CR1 = (SPI_CR1_MSTR | SPI_CR1_BR_1 | SPI_CR1_BR_0);
+  SPI1->CR2 = (SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0 | SPI_CR2_TXDMAEN);
+}
+
 /**
   * @brief TIM1 Initialization Function
   * @param None

+ 7 - 106
Src/main.c

@@ -90,7 +90,6 @@ static volatile uint8_t dispWDT = 0;
 /* USER CODE END PV */
 
 /* Private function prototypes -----------------------------------------------*/
-static void MX_SPI1_Init(void);
 /* USER CODE BEGIN PFP */
 static void showDigits(uint8_t * dig);
 static void sensor_Init(void);
@@ -114,22 +113,19 @@ int main(void)
   /* Initialize onBoard Hardware */
   Board_Init();
 
-  /* Initialize all configured peripherals */
-  MX_SPI1_Init();
-  /* USER CODE BEGIN 2 */
   /* Initialize Scheduler */
   RTOS_Init();
+  /* tdelay_ms() work now, I2C can work too */
+  RTC_Init();
+  RTC_ReadAll(&Clock);
+  sensor_Init();
 
   /* Initialize Event State Machine */
   ES_Init(stShowTime);
+  es_event_t event = eventNull;
 
   /* Enable tube power */
   TUBE_PWR_ON;
-
-  RTC_Init();
-
-  sensor_Init();
-
   /** Star SPI transfer to shift registers */
   /* Set DMA source and destination addresses. */
   /* Source: Address of the SPI buffer. */
@@ -138,20 +134,15 @@ int main(void)
   DMA1_Channel1->CPAR = (uint32_t)&(SPI1->DR);
   /* Set DMA data transfer length (SPI buffer length). */
   DMA1_Channel1->CNDTR = SPI_BUFFER_SIZE;
-  /* Enable SPI+DMA transfer */
-  SPI1->CR2 |= SPI_CR2_TXDMAEN;
+  /* Enable SPI transfer */
   SPI1->CR1 |= SPI_CR1_SPE;
   Flag.SPI_TX_End = 1;
+  /* display work now */
 
   /** Set tasks for Sheduler */
   RTOS_SetTask(btnProcess, 1, BTN_SCAN_PERIOD);
 
-  /* USER CODE END 2 */
-
   /* USER CODE BEGIN WHILE */
-  RTC_ReadAll(&Clock);
-
-  es_event_t event = eventNull;
   Color_RGB(0xFF, 0x12, 0x0); // Nixie color. FF1200 or FF7E00 or FFBF00
   showTime();
 
@@ -241,96 +232,6 @@ static void sensorGetData(void) {
   Pressure.s16.u8L = (uint8_t)(tmp % 100);
 }
 
-/**
-  * @brief SPI1 Initialization Function
-  * @param None
-  * @retval None
-  */
-static void MX_SPI1_Init(void)
-{
-
-  /* USER CODE BEGIN SPI1_Init 0 */
-
-  /* USER CODE END SPI1_Init 0 */
-
-  LL_SPI_InitTypeDef SPI_InitStruct = {0};
-
-  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
-
-  /* Peripheral clock enable */
-  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);
-
-  LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB);
-  /**SPI1 GPIO Configuration
-  PB3   ------> SPI1_SCK
-  PB5   ------> SPI1_MOSI
-  */
-  GPIO_InitStruct.Pin = LL_GPIO_PIN_3;
-  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
-  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
-  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
-  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
-  GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
-  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-
-  GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
-  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
-  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
-  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
-  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
-  GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
-  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-
-  /* SPI1 DMA Init */
-
-  /* SPI1_TX Init */
-  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_SPI1_TX);
-
-  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
-
-  LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
-
-  LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR);
-
-  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);
-
-  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
-
-  LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_BYTE);
-
-  LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_BYTE);
-
-  /* SPI1 interrupt Init */
-  NVIC_SetPriority(SPI1_IRQn, 0);
-  NVIC_EnableIRQ(SPI1_IRQn);
-
-  /* USER CODE BEGIN SPI1_Init 1 */
-
-  /* Enable DMA transfer complete/error interrupts */
-  LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_1);
-  LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_1);
-
-  /* USER CODE END SPI1_Init 1 */
-  /* SPI1 parameter configuration*/
-  SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
-  SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
-  SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
-  SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
-  SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;
-  SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
-  SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV16;
-  SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
-  SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
-  SPI_InitStruct.CRCPoly = 7;
-  LL_SPI_Init(SPI1, &SPI_InitStruct);
-  LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);
-  LL_SPI_DisableNSSPulseMgt(SPI1);
-  /* USER CODE BEGIN SPI1_Init 2 */
-
-  /* USER CODE END SPI1_Init 2 */
-
-}
-
 /* USER CODE BEGIN 4 */
 /*************************
  * S U B R O U T I N E S *