Prechádzať zdrojové kódy

1. change delay_us when enable delay ticks, use delay ticks
2. i2c error reinit

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 4 rokov pred
rodič
commit
60f5b3ca38

+ 11 - 1
Application/bsp/AT24CXX.c

@@ -1,5 +1,6 @@
 #include "i2c.h"
 #include "AT24CXX.h"
+#include "clock.h"
 
 void AT24CXX_Init(void)
 {
@@ -45,6 +46,11 @@ int AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
 		if (try_count-- <= 0){
 			return -1;
 		}
+		if ((try_count % 20) == 0) {
+			AT24CXX_DeInit();
+			task_udelay(1000);
+			AT24CXX_Init();
+		}
 	};
 	return NumToRead;
 }  
@@ -57,7 +63,11 @@ static int AT24CXX_Write_Pages(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumT
 		if (try_count-- <= 0){
 			return -1;
 		}
-
+		if ((try_count % 20) == 0) {
+			AT24CXX_DeInit();
+			task_udelay(1000);
+			AT24CXX_Init();
+		}
 	};
 	return 0;
 }

+ 42 - 0
Application/bsp/clock.c

@@ -2,11 +2,53 @@
 #include "gd32f3x0.h"
 
 extern uint32_t SystemCoreClock;
+static u8 delay_ticks_enable = 0;
 void delay_us(uint32_t us){
+	if (delay_ticks_enable) {
+		task_udelay(us);
+		return;
+	}
 	uint32_t insr_num = (SystemCoreClock /1000000) * us * 4;// 1000000;
 	while(insr_num-->0); //have 4 instr
 }
 
+void task_ticks_enable(void)
+{
+	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
+	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
+	delay_ticks_enable = 1;
+}
+
+u32 task_ticks_abs(void)
+{
+	return DWT->CYCCNT;
+}
+
+u32 task_ticks_rel(u32 start)
+{
+	u32 ticks = DWT->CYCCNT;
+
+	if (ticks >= start) {
+		return ticks - start;
+	}
+
+	return 0xFFFFFFFF - start + ticks + 1;
+}
+
+void task_ticks_delay(u32 ticks)
+{
+	u32 start;
+
+	start = task_ticks_abs();
+	while (task_ticks_rel(start) < ticks);
+}
+
+void task_udelay(u32 delay)
+{
+	task_ticks_delay(delay * (SystemCoreClock / 1000000));
+}
+
+
 uint32_t get_sys_clock(void){
 	return SystemCoreClock;
 }

+ 4 - 2
Application/bsp/clock.h

@@ -1,7 +1,9 @@
 #ifndef _CLOCK_H__
 #define _CLOCK_H__
-#include <stdint.h>
-void delay_us(uint32_t us);
+#include "libs/shark_types.h"
+void delay_us(u32 us);
+void task_ticks_enable(void);
+void task_udelay(u32 delay); /* 精确延时, 必须在bsp_init后才能使用 */
 uint32_t get_sys_clock(void);
 uint32_t get_ahb_clock(void);
 uint32_t get_apb1_clock(void);

+ 0 - 36
Application/libs/shark_task.c

@@ -32,42 +32,6 @@ u32 shark_get_seconds(void){
 	return shark_mseconds/1000 + get_system_sleep_time();
 }
 
-void task_ticks_enable(void)
-{
-	CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
-	DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
-}
-
-u32 task_ticks_abs(void)
-{
-	return DWT->CYCCNT;
-}
-
-u32 task_ticks_rel(u32 start)
-{
-	u32 ticks = DWT->CYCCNT;
-
-	if (ticks >= start) {
-		return ticks - start;
-	}
-
-	return 0xFFFFFFFF - start + ticks + 1;
-}
-
-void task_ticks_delay(u32 ticks)
-{
-	u32 start;
-
-	start = task_ticks_abs();
-	while (task_ticks_rel(start) < ticks);
-}
-
-void task_udelay(u32 delay)
-{
-	task_ticks_delay(delay * (SystemCoreClock / 1000000));
-}
-
-
 static inline void shark_timer_sync(void)
 {
 	shark_task_head.time = shark_timer_head.next->time;

+ 1 - 2
Application/libs/shark_task.h

@@ -21,7 +21,6 @@ void shark_timer_post(shark_timer_t *timer, u32 delay);
 void shark_timer_cancel(shark_timer_t *timer);
 void shark_task_add(shark_task_t *task);
 void shark_task_run(void);
-void task_ticks_enable(void);
-void task_udelay(u32 delay); /* 精确延时, 必须在bsp_init后才能使用 */
+