ソースを参照

老8路控制板新程序,解决IIC页写问题。

liyi 1 年間 前
親
コミット
3bf0de3a65

+ 3 - 8
truing_control/PDU-AC_ADA_OLD8/common/common.c

@@ -27,12 +27,12 @@ void read_config_from_eeprom(void)
 	{
 		uint16_t device = 0;
 		board->read_eeprom(EEPROM_DEVICES_ADDR,(uint8_t *)&device,EEPROM_DEVICES_LENTH);
+
 		if(device != board->md_data.r_data.dev_chn)
 		{
 			//default write eeprom
 			board->write_eeprom_page(EEPROM_DEVICES_ADDR,(uint8_t *)&board->md_data.r_data.dev_chn,EEPROM_DEVICES_LENTH);
 			board->write_eeprom_page(EEPROM_STATUS_ADDR,(uint8_t *)&board->relay_staging_staus[0],2*RelaySlaveChaNum);
-			board->feed_dog();
 			for(uint8_t i = 0; i < RelaySlaveChaNum;i++)
 			{
 				board->md_data.rw_data.open.delay_open[i]  	= (1+i) * 1000;
@@ -43,8 +43,6 @@ void read_config_from_eeprom(void)
 			iic_data chache={0};
 			for(uint8_t i = 0 ; i < MAX_ROW;i++){
 				board->write_eeprom_page(EEPROM_CONSUMER_ADDR +(CONSUM_PAGE*i),(uint8_t*)&chache.data[0],CONSUM_PAGE);
-				board->feed_dog();
-				DelayNms(7);
 			}
 		}
 		{
@@ -61,7 +59,6 @@ void read_config_from_eeprom(void)
 					}
 				}
 			}
-			board->feed_dog();
 			board->read_eeprom_page(EEPROM_OTHER_ADDR,(uint8_t *)&board->md_data.rw_data.open.delay_open[0],sizeof(ac_rw_data_t));
 
 			for(uint8_t i = 0 ; i < RelaySlaveChaNum;i++)
@@ -72,7 +69,6 @@ void read_config_from_eeprom(void)
 			iic_data chache={0};
 			for(uint8_t i = 0 ; i < MAX_ROW;i++)
 			{
-				board->feed_dog();
 				board->read_eeprom_page(EEPROM_CONSUMER_ADDR + (CONSUM_PAGE*i),(uint8_t*)&chache,sizeof(iic_data));
 				if(board->con_da.index > chache.iic_con.recode_index1)
 				{
@@ -84,7 +80,6 @@ void read_config_from_eeprom(void)
 				}
 			}	
 			board->read_eeprom_page(EEPROM_CONSUMER_ADDR +(CONSUM_PAGE*(board->con_da.row)),(uint8_t*)&chache,sizeof(iic_data));
-			board->feed_dog();
 			for(uint16_t i = 0 ; i < RelaySlaveChaNum;i++)
 			{
 					board->ele_restore[i] = chache.iic_con.iic_consumer[i];
@@ -101,11 +96,11 @@ void read_config_from_eeprom(void)
 				iic_data chache1={0};
 				board->con_da.index = 0;
 				for(uint8_t i = 0 ; i < MAX_ROW;i++){
-					board->feed_dog();
 					board->write_eeprom_page(EEPROM_CONSUMER_ADDR +(CONSUM_PAGE*i),(uint8_t*)&chache1,CONSUM_PAGE);
 					DelayNms(7);
 				}
 			}
+			//read chn ctrl
 		}
 	}
 }
@@ -124,7 +119,7 @@ void set_relay_sta_async(async_data *data)
 			{
 				w_eeprom_data_t da = {0};
 				da.lenth =2;
-				memcpy(&da.data,&data->status,2);
+				memcpy((void*)&da.data,(void*)&data->status,2);
 				da.start_addr = (EEPROM_STATUS_ADDR+(data->channel*2));
 				board->q_cache.en_queue(&da);
 			}

+ 53 - 20
truing_control/PDU-AC_ADA_OLD8/hardware/eeprom/eeprom.c

@@ -57,8 +57,8 @@ static void         eeprom_write(uint16_t w_addr,uint8_t *data,uint16_t lenth);
 static void         eeprom_read(uint16_t r_addr,uint8_t *data,uint16_t lenth);
 static void 				check_threshold(uint8_t in_out,uint8_t channel);
 
