Browse Source

Send SPI bytes with DMA.

Vladimir N. Shilov 3 years ago
parent
commit
b2a092275c
3 changed files with 60 additions and 26 deletions
  1. 7 0
      Inc/main.h
  2. 47 24
      Src/main.c
  3. 6 2
      Src/stm32g0xx_it.c

+ 7 - 0
Inc/main.h

@@ -133,6 +133,13 @@ void SPI1_Tx_Callback(void);
 #define IRQ_GPIO_Port GPIOB
 #define IRQ_EXTI_IRQn EXTI4_15_IRQn
 /* USER CODE BEGIN Private defines */
+__IO static volatile struct {
+  uint32_t RTC_IRQ:     1;
+  uint32_t SPI_TX_End:  1;
+  uint32_t I2C_TX_End:  1;
+  uint32_t I2C_RX_End:  1;
+  uint32_t _reserv:    28;
+} Flag;
 
 /* USER CODE END Private defines */
 

+ 47 - 24
Src/main.c

@@ -85,7 +85,8 @@ static void MX_TIM16_Init(void);
 static void MX_TIM17_Init(void);
 /* USER CODE BEGIN PFP */
 static void showDigit(tube_pos_t pos, uint8_t dig);
-static void SPI_Send(void);
+static void SPI_StartTX(void);
+//static void SPI_Send(void);
 /* USER CODE END PFP */
 
 /* Private user code ---------------------------------------------------------*/
@@ -156,36 +157,31 @@ int main(void)
   /* Enable tube power */
   TUBE_PWR_ON;
 
-  // manual dma start sample
+  /* Set DMA source and destination addresses. */
+  /* Source: Address of the framebuffer. */
+  DMA1_Channel1->CMAR  = (uint32_t)&tubesBuffer;
+  /* Destination: SPI1 data register. */
+  DMA1_Channel1->CPAR  = (uint32_t)&( SPI1->DR );
+  /* Set DMA data transfer length (framebuffer length). */
+  DMA1_Channel1->CNDTR = SPI_BUFFER_SIZE;
+
+#ifdef USE_LL_DRV
   /* Set DMA transfer addresses of source and destination */
   //LL_DMA_ConfigAddresses(DMA1,
   //                       LL_DMA_CHANNEL_1,
-  //                       (uint32_t)&nixieTubes,
+  //                       (uint32_t)&tubesBuffer,
   //                       (uint32_t)&(SPI1->DR),
   //                       LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
-
   /* Set DMA transfer size */
   //LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, SPI_BUFFER_SIZE);
+#endif // USE_LL_DRV
 
-  /* Enable DMA transfer complete/error interrupts */
-  //LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_1);
-  //LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_1);
+  showDigit(Tube_A, 0xf);
+  showDigit(Tube_B, 0xf);
+  showDigit(Tube_D, 0xf);
+  showDigit(Tube_E, 0xf);
 
-  showDigit(Tube_A, 0);
-  showDigit(Tube_B, 0);
-  showDigit(Tube_D, 0);
-  showDigit(Tube_E, 4);
-
-  /* Start the DMA transfer from Memory to SPI1 */
-  //LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
-  /* Enable SPI Interrupts */
-  //LL_SPI_EnableIT_ERR(SPI1);
-  //LL_SPI_EnableIT_TXE(SPI1);
-  //LL_SPI_EnableIT_RXNE(SPI1);
-  //LL_SPI_EnableDMAReq_TX(SPI1);
-  /* Start SPI transfer */
-  //LATCH_DOWN;
-  //LL_SPI_Enable(SPI1);
+  SPI_StartTX();
 
 //  COLOR_R(0);
 //  COLOR_G(0);
@@ -199,12 +195,18 @@ int main(void)
   {
     IN15_Plus;
     COLOR_RGB(0, 0, 0);
-    SPI_Send();
+//    SPI_Send();
     LL_mDelay(500);
 
+    showDigit(Tube_A, 1);
+    showDigit(Tube_B, 2);
+    showDigit(Tube_D, 3);
+    showDigit(Tube_E, 4);
+    SPI_StartTX();
+
     IN15_OFF;
     COLOR_RGB(0xFF, 0x12, 0x0); // FF7E00 or FFBF00
-    SPI_Send();
+//    SPI_Send();
     LL_mDelay(500);
     /* USER CODE END WHILE */
 
@@ -214,12 +216,26 @@ int main(void)
     //LL_SPI_Enable(SPI1);
     //LL_mDelay(1);
 
+    showDigit(Tube_A, 5);
+    showDigit(Tube_B, 6);
+    showDigit(Tube_D, 7);
+    showDigit(Tube_E, 8);
+    SPI_StartTX();
+
     //__WFI();
   }
   /* USER CODE END 3 */
 }
 
 
+static void SPI_StartTX(void) {
+  LATCH_DOWN;
+
+  /* Start SPI transfer */
+  SPI1->CR2 |= SPI_CR2_TXDMAEN;
+  SPI1->CR1 |= SPI_CR1_SPE;
+}
+
 static void SPI_Send(void) {
   int i;
 
@@ -477,6 +493,13 @@ static void MX_SPI1_Init(void)
 
   /* 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);
+
+  /* Start the DMA transfer from Memory to SPI1 */
+  LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
+
   /* USER CODE END SPI1_Init 1 */
   /* SPI1 parameter configuration*/
   SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;

+ 6 - 2
Src/stm32g0xx_it.c

@@ -167,6 +167,7 @@ void EXTI4_15_IRQHandler(void)
     LL_EXTI_ClearRisingFlag_0_31(LL_EXTI_LINE_8);
     /* USER CODE BEGIN LL_EXTI_LINE_8_RISING */
     //EXTI->RPR1 = 1<<8;
+    Flag.RTC_IRQ = 1;
 
     /* USER CODE END LL_EXTI_LINE_8_RISING */
   }
@@ -182,10 +183,13 @@ void DMA1_Channel1_IRQHandler(void)
 {
   /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
   if (LL_DMA_IsActiveFlag_TC1(DMA1) != 0) {
+    Flag.SPI_TX_End = 1;
+    //LATCH_DOWN;
     /* Stop SPI-DMA transfer */
 //    LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_1);
-    LL_SPI_DisableDMAReq_TX(SPI1);
-//    LL_SPI_Disable(SPI1);
+    SPI1->CR1 &= ~(SPI_CR1_SPE);
+    SPI1->CR2 &= ~(SPI_CR2_TXDMAEN);
+    LATCH_UP;
   }
   /* USER CODE END DMA1_Channel1_IRQn 0 */