#include "fast_uart_reg.h"
/*--------------------------------------��������-----------------------------------*/
fur_u8  fur_bit              =0;  //�Ĵ���λ����־��
fur_u8  fur_flag             =0;  //�Ĵ���״̬��
fur_u8  fur_state            =0;  //���ڽ���״̬��������
fur_u8  fur_cmd_start        =0;  //���λ���Ŀ�ʼָ�롣
fur_u8  fur_cmd_end          =0;  //���λ���Ľ���ָ�롣
fur_u8  fur_cmd_wr_buf[16]   ={0};//ָ���д״̬���λ��棬�����첽�����зֱ�ָ���Ƕ�����д��
fur_u16 fur_cmd_buf   [16]   ={0};//ָ��λ��棬���ڼ��ᴮ���ж�ѹ����
fur_u16 fur_reg_point        =0;  //�Ĵ���ָ�룬ָ��Ҫд��ļĴ�����
fur_u16 fur_reg_temp         =0;  //д��Ĵ����Ļ��档
fur_u16 fur_reg_buf   [16]   ={0};//Ӱ�ӼĴ���������д����������������ţ���֤���ٴ��뱾�塣
fur_u16 fur_reg[ECBM_FUR_REG_MAX+FUR_REG_OFFSET];//�Ĵ������壬ֱ�Ӻ͹��ܹҹ���
fur_u16 fur_addr                 ;//����ģʽ�£�������֤��ַ����ֵ��
fur_u16 fur_dat                  ;//����ģʽ�£�������֤���ݷ���ֵ��
fur_u16 fur_id                   ;//ID���˹���
/*------------------------------------��Դ��ͻ����---------------------------------*/
#if (ECBM_FUR_EEPROM_EN == 1) && (ECBM_EEPROM_EN == 0)
#error EEPROM����û��ʹ�ܣ���ر�FUR�ı��湦�ܻ��ߴ�Ƭ��EEPROMʹ�ܣ�
#endif
#if ECBM_UART_EN == 0
#error FUR�ǻ��ڴ��ڵ�Ӧ�ã����UARTʹ�ܣ�
#endif
/*--------------------------------------������-----------------------------------*/
/*-------------------------------------------------------
FUR���ܵĴ��ڴ�ӡ������
-------------------------------------------------------*/
void fur_printf_base(const char * str,...){
	char xdata buf[64];  //�ַ������档
	va_list vp;          //���������ַ��
    va_start(vp, str);   //��ֵ�����ĵ�ַ��
    vsprintf(buf,str,vp);//ʹ�����õ�printf������ʽ����
    va_end(vp);          //ʹ����Ҫ�رա�
	uart_string(ECBM_FUR_UART_ID,buf);  //����ʽ��֮����ַ������ͳ�ȥ��
}
/*-------------------------------------------------------
FUR���ܵĴ��ڶ�ȡ������
-------------------------------------------------------*/
void fur_in(u8 buf){
	switch(fur_state){
		case 0:{				//�ȴ���ʼ֡��
			if(buf=='['){		//��⵽��ʼ֡ʱ��
				fur_state=1;	//����һ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}
			if(buf=='h'){		//help
				fur_state=10;	//����һ��״̬��
			}
		}break;
		case 1:{				//�ǼǼĴ�����ַ��
			if(buf==']'){		//����յ�����֡��
				fur_state=2;	//����һ��״̬��
				fur_cmd_in=0;//��ʼ����дָ�
			}else if((buf>='0')&&(buf<='9')){//����յ����֣�
				fur_reg_point*=10;			//�������֡�
				fur_reg_point+=buf-'0';
			}else if(buf=='@'){//����յ���@��˵����ID�����ˡ�
				fur_id=0;
				fur_state=5;	//����һ��״̬��
			}else if(buf=='['){//����ڱ�״̬�ٴ��յ���ʼ֡��ֻ������Ĵ�����ַ������
				fur_reg_point=0;//��ʼ���Ĵ�����ַ��
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
		case 2:{				//�ȴ�����֡��
			if(buf=='='){		//���յ�����֡��
				fur_state=3;	//����һ��״̬��
				fur_bit=100;
				fur_reg_temp=0;		//��ʼ���Ĵ������ݻ��档
			}else if(buf=='&'){
				fur_cmd_in=0x10;//��ʼ����дָ�
			}else if(buf=='|'){
				fur_cmd_in=0x20;//��ʼ����дָ�
			}else if(buf=='['){//����յ���ʼ֡��
				fur_state=1;	//�ص��Ǽǵ�ַ̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else if(buf=='^'){
				fur_bit=0;
				fur_state=6;
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
		case 3:{				//�ǼǼĴ������ݡ�
			if(buf=='?'){		//���յ���ȡָ�
				fur_cmd_buf[fur_cmd_end]=fur_reg_point;//��¼��ָ����С�
				fur_cmd_in=0;
				fur_cmd_end++;
				fur_cmd_end&=0x0f;
				fur_state=0;	
			}else if(buf=='['){//�������ʱ���յ���ʼ֡��
				fur_state=1;	//���˵��Ǽǵ�ַ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else if((buf=='x')||(buf=='X')){//
				fur_reg_temp=0;		//
				fur_state=4;	//
			}else if((buf>='0')&&(buf<='9')){	//����յ����֣�
				fur_reg_temp*=10;					//�������֡�
				fur_reg_temp+=buf-'0';
			}else if(buf=='.'){//����յ�����֡��
				fur_reg_buf[fur_cmd_end]=fur_reg_temp;//д�뵽�Ĵ�����
				fur_cmd_buf[fur_cmd_end]=fur_reg_point;//��¼��ָ����С�
				fur_cmd_in+=0x10;
				fur_cmd_end++;
				fur_cmd_end&=0x0f;
				fur_state=0;	
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
		case 4:{				//�ǼǼĴ�������(HEXģʽ)��
			if(buf=='?'){		//���յ���ȡָ�
				fur_cmd_buf[fur_cmd_end]=fur_reg_point;//��¼��ָ����С�
				fur_cmd_in=0;
				fur_cmd_end++;
				fur_cmd_end&=0x0f;
				fur_state=0;
			}else if(buf=='['){//�������ʱ���յ���ʼ֡��
				fur_state=1;	//���˵��Ǽǵ�ַ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else if((buf>='0')&&(buf<='9')){	//����յ����֣�
				fur_reg_temp*=16;					//�������֡�
				fur_reg_temp+=buf-'0';
			}else if((buf>='A')&&(buf<='F')){	//����յ����֣�
				fur_reg_temp*=16;					//�������֡�
				fur_reg_temp+=(buf-'A')+10;
			}else if((buf>='a')&&(buf<='f')){	//����յ����֣�
				fur_reg_temp*=16;					//�������֡�
				fur_reg_temp+=(buf-'a')+10;
			}else if(buf=='.'){//����յ�����֡��
				fur_reg_buf[fur_cmd_end]=fur_reg_temp;//д�뵽�Ĵ�����
				fur_cmd_buf[fur_cmd_end]=fur_reg_point;//��¼��ָ����С�
				fur_cmd_in+=0x10;
				fur_cmd_end++;
				fur_cmd_end&=0x0f;
				fur_state=0;	
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
		case 5:{//����ID��ַ
			if(buf==']'){		//����յ�����֡��
				if((fur_id&0x00ff)!=(fur_reg[1]&0x00ff)){
					fur_state=0;//��ת�صȴ�̬��
				}else{
					fur_state=2;	//����һ��״̬��
				}
			}else if((buf>='0')&&(buf<='9')){//����յ����֣�
				fur_id*=10;			//�������֡�
				fur_id+=buf-'0';
			}else if(buf=='['){//����ڱ�״̬�ٴ��յ���ʼ֡��ֻ������Ĵ�����ַ������
				fur_state=1;	//�ص��Ǽǵ�ַ̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
		case 6:{//����λ��ַ
			if(buf=='='){		//���յ�����֡��
				if(fur_bit<16){			
					fur_cmd_in=0x30+fur_bit;//��ʼ����дָ�
					fur_state=3;	//����һ��״̬��
					fur_reg_temp=0;		//��ʼ���Ĵ������ݻ��档
				}else{
					fur_state=0;	//��ת�صȴ�̬��
				}
			}else if((buf>='0')&&(buf<='9')){//����յ����֣�
				fur_bit*=10;			//�������֡�
				fur_bit+=buf-'0';
			}else if(buf=='['){//����ڱ�״̬�ٴ��յ���ʼ֡��ֻ������Ĵ�����ַ������
				fur_state=1;	//�ص��Ǽǵ�ַ̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
		case 10:{//e
			if(buf=='e'){		//help
				fur_state=11;	//����һ��״̬��
			}else if(buf=='['){		//��⵽��ʼ֡ʱ��
				fur_state=1;	//����һ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else{
				fur_state=0;	//����һ��״̬��
			}
		}break;
		case 11:{//l
			if(buf=='l'){		//help
				fur_state=12;	//����һ��״̬��
			}else if(buf=='['){		//��⵽��ʼ֡ʱ��
				fur_state=1;	//����һ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else{
				fur_state=0;	//����һ��״̬��
			}
		}break;
		case 12:{//p
			if(buf=='p'){		//help
				fur_state=13;	//����һ��״̬��
			}else if(buf=='['){		//��⵽��ʼ֡ʱ��
				fur_state=1;	//����һ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else{
				fur_state=0;	//����һ��״̬��
			}
		}break;
		case 13:{//.
			if(buf=='.'){		//����յ�����֡��
				fur_state=14;	//����help
				fur_dat=65535;
			}else if(buf=='['){		//��⵽��ʼ֡ʱ��
				fur_state=1;	//����һ��״̬��
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else if(buf=='-'){
				fur_state=15;	//����һ��״̬
				fur_dat=0;
			}else{
				fur_state=0;	//����һ��״̬��
			}
		}break;
		case 15:{
			if(buf=='.'){		//����յ�����֡��
				fur_state=14;	//����help
			}else if((buf>='0')&&(buf<='9')){//����յ����֣�
				fur_dat*=10;			//�������֡�
				fur_dat+=buf-'0';
			}else if(buf=='['){//����ڱ�״̬�ٴ��յ���ʼ֡��ֻ������Ĵ�����ַ������
				fur_reg_point=0;	//��ʼ���Ĵ�����ַ��
			}else{				//�յ������ַ���
				fur_state=0;	//��ת�صȴ�̬��
			}
		}break;
	}
}
/*-------------------------------------------------------
FUR��У�Ժͷ��غ�����
-------------------------------------------------------*/
void fur_check(void){
	if(fur_state==14){//��״̬˵����λ����Ҫһ�ݼĴ���˵�������˵����Ҫ��ǰд��
		fur_state=0;
		if(fur_dat==65535){
			fur_printf("Fast-Uart-Reg %s in ECBM\r\n",FUR_VER);
			fur_printf("����ID:%u\r\n",fur_reg[1]&0x00FF);//���ر���ID
			if(fur_reg[1]&0x8000){     
				fur_printf("��ʾģʽ:16����\r\n");
			}else{
				fur_printf("��ʾģʽ:10����\r\n");
			}
			fur_printf("REG[60000]:�����ʼĴ���(��д)\r\n");
			fur_printf("REG[60001]:�����Ĵ���  (ֻд)\r\n");
			fur_printf("REG[60002]:ID�żĴ���  (��д)\r\n");
			fur_printf("REG[60003]:�Ĵ�������\xFD  (ֻ��)\r\n");
			
			fur_printf("�����Ĵ���֧��:\r\n");
			fur_printf("[60001]=10.��ʾ10����\r\n");
			fur_printf("[60001]=16.��ʾ16����\r\n");
			#if	ECBM_FUR_EEPROM_EN == 1
			fur_printf("[60001]=0xA55A.��������\r\n");
			fur_printf("[60001]=0xF00F.��ȡ����\r\n");
			#endif
			fur_printf("\r\n�û��Ĵ���:%u ��\r\n",(u16)ECBM_FUR_REG_MAX);//���ؼĴ�������
		}
		#if ECBM_FUR_HELP_EN == 1
		fur_help(fur_dat);//���û�ж��������������ô����ָ��ض�������
		#else
		fur_printf("\r\n�û��Ĵ���˵����û��д��!\r\n");//����������û����������ʾһ�¡�
		#endif
	}
	while(fur_cmd_start!=fur_cmd_end){//ֻ�ڻ��λ�����ͷβָ�벻һ�µ�ʱ�������ִ�С�
		
/*------------------------------------------------����ִ�в��ֿ�ʼ---------------------------------------------------------*/	
		fur_addr=fur_cmd_buf[fur_cmd_start];//�����յ��ĵ�ַ����������
		fur_dat =fur_reg_buf[fur_cmd_start];//�����յ������ݽ���������
		if(fur_flag&FUR_FLAG_MS_M){//-------------��������������------------------------------------------------------------
			fur_flag|=FUR_M_FLAG_READ;//֪ͨ�ⲿ�������Ѿ��ɹ����ա�
		}else{//-----------------------------------�����Ǵӻ�����------------------------------------------------------------
			if(fur_addr<ECBM_FUR_REG_MAX){//�жϵ�ַ�Ƿ��ڹ涨��Χ�ڡ�			
				if((fur_cmd_out&0xf0)==0x10){//�ж��Dz���ֱ��дָ�
					fur_cmd_out=0;//�ǵĻ������ָ�
					fur_reg_in(fur_addr,fur_dat);//���Ĵ�����д�����ݣ���Ȼ����Ҫ�е�ַƫ�ơ�
				}else if((fur_cmd_out&0xf0)==0x20){//�ж��Dz�����дָ�
					fur_cmd_out=0;//�ǵĻ������ָ�
					fur_reg_in(fur_addr,fur_reg_out(fur_addr)&fur_dat);//��ԭ���Ĵ��������������µ�������д��ȥ��
				}else if((fur_cmd_out&0xf0)==0x30){//�ж��Dz��ǻ�дָ�
					fur_cmd_out=0;//�ǵĻ������ָ�
					fur_reg_in(fur_addr,fur_reg_out(fur_addr)|fur_dat);//��ԭ���Ĵ��������ݻ����µ�������д��ȥ��
				}else if((fur_cmd_out&0xf0)==0x40){//�ж��Dz��ǻ�дָ�
					if(fur_dat){
						fur_reg_in(fur_addr,fur_reg_out(fur_addr)|(1<<(fur_cmd_out&0x0f)));//
					}else{
						fur_reg_in(fur_addr,fur_reg_out(fur_addr)&(~(1<<(fur_cmd_out&0x0f))));//
					}
					fur_cmd_out=0;//�ǵĻ������ָ�
				}
				
				//��һ���Ƿ���ֵ���ܣ��ڲ�ѯָ���£����ؼĴ�����ֵ���鿴����дָ���£����ؼĴ�����ֵ��д����֤��
				if(fur_reg[1]&0x8000){
					fur_printf("[%u]=0x%04X.\r\n",fur_addr,fur_reg_out(fur_addr));
				}else{
					fur_printf("[%u]=%u.\r\n",fur_addr,fur_reg_out(fur_addr));
				}
				#if ECBM_FUR_WR_CALLBACK_EN == 1//��ִ���˼Ĵ�����д�����͵�����Ӧ�Ļص�������
				fur_reg_io_callback(fur_addr,fur_dat);
				#endif
			}else if(fur_addr==60000){//�жϵ�ַ�Dz��Dz����ʼĴ�����
				if(fur_cmd_out){//�ж��Dz���дָ�
					fur_cmd_out=0;//�ǵĻ�����������ִ�У����ָ�
					fur_reg[0]=fur_dat;//��Ӱ�ӼĴ�����ֵд��Ĵ����У�
					fur_printf("OK[65535]=0.\r\n");//�ɹ�����ʱ������OK��
					uart_set_baud(ECBM_FUR_UART_ID,(u32)fur_reg[0]*100);//ͬʱ����100������ȷ�IJ����ʣ�Ȼ���޸IJ����ʡ�
				}else{
					fur_printf("BAUD=%lu\r\n",(u32)fur_reg[0]*100);//����Dz�ѯָ��ͷ���
				}
			}else if(fur_addr==60001){//�жϵ�ַ�Dz��Ǵ����Ĵ�����
				if(fur_cmd_out){//�ж��Dz���дָ�
					fur_cmd_out=0;//�ǵĻ�����������ִ�У����ָ�
					if(fur_dat==0xA55A){//д��0xA55A�Ļ����ͻ�ѵ�ǰ���е����ö�����������
						#if	ECBM_FUR_EEPROM_EN == 1	
						eeprom_write_ex(0,(u8 *)fur_reg,(ECBM_FUR_REG_MAX+FUR_REG_OFFSET)*2);//�����ڲ�eepromд����������Ϣ��
						#else
						fur_flag|=FUR_FLAG_DATA;//�����湦��û�������������ݴ����־λ��
						#endif
					}else if(fur_dat==0xF00F){//д��0xF00F�Ļ����ͻ��ȡ�������Ϣ�滻��ǰ���е����á�
						#if	ECBM_FUR_EEPROM_EN == 1	
						eeprom_read_ex(0,(u8 *)fur_reg,(ECBM_FUR_REG_MAX+FUR_REG_OFFSET)*2);//�����ڲ�eeprom��������ȡ��Ϣ��
						#else
						fur_flag|=FUR_FLAG_DATA;//�����湦��û�������������ݴ����־λ��
						#endif
					}else if(fur_dat==10){//д��10�Ļ����ͻ���û��Ĵ�����ʾ��ʽ���ó�ʮ���ơ�
						fur_reg[1]&=0x7FFF;
					}else if(fur_dat==16){//д��16�Ļ����ͻ���û��Ĵ�����ʾ��ʽ���ó�ʮ�����ơ�
						fur_reg[1]|=0x8000;
					}else{
						fur_flag|=FUR_FLAG_DATA;//�Ĵ���60001�Ǵ����Ĵ��������ʲô����������Ҳ����һ�ִ���
					}
				}else{
					fur_flag|=FUR_FLAG_DATA;//�Ĵ���60001�Ǵ����Ĵ���������ֻд���ԣ�����Ƕ�ָ�Ҳ����һ�ִ���
				}
				if(fur_flag&FUR_FLAG_DATA){//������������Ĵ��������ݴ���Ҫ��ʱ�ش���Ϣ��
					#if ECBM_FUR_ERR_CALLBACK_EN == 0//��ʹ�ܴ���ص���ʱ�򣬲����㡣����ص������Ҳ���������
					fur_flag&=~FUR_FLAG_DATA;//������������־λ��
					#endif
					fur_printf("Reg Cmd Error![65535]=1.\r\n");
				}else{
					fur_printf("OK[65535]=0.\r\n");//�ɹ�����ʱ������OK��
				}
			}else if(fur_addr==60002){//ID�żĴ���
				if(fur_cmd_out){//�ж��Dz���дָ�
					fur_cmd_out=0;//�ǵĻ�����������ִ�У����ָ�
					fur_dat&=0x00ff;
					fur_reg[1]&=0xff00;
					fur_reg[1]|=fur_dat;//�޸�ID��
				}
				fur_printf("ID[60002]=%u.\r\n",fur_reg[1]&0x00ff);
			}else if(fur_addr==60003){//�Ĵ��������Ĵ������е��ƣ�
				fur_printf("REG_NUM[60003]=%u.\r\n",(u16)ECBM_FUR_REG_MAX);
			}else{//���ַ��������ܶ�д�ģ����ش����롣
				#if ECBM_FUR_ERR_CALLBACK_EN == 1//�˴�����Ҳ������λ�ģ���������λ�������е���࣬�ͺϲ�������
				fur_flag|=FUR_FLAG_ADDR;//�õ�ַ�����־λ��
				#endif
				fur_printf("Reg Addr Error![65535]=2.\r\n");
			}
			#if ECBM_FUR_ERR_CALLBACK_EN == 1//��ִ���˼Ĵ�����д�����͵�����Ӧ�Ļص�������
			fur_error_callback(fur_flag&0x7F);
			#endif
		}
/*------------------------------------------------����ִ�в��ֽ���---------------------------------------------------------*/	
		fur_cmd_start++;//���λ����������ͷָ��++��
		fur_cmd_start&=0x0f;//�޶���16�ֽڡ�
	}
}			
/*-------------------------------------------------------
FUR�ij�ʼ��������
-------------------------------------------------------*/
void fur_init(void){
#if	ECBM_FUR_EEPROM_EN == 1	
	fur_u8 i;
#endif	
	fur_u16 temp;
#if   ECBM_FUR_UART_ID == 1	
	temp=UART1_BAUD_RATE/100;//д�벨����Ĭ��ֵ��
#elif ECBM_FUR_UART_ID == 2
	temp=UART2_BAUD_RATE/100;//д�벨����Ĭ��ֵ��
#elif ECBM_FUR_UART_ID == 3
	temp=UART3_BAUD_RATE/100;//д�벨����Ĭ��ֵ��
#elif ECBM_FUR_UART_ID == 4
	temp=UART4_BAUD_RATE/100;//д�벨����Ĭ��ֵ��
#endif
	fur_reg[0]=temp;
	fur_reg[1]=ECBM_FUR_ID;
#if	ECBM_FUR_EEPROM_EN == 1	
	eeprom_init();//��ʼ���ڲ���eeprom������STC���������
	eeprom_read_ex(0,(u8 *)fur_reg,(ECBM_FUR_REG_MAX+FUR_REG_OFFSET)*2);//��ȡ�����ֵ��
	if(fur_reg[0]==0xffff){//�������û�б���������߲������б仯
		for(i=0;i<(ECBM_FUR_REG_MAX+FUR_REG_OFFSET);i++){//��ȫ����ʼ��Ϊ0��
			fur_reg[i]=0;
		}
		fur_reg[0]=temp;
		fur_reg[1]=ECBM_FUR_ID;
		eeprom_write_ex(0,(u8 *)fur_reg,(ECBM_FUR_REG_MAX+FUR_REG_OFFSET)*2);//�ٽ���ʼ����ֵд�롣
	}
	uart_set_baud(ECBM_FUR_UART_ID,(u32)fur_reg[0]*100);
#endif
}

/*-------------------------------------------------------
FUR�Ĵ������ú�����
-------------------------------------------------------*/
void fur_reg_uart_reset(void){
	uart_set_baud(ECBM_FUR_UART_ID,115200);
}
/*-------------------------------------------------------
FUR�����Ķ�ȡ���������ڶ�ȡ��һ���ӻ��ļĴ�����
-------------------------------------------------------*/
u16 fur_read(u16 addr){
	fur_u16 timeout=2000;		//�趨��ʱʱ��Ϊ2�롣
	fur_flag|=FUR_FLAG_MS_M;//�趨FURΪ����ģʽ��
	fur_printf("[%u]=?.\r\n",addr);//���Ͳ�ѯָ�
	fur_flag&=~FUR_M_FLAG_TIME;//���㳬ʱ��־λ��
	while(timeout--){		//ѭ���ȴ����г�ʱ�ж���
		delay_ms(1);		//ÿ1ms
		fur_check();		//��ѯһ�����ݡ�
		if(fur_flag&FUR_M_FLAG_READ){//���յ�����ʱ��
			if(addr==fur_addr){//������صĵ�ַ�ͷ��͵ĵ�ַһ�£�
				fur_flag|=FUR_M_FLAG_OK;//������Ϊ����ȷ���ա�
				fur_flag&=FUR_FLAG_MS_S;//�л����ӻ�ģʽ��
				return fur_dat;//���ؽ��յ����ݡ�
			}else{//������صĵ�ַ�ͷ��͵ĵ�ַ��һ�£�
				if(fur_addr==65535){//�ҷ��ص�ַΪ65535��
					switch(fur_dat){//˵�����䷢���˴��󣬽��յ��������Ǵ����롣
						case 1:fur_flag|=FUR_M_FLAG_DATA;break;//��������룬����Ӧ��־λ��
						case 2:fur_flag|=FUR_M_FLAG_ADDR;break;
					}
				}else{//�����������ַ����Ȼ���������ԭ��δ֪��
					fur_flag|=FUR_M_FLAG_ADDR;//�������Եľ��Ƿ��صĵ�ַ�����⡣
				}
				#if ECBM_FUR_ERR_CALLBACK_EN == 1
				fur_error_callback(fur_flag&0x7F);//���ó����ص�������
				#endif
				fur_flag&=FUR_FLAG_MS_S;//�л����ӻ�ģʽ��
				return 0;//Ĭ�Ϸ���0��
			}
		}
	}
	if(timeout==65535){//�����ʱ�Ļ���
		fur_flag|=FUR_M_FLAG_TIME;//�ó�ʱ��־λ��
	}
	fur_flag&=FUR_FLAG_MS_S;//�л����ӻ�ģʽ��
	return 0;//Ĭ�Ϸ���0��
}
/*-------------------------------------------------------
FUR�����Ķ�д������������һ���ӻ��ļĴ���д��һ��ֵ��
-------------------------------------------------------*/
void fur_write(u16 addr,u16 dat){
	fur_u16 timeout=2000;		//�趨��ʱʱ��Ϊ2�롣
	fur_flag|=FUR_FLAG_MS_M;//�趨FURΪ����ģʽ��
	fur_printf("[%u]=%u.\r\n",addr,dat);//���Ͷ�дָ�
	fur_flag&=~FUR_M_FLAG_TIME;//���㳬ʱ��־λ��
	while(timeout--){		//ѭ���ȴ����г�ʱ�ж���
		delay_ms(1);		//ÿ1ms
		fur_check();		//��ѯһ�����ݡ�
		if(fur_flag&FUR_M_FLAG_READ){//���յ�����ʱ��
			if(addr==fur_addr){//������صĵ�ַ�ͷ��͵ĵ�ַһ�£�
				if(dat==fur_dat){//�ҷ��ص�����Ҳһ�£�
					fur_flag|=FUR_M_FLAG_OK;//������Ϊ����ȷ���ա�
					goto fur_write_return;//����ѭ����ֱ�ﺯ��β��
				}else{//������ص����������⣬
					fur_flag|=FUR_M_FLAG_DATA;//�����ݴ����־λ��
					goto fur_write_return;//����ѭ����ֱ�ﺯ��β��
				}				
			}else{//������صĵ�ַ�ͷ��͵ĵ�ַ��һ�£�
				if(fur_addr==65535){//�ҷ��ص�ַΪ65535��
					switch(fur_dat){//˵�����䷢���˴��󣬽��յ��������Ǵ����롣
						case 1:fur_flag|=FUR_M_FLAG_DATA;break;//��������룬����Ӧ��־λ��
						case 2:fur_flag|=FUR_M_FLAG_ADDR;break;
					}
				}else{//�����������ַ����Ȼ���������ԭ��δ֪��
					fur_flag|=FUR_M_FLAG_ADDR;//�������Եľ��Ƿ��صĵ�ַ�����⡣
				}
				#if ECBM_FUR_ERR_CALLBACK_EN == 1
				fur_error_callback(fur_flag&0x7F);//���ó����ص�������
				#endif
				goto fur_write_return;//����ѭ����ֱ�ﺯ��β��
			}
		}
	}
	if(timeout==65535){//�����ʱ�Ļ���
		fur_flag|=FUR_M_FLAG_TIME;//�ó�ʱ��־λ��
	}
fur_write_return:
	fur_flag&=FUR_FLAG_MS_S;//�л����ӻ�ģʽ��
}