-static void 				eeprom_page_read(uint16_t addr,uint8_t *data,uint16_t lenth);
-static void         eeprom_write_page(uint16_t addr,uint8_t *data,uint16_t chuank);
+static uint8_t 				eeprom_page_read(uint16_t addr,uint8_t *data,uint16_t lenth);
+static uint8_t         eeprom_write_page(uint16_t addr,uint8_t *data,uint16_t chuank);
 static void 				eeprom_auto_page_write(uint16_t addr,uint8_t *data,uint16_t lenth);
 static void 				eeprom_auto_page_read(uint16_t addr,uint8_t *data,uint16_t lenth);
 static inline void iic_set_sda_input()
@@ -83,6 +83,7 @@ void eeprom_init(void)
 	board->check_threshold = check_threshold;
 	board->read_eeprom_page = eeprom_auto_page_read;
 	board->write_eeprom_page = eeprom_auto_page_write;
+	
 }
 
 
@@ -137,6 +138,7 @@ static void iic_stop_signal(void)
 	IIC_SDA_CLR;
 	DelayNus(4);
 	IIC_SCL_SET;
+	DelayNus(4);
 	IIC_SDA_SET;
 	DelayNus(4);
 }
@@ -407,28 +409,32 @@ static void check_threshold(uint8_t in_out,uint8_t channel)
 		}
 	}
 }
-static void eeprom_page_read(uint16_t addr,uint8_t *data,uint16_t lenth)
+static uint8_t eeprom_page_read(uint16_t addr,uint8_t *data,uint16_t lenth)
 {
    if(lenth == 0 || lenth > PAGE_SIZE || ((addr % PAGE_SIZE) + lenth > PAGE_SIZE))
    {
-      return;
+      return 1;
    }
 	iic_start_signal();
 	if(USER_DEFINE_EEPROM_TYPE > AT24C16)
 	{
 		iic_send_byte(0XA0);
-		iic_wait_ack();
+	if(iic_wait_ack())
+		goto failed;
 		iic_send_byte(addr >> 8);
 	}else
 	{
 		iic_send_byte(0XA0 + ((addr / 256) << 1));
 	}
-	iic_wait_ack();
+	if(iic_wait_ack())
+		goto failed;
 	iic_send_byte(addr % 256);
-	iic_wait_ack();
+	if(iic_wait_ack())
+		goto failed;
 	iic_start_signal();
 	iic_send_byte(0XA1);
-	iic_wait_ack();
+	if(iic_wait_ack())
+		goto failed;
 	
 	for(int i = 0; i < lenth;i++)
 	{
@@ -442,35 +448,50 @@ static void eeprom_page_read(uint16_t addr,uint8_t *data,uint16_t lenth)
 	}
 	
 	iic_stop_signal();
+	
+	return 0;
+failed:
+	iic_stop_signal();
+	return 1;	
 }
 
-static void eeprom_write_page(uint16_t addr,uint8_t *data,uint16_t chuank)
+static uint8_t eeprom_write_page(uint16_t addr,uint8_t *data,uint16_t chuank)
 {
 	  if(chuank == 0 || chuank > PAGE_SIZE || ((addr % PAGE_SIZE) + chuank > PAGE_SIZE))
     {
-        return;
+        return 1;
     }
 
 	iic_start_signal();
 	if(USER_DEFINE_EEPROM_TYPE > AT24C16)
 	{
 		iic_send_byte(0XA0);
-		iic_wait_ack();
+		if(iic_wait_ack())
+			goto failed;
 		iic_send_byte(addr >> 8);
 	}else
 	{
 		iic_send_byte(0XA0 + ((addr / 256) << 1));
 	}
-	iic_wait_ack();
+	if(iic_wait_ack())
+		goto failed;
 	iic_send_byte(addr % 256);
-	iic_wait_ack();	
+	if(iic_wait_ack())
+		goto failed;
 	for(uint16_t i = 0; i < chuank;i++)
 	{
 		iic_send_byte(data[i]);
-		iic_wait_ack();
+		if(iic_wait_ack())
+			goto failed;
 	}
 	iic_stop_signal();
 	DelayNms(7);
+	
+	return 0;
+failed:
+	iic_stop_signal();
+	return 1;
+	
 }
 
 
