Explorar el Código

SPI & DMA work fine.

Vladimir N. Shilov hace 4 años
padre
commit
7acf15dafd
Se han modificado 3 ficheros con 22 adiciones y 97 borrados
  1. 1 2
      Inc/main.h
  2. 11 82
      Src/main.c
  3. 10 13
      Src/stm32g0xx_it.c

+ 1 - 2
Inc/main.h

@@ -94,7 +94,6 @@ typedef enum {
 
 /* Exported functions prototypes ---------------------------------------------*/
 void Error_Handler(void);
-void SPI1_Tx_Callback(void);
 
 /* USER CODE BEGIN EFP */
 
@@ -133,7 +132,7 @@ 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 {
+static volatile struct {
   uint32_t RTC_IRQ:     1;
   uint32_t SPI_TX_End:  1;
   uint32_t I2C_TX_End:  1;

+ 11 - 82
Src/main.c

@@ -86,7 +86,6 @@ static void MX_TIM17_Init(void);
 /* USER CODE BEGIN PFP */
 static void showDigit(tube_pos_t pos, uint8_t dig);
 static void SPI_StartTX(void);
-//static void SPI_Send(void);
 /* USER CODE END PFP */
 
 /* Private user code ---------------------------------------------------------*/
@@ -141,6 +140,7 @@ int main(void)
   MX_TIM16_Init();
   MX_TIM17_Init();
   /* USER CODE BEGIN 2 */
+  __enable_irq();
   //LL_Init1msTick(rcc_clocks.HCLK_Frequency);
   //LL_mDelay(1);
 
@@ -167,25 +167,20 @@ int main(void)
 
 #ifdef USE_LL_DRV
   /* Set DMA transfer addresses of source and destination */
-  //LL_DMA_ConfigAddresses(DMA1,
-  //                       LL_DMA_CHANNEL_1,
-  //                       (uint32_t)&tubesBuffer,
-  //                       (uint32_t)&(SPI1->DR),
-  //                       LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
+  LL_DMA_ConfigAddresses(DMA1,
+                         LL_DMA_CHANNEL_1,
+                         (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);
+  LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, SPI_BUFFER_SIZE);
 #endif // USE_LL_DRV
 
-  showDigit(Tube_A, 0xf);
-  showDigit(Tube_B, 0xf);
-  showDigit(Tube_D, 0xf);
-  showDigit(Tube_E, 0xf);
+  /* Start SPI transfer */
+  SPI1->CR2 |= SPI_CR2_TXDMAEN;
+  SPI1->CR1 |= SPI_CR1_SPE;
 
-  SPI_StartTX();
 
-//  COLOR_R(0);
-//  COLOR_G(0);
-//  COLOR_B(0);
   IN15_OFF;
   /* USER CODE END 2 */
 
@@ -195,7 +190,6 @@ int main(void)
   {
     IN15_Plus;
     COLOR_RGB(0, 0, 0);
-//    SPI_Send();
     LL_mDelay(500);
 
     showDigit(Tube_A, 1);
@@ -206,16 +200,10 @@ int main(void)
 
     IN15_OFF;
     COLOR_RGB(0xFF, 0x12, 0x0); // FF7E00 or FFBF00
-//    SPI_Send();
     LL_mDelay(500);
     /* USER CODE END WHILE */
 
     /* USER CODE BEGIN 3 */
-    //LATCH_DOWN;
-    //LL_SPI_EnableIT_TXE(SPI1);
-    //LL_SPI_Enable(SPI1);
-    //LL_mDelay(1);
-
     showDigit(Tube_A, 5);
     showDigit(Tube_B, 6);
     showDigit(Tube_D, 7);
@@ -229,66 +217,10 @@ int main(void)
 
 
 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;
-
-  SPI1->CR1 |= SPI_CR1_SPE;
-  LATCH_DOWN;
-
-  for (i=0; i<SPI_BUFFER_SIZE; i++) {
-    // Wait for TXE 'transmit buffer empty' bit to be set.
-    while ( !( SPI1->SR & SPI_SR_TXE ) ); // == 0
-    // Send the byte.
-    *( uint8_t* )&(SPI1->DR) = tubesBuffer[i];
-  }
-
-  while ((SPI1->SR & SPI_SR_FTLVL) != 0);
-  while ((SPI1->SR & SPI_SR_BSY) != 0);
-  SPI1->CR1 &= ~SPI_CR1_SPE;
-  LATCH_UP;
+  LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
 }
 
 
-/**
-  * @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, tubesBuffer[idx]);
-#if defined (__GNUC__)
-  __IO uint8_t *spidr = ((__IO uint8_t *)&SPI1->DR);
-  *spidr = tubesBuffer[idx];
-#else
-  *((__IO uint8_t *)&SPI1->DR) = TxData;
-#endif /* __GNUC__ */
-
-  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_SPI_Disable(SPI1);
-    LATCH_UP;
-  }
-
-}
-
 /**
   * @brief System Clock Configuration
   * @retval None
@@ -497,9 +429,6 @@ static void MX_SPI1_Init(void)
   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;

+ 10 - 13
Src/stm32g0xx_it.c

@@ -183,12 +183,17 @@ void DMA1_Channel1_IRQHandler(void)
 {
   /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
   if (LL_DMA_IsActiveFlag_TC1(DMA1) != 0) {
+    DMA1->IFCR |= DMA_IFCR_CTCIF1; // reset IRQ flag
+
     Flag.SPI_TX_End = 1;
-    //LATCH_DOWN;
+
     /* Stop SPI-DMA transfer */
-//    LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_1);
-    SPI1->CR1 &= ~(SPI_CR1_SPE);
-    SPI1->CR2 &= ~(SPI_CR2_TXDMAEN);
+    LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_1);
+
+    /* Wait for end SPI transmit */
+    LATCH_DOWN;
+    while ((SPI1->SR & SPI_SR_FTLVL) != 0) {};
+    while ((SPI1->SR & SPI_SR_BSY) != 0) {};
     LATCH_UP;
   }
   /* USER CODE END DMA1_Channel1_IRQn 0 */
@@ -257,15 +262,7 @@ void TIM17_IRQHandler(void)
 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; */
-  /* 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 */