Vladimir N. Shilov 3 роки тому
батько
коміт
e6cd4352ed
3 змінених файлів з 20 додано та 32 видалено
  1. 4 12
      Src/ds3231.c
  2. 8 18
      Src/main.c
  3. 8 2
      Src/stm32g0xx_it.c

+ 4 - 12
Src/ds3231.c

@@ -16,7 +16,7 @@ void RTC_Init(void) {
   /* Destination: I2C TX data register. */
   DMA1_Channel3->CPAR = (uint32_t)&(I2C1->TXDR);
   /* Set DMA data transfer length (I2C TX buffer length). */
-  DMA1_Channel3->CNDTR = RTC_TX_BUF_SIZE;
+  DMA1_Channel3->CNDTR = 3; // hardcode / magic number
   /* Enable DMA channels for I2C */
   DMA1_Channel3->CCR |= DMA_CCR_EN;
 
@@ -27,11 +27,7 @@ void RTC_Init(void) {
 
   /* Wait for I2C */
   while ( I2C1->ISR & I2C_ISR_BUSY ) {};
-/*
-  LL_I2C_SetSlaveAddr(I2C1, DS3231_I2C_ADDR);
-  LL_I2C_SetTransferRequest(I2C1, LL_I2C_REQUEST_WRITE);
-  LL_I2C_SetTransferSize(I2C1, 3); // controll addr + 2 bytes of data
-*/
+
   /* Set the device address and number bytes to send. */
   I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
   I2C1->CR2 |= ( DS3231_I2C_ADDR | 3 << I2C_CR2_NBYTES_Pos );
@@ -71,18 +67,13 @@ void RTC_ReadAll(rtc_t * data) {
   I2C1->TXDR = DS3231_ADDR_TIME;
 
   while ( I2C1->ISR & I2C_ISR_BUSY ) {};
+
   /* Reading all */
-/*
-  LL_I2C_SetSlaveAddr(I2C1, DS3231_I2C_ADDR);
-  LL_I2C_SetTransferRequest(I2C1, LL_I2C_REQUEST_READ);
-  LL_I2C_SetTransferSize(I2C1, DS3231_SIZE_ALL);
-*/
   I2C1->CR2 &= ~( I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RD_WRN);
   I2C1->CR2 |= ( DS3231_I2C_ADDR | DS3231_SIZE_ALL << I2C_CR2_NBYTES_Pos | I2C_CR2_RD_WRN);
 
   I2C1->CR1 |= ( I2C_CR1_RXDMAEN );
   I2C1->CR2 |= ( I2C_CR2_START );
-
 }
 
 /**
@@ -91,6 +82,7 @@ void RTC_ReadAll(rtc_t * data) {
 void RTC_WriteTimeCalendar(rtc_t * data) {
   Flag.I2C_TX_End = 0;
 
+  DMA1_Channel3->CCR &= ~DMA_CCR_EN;
   DMA1_Channel3->CMAR = (uint32_t)data;
   DMA1_Channel3->CPAR = (uint32_t)&(I2C1->TXDR);
   DMA1_Channel3->CNDTR = DS3231_SIZE_TIME + DS3231_SIZE_CALENDAR;

+ 8 - 18
Src/main.c

@@ -171,15 +171,17 @@ int main(void)
   SPI1->CR2 |= SPI_CR2_TXDMAEN;
   SPI1->CR1 |= SPI_CR1_SPE;
 
-  /* USER CODE END 2 */
-
-  /* USER CODE BEGIN WHILE */
   SPI_StartTX();
 
   IN15_OFF;
-  IN15_P;
+
+  RTC_Init();
+  while (Flag.I2C_TX_End == 0) { __NOP(); };
+  /* USER CODE END 2 */
+
+  /* USER CODE BEGIN WHILE */
   RTC_ReadAll(&Clock);
-  while (Flag.I2C_RX_End == 0) {};
+  while (Flag.I2C_RX_End == 0) { __NOP(); };
 
   /* Infinite loop */
   while (1)
@@ -187,13 +189,7 @@ int main(void)
     IN15_OFF;
     COLOR_RGB(0, 0, 0);
     LL_mDelay(500);
-/*
-    showDigit(Tube_A, 1);
-    showDigit(Tube_B, 2);
-    showDigit(Tube_D, 3);
-    showDigit(Tube_E, 4);
-    SPI_StartTX();
-*/
+
     RTC_ReadAll(&Clock);
 
     if (Flag.RTC_IRQ != 0) {
@@ -205,12 +201,6 @@ int main(void)
     /* USER CODE END WHILE */
 
     /* USER CODE BEGIN 3 */
-/*
-    showDigit(Tube_A, 5);
-    showDigit(Tube_B, 6);
-    showDigit(Tube_D, 7);
-    showDigit(Tube_E, 8);
-*/
     showDigit(Tube_A, Clock.Min >> 4);
     showDigit(Tube_B, Clock.Min & 0xf);
     showDigit(Tube_D, Clock.Sec >> 4);

+ 8 - 2
Src/stm32g0xx_it.c

@@ -210,14 +210,20 @@ void DMA1_Channel2_3_IRQHandler(void)
 {
   /* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */
   if (LL_DMA_IsActiveFlag_TC2(DMA1) != 0) {
-    DMA1->IFCR |= DMA_IFCR_CTCIF2; // reset IRQ flag
+    /* reset IRQ flag */
+    DMA1->IFCR |= DMA_IFCR_CTCIF2;
+    /* Disable DMA channels for I2C RX */
+    DMA1_Channel2->CCR &= ~DMA_CCR_EN;
     Flag.I2C_RX_End = 1;
   }
   /* USER CODE END DMA1_Channel2_3_IRQn 0 */
 
   /* USER CODE BEGIN DMA1_Channel2_3_IRQn 1 */
   if (LL_DMA_IsActiveFlag_TC3(DMA1) != 0) {
-    DMA1->IFCR |= DMA_IFCR_CTCIF3; // reset IRQ flag
+    /* reset IRQ flag */
+    DMA1->IFCR |= DMA_IFCR_CTCIF3;
+    /* Disable DMA channels for I2C TX */
+    DMA1_Channel3->CCR &= ~DMA_CCR_EN;
     Flag.I2C_TX_End = 1;
   }
   /* USER CODE END DMA1_Channel2_3_IRQn 1 */