@@ -480,12 +501,19 @@ static void eeprom_auto_page_write(uint16_t addr,uint8_t *data,uint16_t lenth)
 {
     uint16_t remaining = lenth;
     uint8_t *p = data;
+		uint8_t count = 5;
     
     while(remaining > 0)
     {
         uint8_t chunk = PAGE_SIZE - (addr % PAGE_SIZE);
         if(chunk > remaining) chunk = remaining;
-        eeprom_write_page(addr, p,chunk);
+				do{
+					if(!eeprom_write_page(addr, p,chunk))
+					{
+						break;
+					}
+				}while(count--);
+
         addr += chunk;
         p += chunk;
         remaining -= chunk;
@@ -497,16 +525,21 @@ static void eeprom_auto_page_read(uint16_t addr,uint8_t *data,uint16_t lenth)
 {
     uint16_t remaining = lenth;
     uint8_t *p = data;
-    
+    uint8_t count = 5;
+	
     while(remaining > 0)
     {
         uint8_t chunk = PAGE_SIZE - (addr % PAGE_SIZE);
         if(chunk > remaining) chunk = remaining;
-        
-        eeprom_page_read(addr, p, chunk);
-         
+				do{
+					if(!eeprom_page_read(addr, p, chunk))
+					{
+						break;
+					}
+				}while(count--);          
         addr += chunk;
         p += chunk;
         remaining -= chunk;
     }
-}
+}
+

+ 46 - 13
truing_control/PDU-AC_ADA_OLD8/hardware/hlw8110/Hlw8110.c

@@ -369,26 +369,59 @@ unsigned char Judge_CheckSum_HLW8110_Calfactor(void)
 
 void Init_HLW8110(void)
 {
-	Uart_HLW8110_WriteREG_EN();
-	DelayNms(10);
+
 	
 //电流通道A设置命令,指定当前用于计算视在功率、功率因数、相角、瞬时有功功率、瞬时视在功率和有功功率过载的信号指示 的通道为通道A	
-	Uart_HLW8110_Set_Channel_A();			
-	DelayNms(10);
-	Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);	//开启A通道,关闭B通道,电压通道PGA = 1,电流通道PGA = 16
-	DelayNms(10);
-	
+	for(int i = 0 ; i < 3 ;i++)
+	{
+		Uart_HLW8110_WriteREG_EN();
+		DelayNms(10);
+		Uart_HLW8110_Set_Channel_A();			
+		DelayNms(10);
+		Uart_Write_HLW8110_Reg(REG_SYSCON_ADDR,2,0x0a04);	//开启A通道,关闭B通道,电压通道PGA = 1,电流通道PGA = 16
+		DelayNms(10);
+		
 
-	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
+		Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0001);	//1,使能PFA 脉冲输出和有功电能寄存器累加;
 //	Uart_Write_HLW8110_Reg(REG_EMUCON_ADDR,2,0x0018);	//正向和负向过零点均发生变化,ZXD0 = 1,ZXD1 = 1
-	Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
-	DelayNms(10);
+		Uart_Write_HLW8110_Reg(REG_EMUCON2_ADDR,2,0x0065);	//0x0001是EMUCON2的默认值,waveEn = 1,zxEn = 1,A通道电量寄存器,读后不清0,EPA_CB = 1;打开功率因素检测
+		DelayNms(10);
 
 	
-	Uart_HLW8110_WriteREG_DIS();
+		Uart_HLW8110_WriteREG_DIS();
+		B_Read_Error = 0;
+		Check_WriteReg_Success();
+		if (B_Read_Error == 1)
+		{
+			DelayNms(50);
+		}else
+		{
+			break;
+		}
+	}
 //	DelayNms(3);	
   //读取地址是0x6F至0x77的寄存器,验证系数是否正确
-  Judge_CheckSum_HLW8110_Calfactor();	
+ // Judge_CheckSum_HLW8110_Calfactor();	
+	uint8_t d  = 0;
+	for(int i = 0;i < 3;i++)
+	{
+		d = Judge_CheckSum_HLW8110_Calfactor();
+		if(d)
+		{
+			break;
+		}
+	}
+	if(d == 0)
+	{
+		U16_RMSIAC_RegData		=	0xcad1;
+		U16_RMSIBC_RegData		=	0xcacf;
+		U16_RMSUC_RegData			=	0xa4c3;
+		U16_PowerPAC_RegData	=	0xab47;
+		U16_PowerPBC_RegData	=	0xab49;
+		U16_PowerSC_RegData		=	0xab41;
+		U16_EnergyAC_RegData	=	0xe9cc;
+		U16_EnergyBC_RegData	=	0xe9ce;		
+	}
 }
 
 
