Pārlūkot izejas kodu

Test SPI transfer by interrupt.

Vladimir N. Shilov 4 gadi atpakaļ
vecāks
revīzija
a5e88ef357
3 mainītis faili ar 42 papildinājumiem un 31 dzēšanām
  1. 1 0
      Inc/main.h
  2. 34 30
      Src/main.c
  3. 7 1
      Src/stm32g0xx_it.c

+ 1 - 0
Inc/main.h

@@ -94,6 +94,7 @@ typedef enum {
 
 /* Exported functions prototypes ---------------------------------------------*/
 void Error_Handler(void);
+void SPI1_Tx_Callback(void);
 
 /* USER CODE BEGIN EFP */
 

+ 34 - 30
Src/main.c

@@ -171,26 +171,14 @@ int main(void)
 
   /* Start the DMA transfer from Memory to SPI1 */
   //LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
-  /* Start SPI */
-  //LL_SPI_EnableIT_ERR(SPI1);
+  /* Enable SPI Interrupts */
+  LL_SPI_EnableIT_ERR(SPI1);
+  LL_SPI_EnableIT_TXE(SPI1);
   //LL_SPI_EnableIT_RXNE(SPI1);
   //LL_SPI_EnableDMAReq_TX(SPI1);
-  LL_SPI_Enable(SPI1);
-
+  /* Start SPI transfer */
   LATCH_DOWN;
-  while ((SPI1->SR & SPI_SR_TXE) == 0);
-  SPI1->DR = nixieTubes[0];
-  while ((SPI1->SR & SPI_SR_TXE) == 0);
-  SPI1->DR = nixieTubes[1];
-  while ((SPI1->SR & SPI_SR_TXE) == 0);
-  SPI1->DR = nixieTubes[2];
-  while ((SPI1->SR & SPI_SR_TXE) == 0);
-  SPI1->DR = nixieTubes[3];
-  while ((SPI1->SR & SPI_SR_TXE) == 0);
-  SPI1->DR = nixieTubes[4];
-  while ((SPI1->SR & SPI_SR_FTLVL) != 0);
-  while ((SPI1->SR & SPI_SR_BSY) != 0);
-  LATCH_UP;
+  LL_SPI_Enable(SPI1);
 
 //  COLOR_R(0);
 //  COLOR_G(0);
@@ -224,23 +212,39 @@ int main(void)
 
     /* USER CODE BEGIN 3 */
     LATCH_DOWN;
-    while ((SPI1->SR & SPI_SR_TXE) == 0);
-    SPI1->DR = nixieTubes[0];
-    while ((SPI1->SR & SPI_SR_TXE) == 0);
-    SPI1->DR = nixieTubes[1];
-    while ((SPI1->SR & SPI_SR_TXE) == 0);
-    SPI1->DR = nixieTubes[2];
-    while ((SPI1->SR & SPI_SR_TXE) == 0);
-    SPI1->DR = nixieTubes[3];
-    while ((SPI1->SR & SPI_SR_TXE) == 0);
-    SPI1->DR = nixieTubes[4];
+    LL_SPI_EnableIT_TXE(SPI1);
+    LL_SPI_Enable(SPI1);
+    //LL_mDelay(1);
+
+    //__WFI();
+  }
+  /* USER CODE END 3 */
+}
+
+/**
+  * @brief  Function called from SPI1 IRQ Handler when TXE flag is set
+  *         Function is in charge  to transmit byte on SPI lines.
+  * @param  None
+  * @retval None
+  */
+void  SPI1_Tx_Callback(void)
+{
+  static int idx=0;
+  /* Write character in Data register.
+  TXE flag is cleared by reading data in DR register */
+  LL_SPI_TransmitData8(SPI1, nixieTubes[idx]);
+  idx ++;
+
+  if (idx >= SPI_BUFFER_SIZE) {
+    /* Disable TXE Interrupt */
+    LL_SPI_DisableIT_TXE(SPI1);
+    idx = 0;
     while ((SPI1->SR & SPI_SR_FTLVL) != 0);
     while ((SPI1->SR & SPI_SR_BSY) != 0);
-    LL_mDelay(1);
+    LL_SPI_Disable(SPI1);
     LATCH_UP;
-    //__WFI();
   }
-  /* USER CODE END 3 */
+
 }
 
 /**

+ 7 - 1
Src/stm32g0xx_it.c

@@ -255,7 +255,13 @@ void SPI1_IRQHandler(void)
   /* USER CODE BEGIN SPI1_IRQn 0 */
   /*while ((SPI1->SR & SPI_SR_FTLVL) != 0);
   while ((SPI1->SR & SPI_SR_BSY) != 0);
-  LATCH_UP;/*
+  LATCH_UP; */
+  /* Check RXNE flag value in ISR register */
+  if (LL_SPI_IsActiveFlag_TXE(SPI1))
+  {
+    /* Call function Slave Reception Callback */
+    SPI1_Tx_Callback();
+  }
   /* USER CODE END SPI1_IRQn 0 */
   /* USER CODE BEGIN SPI1_IRQn 1 */