Prechádzať zdrojové kódy

Fix I2C timing. RTC not work.

Vladimir N. Shilov 2 rokov pred
rodič
commit
fca6eadf08
3 zmenil súbory, kde vykonal 48 pridanie a 16 odobranie
  1. 4 1
      src/board.c
  2. 18 4
      src/i2c.c
  3. 26 11
      src/main.c

+ 4 - 1
src/board.c

@@ -158,9 +158,12 @@ static void I2C1_Init(void)
   NVIC_SetPriority(I2C1_IRQn, 0);
   NVIC_EnableIRQ(I2C1_IRQn);
 
+  /* By default, I2C clocked from HSI, for SysClk use this: */
+  //RCC->CFGR3 |= RCC_CFGR3_I2C1SW;
+
   /** I2C Initialization: I2C_Fast */
   I2C1->CR1 = (I2C_CR1_TXDMAEN); //  | I2C_CR1_RXIE | I2C_CR1_ERRIE
-  I2C1->TIMINGR = 0x00701850; // 400 kHz / 48 MHz / 50 ns / 50 ns
+  I2C1->TIMINGR = 0x0010020A; //0x00701850; // 400kHz / 8MHz / 100/100 ns
   I2C1->CR2 = I2C_CR2_AUTOEND;
   I2C1->CR1 |= I2C_CR1_PE;
 }

+ 18 - 4
src/i2c.c

@@ -128,7 +128,7 @@ i2c_status_t user_i2c_read(const uint8_t id, const uint8_t reg_addr, uint8_t *da
  * @brief Write len bytes to I2C bus from data by reg_addr.
  * @retval I2C return code
  */
-i2c_status_t user_i2c_write(const uint8_t id, const uint8_t reg_addr, uint8_t *data, const uint16_t len) {
+i2c_status_t user_i2c_write(const uint8_t id, const uint8_t reg_addr, uint8_t *data, uint16_t len) {
   i2c_status_t r = I2C_Ret_OK;
 
   while ( I2C1->ISR & I2C_ISR_BUSY );
@@ -145,7 +145,7 @@ i2c_status_t user_i2c_write(const uint8_t id, const uint8_t reg_addr, uint8_t *d
   I2C1->CR2 |= ( I2C_CR2_START );
 
   //ENABLE_TIM;
-  while ((I2C1->ISR & (I2C_ISR_ARLO | I2C_ISR_BERR | I2C_ISR_NACKF | I2C_ISR_TXE | I2C_ISR_TIMEOUT)) == 0) {
+  while ((I2C1->ISR & (I2C_ISR_ARLO | I2C_ISR_BERR | I2C_ISR_NACKF | I2C_ISR_TXE)) == 0) {
     //if (TIM_CNT == 0) {
     //  return I2C_Ret_Tout;
     //}
@@ -162,8 +162,22 @@ i2c_status_t user_i2c_write(const uint8_t id, const uint8_t reg_addr, uint8_t *d
     }
   }
 
-  DMA1_Channel2->CCR |= DMA_CCR_EN;
-  I2C1->CR1 |= I2C_CR1_TXDMAEN;
+  while (len) {
+    while ((I2C1->ISR & (I2C_ISR_TC | I2C_ISR_BUSY | I2C_ISR_NACKF | I2C_ISR_TXE)) == 0) { __NOP(); }
+    if (I2C1->ISR & I2C_ISR_TXE) {
+      I2C1->TXDR = *data;
+      data ++;
+      len --;
+    } else {
+      r = i2c_check_err();
+      if (r != I2C_Ret_OK) {
+        Flag.I2C_TX_Err = 1;
+        return r;
+      }
+    }
+  }
+//  DMA1_Channel2->CCR |= DMA_CCR_EN;
+//  I2C1->CR1 |= I2C_CR1_TXDMAEN;
 
   return r;
 }

+ 26 - 11
src/main.c

@@ -40,26 +40,41 @@ int main(void)
   RTOS_Init();
 
   display_Init();
-
-  buzer_On();
-  tdelay_ms(50);
-  buzer_Off();
-  tdelay_ms(500);
+  display_String("Electronica Alpha-12\0", 1);
 
   /* Real-Time clock */
   i2c_status = RTC_Init();
+  tdelay_ms(500);
+  i2c_status = RTC_Init();
+  tdelay_ms(500);
+  i2c_status = RTC_Init();
   if (i2c_status != I2C_Ret_OK) {
-    buzer_On();
-    tdelay_ms(1000);
-    buzer_Off();
+    bip_Bip();
+    if (i2c_status != I2C_Ret_NACK) {
+      display_String("RTC Init Error: NACK\0", 2);
+    } else if (i2c_status != I2C_Ret_Bsy) {
+      display_String("RTC Init Error: Busy\0", 2);
+    } else if (i2c_status != I2C_Ret_Tout) {
+      display_String("RTC Init Error: Time out\0", 2);
+    } else if (i2c_status != I2C_Ret_Err) {
+      display_String("RTC Init Error: other error\0", 2);
+    }
   }
   i2c_status = RTC_ReadTime(&Clock);
   if (i2c_status != I2C_Ret_OK) {
     bip_Bip();
+    if (i2c_status != I2C_Ret_NACK) {
+      display_String("RTC_ReadTime Error: NACK\0", 2);
+    } else if (i2c_status != I2C_Ret_Bsy) {
+      display_String("RTC_ReadTime Error: Busy\0", 2);
+    } else if (i2c_status != I2C_Ret_Tout) {
+      display_String("RTC_ReadTime Error: Time out\0", 2);
+    } else if (i2c_status != I2C_Ret_Err) {
+      display_String("RTC_ReadTime Error: other error\0", 2);
+    }
   }
 
-  display_Init();
-  display_String("0123456789ABCDEF\0", 1);
+/*
   tdelay_ms(2000);
   display_String("For Time setting press 'SET' button long...\0", 2);
   bip_Bip();
@@ -68,7 +83,7 @@ int main(void)
   tdelay_ms(675);
   bip_Bip();
   tdelay_ms(1000);
-
+*/
   Show_MMSS();
 
   /* Infinite loop */