@@ -725,7 +758,7 @@ void Read_HLW8110_Angle(void)
 
 void Calculate_HLW8110_MeterData(void)
 {	
-	Check_WriteReg_Success();
+	//Check_WriteReg_Success();
 	
 	Read_HLW8110_IA();
 	Read_HLW8110_U();

+ 1 - 1
truing_control/PDU-AC_ADA_OLD8/user/board_cfg.h

@@ -15,7 +15,7 @@
 
 
 
-#define OPEN_WATCH_DOG  0
+#define OPEN_WATCH_DOG  1
 
 #define  POWER_DC           0
 #define  POWER_AC           1

+ 34 - 32
truing_control/PDU-AC_ADA_OLD8/user/main.c

@@ -43,28 +43,31 @@ static void break_2_boot_upgreade(void);
 
 
 int main(){
-	app_init(&meta_data);
-	//InitSysTick();
-	fwdgt_Init();
+	
+	ac_board.md_data.r_data.dev_chn =  ACSingCurrid << 8 | RelaySlaveChaNum;
+	InitSysTick();
 	led_init();
 	lock_init();
 	detection_init();
+	key_init();
 	relay_init();
 	haddr_init();
 	eeprom_init();
-	time_init();
+	read_config_from_eeprom();
 	electricity_init();
+	time_init();
 	query_init();
+	
+	//device
+	
+	fwdgt_Init();
 	eMBInit(MB_RTU, ac_board.haddr, 0, 115200, MB_PAR_NONE);
 	eMBEnable();
-	ac_board.feed_dog();
-	//device
-	ac_board.md_data.r_data.dev_chn =   ACSingCurrid << 8 | RelaySlaveChaNum;
-	//
+	
+	
+	
 	ac_board.md_data.r_data.info.channels = RelaySlaveChaNum;
-	read_config_from_eeprom();
-	ac_board.feed_dog();
-	strcpy((char*)&(ac_board.md_data.r_data.info.date),(char *)__DATE__);
+	strcpy((char*)&(ac_board.md_data.r_data.info.date),__DATE__);
 	strcat((char*)&(ac_board.md_data.r_data.info.date)," ");
 	strcat((char*)&(ac_board.md_data.r_data.info.date),__TIME__);
 	strcpy((char*)&(ac_board.md_data.r_data.info.ver),VERSION);
@@ -83,6 +86,7 @@ int main(){
 			ac_board.handle_status[i] = ac_board.relay_staging_staus[i];
 			ac_board.relay_staging_staus[i] = 0;
 		}
+		ac_board.handle_input_pt[0] = 0;
 	}
 #if SURPPORT_2_PT		
 		if((ac_board.md_data.r_data.detection & 0x2) == 0)
@@ -112,13 +116,11 @@ int main(){
 			ac_board.clear_flag = 0;
 			reset_config_for_eeprom();
 		}
-		if(ac_board.break_uboot)
-		{
-			break_2_boot_upgreade();
-		}
 	}
+	return 0;
 }
 
+static uint16_t _count = 0;
 
 static void task_query(void)
 {
@@ -189,24 +191,24 @@ static void task_10s(void)
 
 	}
 }
-static void break_2_boot_upgreade(void)
-{
-	meta_data.errno = 0;
-	meta_data.operation_flag = 1;
-	meta_data.recent_running_time = (uint32_t) ac_board.md_data.r_data.info.runing_time;
-	flash_erase_meta();
-	flash_write_meta(&meta_data);
-	__disable_irq();
-	//__set_FAULTMASK(1);
-	NVIC_SystemReset();
-}
+//static void break_2_boot_upgreade(void)
+//{
+//	meta_data.errno = 0;
+//	meta_data.operation_flag = 1;
+//	meta_data.recent_running_time = (uint32_t) ac_board.md_data.r_data.info.runing_time;
+//	flash_erase_meta();
+//	flash_write_meta(&meta_data);
+//	__disable_irq();
+//	//__set_FAULTMASK(1);
+//	NVIC_SystemReset();
+//}
 
-static void app_init(META_DATA_S *meta)
-{
-	nvic_vector_table_set(NVIC_VECTTAB_FLASH,0x08004000 - NVIC_VECTTAB_FLASH);
-	flash_get_meta_data(meta);
-	__enable_irq();
-}
+//static void app_init(META_DATA_S *meta)
+//{
+//	nvic_vector_table_set(NVIC_VECTTAB_FLASH,0x08004000 - NVIC_VECTTAB_FLASH);
+//	flash_get_meta_data(meta);
+//	__enable_irq();
+//}
 
 static void relay_ctrl(void)
 {