⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmiic.c

📁 摩托罗拉 hc908sr12的开发代码 codewarrior软件开发的
💻 C
字号:
#include "mmiic.h"
//#include <stdtypes.h>
#include "AlarmBit.h"

#ifdef smart_charger

void mmiic_init(void);
void repeat_start(void);
void write(uchar);
uchar  read(void);
void mmiic_wr(uchar,uchar,uchar *wr);
uchar *  mmiic_rd(uchar,uchar);
void rd_mode_ack(void);
void rd_mode_nack(void);
void wr_mode(void);
void write(uchar) ;
void mmiic_start(void) ;
void mmiic_stop(void);
void test_b_com_err(void);
//===============slave_mode==============================
void slave_mode_init(void);
//void slave_start(void) ;

void slave_mode(void);
void wr_stop(void);
extern void feed_dog(void);		
#ifdef sci_enable 
extern void sci_tr(uchar);
#endif
extern void delaying(uchar);
extern void hold_i_charge(uint,uint);
//=====================slave_mode====================================
//extern uchar key_count;
const  uchar address_myself=0x16; 
extern uchar errcount,mm;
extern uchar iic[7] ;
extern const  uchar comand_charge_v ;
extern const  uchar comand_current;
extern uint i_current;
extern uint i_voltage;
extern uint v[4]; 
extern uint current[2];

/*============================================================================
uint i_manufacture_access;												     //
										                                     //
uint i_mangemen_access;													     //
												                             //
														        	         //
uint i_battery_mode;													     //
const battery_mode=0x03;												     //
uint i_temperature;														     //
const temperature=0x08;														 //
uint i_voltage;																 //
const voltage=0x09;															 //
uint i_current;																 //
const current=0x0a;															 //
																			 //
uint i_full_cap;															 //
const full_cap=0x10;														 //
uint i_remain_cap;															 //
const remain_cap=0x0f;														 //
uint i_charge_v;															 //
const charge_v=0x15;														 //
uint i_charge_i;															 //
const charge_i=0x14;														 //
uint i_battery_statue;														 //
const battery_statue=0x16;													 //
uint i_cycle;																 //
const cycle=0x17;															 //
uint i_desigen_cap;															 //
const desigen_cap=0x18;														 //
uint i_desigen_v;															 //
const desigen_v=0x19;														 //
uint i_specificationinfo;													 //
const specificationinfo=0x1a;												 //
uint i_manfauture_date;														 //
const manfature_date=0x1b;													 //
uint i_serial_number;														 //
const serial_number=0x1c;													 //
uint i_manufacture_name;													 //
const manufacture_name=0x20;												 //
uint i_device_name;															 //
const device_name=0x21;														 //
//uint i_rate_v;															 //
//uint i_rate_i;															 //
uint i_chemistry;	        												 //
const chemistry=0x22;
//===================================for var define========================= */
void wr_stop(void)
{
errcount=0;
do{
  test_b_com_err();
  if(b_com_err) break;
  }while(!mmnakif);

}

void slave_mode(void)
{
 uchar n=0;
 uchar tmp_online_info;
 tmp_online_info=OnlineInfo;
 mmast=0;
 mmtxak=0;
 errcount=0;
  do{												  
   test_b_com_err();
   if (b_com_err) break;
   }while(mmatch==0);
  if (b_com_err) goto end9;  
   if(!mmsrw)
            {
             iic[1]=read();
            // mmrxif=0;
            }  
 iic[2] =read();
 if (b_com_err) goto end9;
   errcount=0;
   do{
      test_b_com_err();
      if (b_com_err) break;
     }while(mmatch);



if (b_com_err) goto end9;
   if(mmsrw)
            {
             errcount=0;
               do{
                test_b_com_err();
                 if (b_com_err) break;
                 }while(mmatch==0);
             if (b_com_err) goto end9; 
             switch(iic[2])
                          {
                		   case 0x15:	 //comand_voltage
                		   write(0x02);
                		   if(b_com_err) goto end9; 
                		   write(0x16);
                		     if(b_com_err) goto end9; 
                		    
                		   write(0x17);
                		      if(b_com_err) goto end9; 
                	       break;         
                           
                           case 0x14: //comand
                           write(0x02);
                		   write(current[1]/256);
                		   write(current[1]%256);
                		   break;
                           
                           case 0x34:
                           write(0x01);
                           write(tmp_online_info);
                           default: break;
                 
                          }
                   #ifdef crc       
                    errcount=0;
              		do{
              		  test_b_com_err();
              		  if(b_com_err) break;
              		  } while(mmcrcbf==0);
		            write(MMCRCDR);
		            mmrxak= 1;
		            #endif
              }
          else
              {
               iic[3]=read();
               if(iic[3]>10) b_com_err=1;
               if (b_com_err) goto end9;
               for(n=4;n<(iic[3]+4);n++)
               {
                if(n==(iic[3]+4)) mmtxak=1;
                iic[n]=read();
                if (b_com_err) goto end9;
               }
               
               
                              switch(iic[2])
                           {
                            
                            case 0x15:
                 	       
                   	        i_voltage=iic[4]*256+iic[5];
                	        break;         
                          	
                          	case 0x14:
                          	i_current=iic[4]*256+iic[5]	 ;
                          	hold_i_charge(i_current,17000);
                          	break;
                                                                			
                			case 0x16:
                		    bat_alarm=iic[5];
                		    bat1_alarm=iic[4];
                		    break;
                		    
                		    case 0x34:
                		    OnlineInfo=(OnlineInfo&iic[4]);
                		    break;
                		    default: break;                	 
                			
                			}
                         
              asm nop;
             }
end9:
mmiic_stop();
asm nop;
}	 
										
uchar * mmiic_rd(uchar addressh,uchar addressl)
{
uchar n=0;
uchar tmp_n=0;
uchar count=0;
uchar count2=0;
mmiic_init();
MMADR=addressh;
wr_mode();
MMDTR=addressl;
mmiic_start();
if(b_com_err) goto mmiic_end2;
errcount=0;
do{
test_b_com_err();
if(b_com_err) goto mmiic_end2;            
} while(mmtxbe==0);
mmtxif=0;
n=0;
rd_mode_ack();
repeat_start();
iic[0]=read();
if(iic[0]>80) b_com_err=1;
if (b_com_err) goto mmiic_end2; 
for (n=1;n<iic[0];n++)
{
iic[n]=read();
if (b_com_err) goto mmiic_end2;             
}

#ifndef crc
rd_mode_nack();
#endif  
iic[n]=read();
//iic[n+1]=read();

#ifdef crc  
rd_mode_nack();

errcount=0;
do{
test_b_com_err();
if(b_com_err) goto mmiic_end2;  
}while(mmcrcbf==0);

if(mmcrcef) {
             //b_com_err=1;9月16日
            }
       
#endif             
//=======================================test follow=================================================
mmiic_end2:
//=======================================test end ====test end======================================
mmast=0;
mmiic_stop();
return (&iic[1]);

}

void mmiic_wr(uchar addressh,uchar addressl,uchar *wr)
{
errcount=0;
//errcount=0xff;
mmiic_init() ;
MMADR=addressh;
MMDTR=addressl;
wr_mode() ;
mmiic_start();
if (b_com_err) goto mmiic_end3;
errcount=0;
do{
   asm nop;
   test_b_com_err();
   if(b_com_err) goto mmiic_end3;
              
  }while(mmtxbe==0);


switch (addressl)
                {
                 case 0x34:
                           write(0x01);
                           write(OnlineInfo);
                           break;
                 default: break;
               }

/*
write(0x01);
write(*wr);//*wr //临时数据====
wr++;
write(*wr);//write(0x13); //*wr 临时数据====
*/
mmiic_end3:

mmiic_stop() ;
}

//=============================================================================================================
//    some subroutine for mmiic moudle     =		=			 = =		   =   =    =			 =		  =
//										   =		 =	  		=   =		  =	   =    =			 =		  =
//										   =		  =	       =	 =		 =	   =    =			 =		  =
//										   =		   =	  =		  =		=	   =    =			 =		  =
//										   =			=	 =		   =   =	   =    =			 =		  =
//										   =			 = =			= =		   =    =========	 ==========
//=============================================================================================================
																						   
 void slave_mode_init (void)	 //从机被读
{
 mmiic_init();
 MMADR=address_myself;//0b00010111;         //末位是1
 //mmtxak=0;
 mmien=1;             //从机被读实验时无此句
 mmast=0;
}

 /*
  void slave_start(void)

 {
 b_com_err=0;
 mmast=0;
 //==============================================================
 do{												  
 iic[1]=read();
 if (b_com_err) break;
 }while(mmatch==0);
 if (!b_com_err) iic[2]=read();
														 
 }
  */
void mmiic_init(void)
 {
 
 MMDTR=0xff;
 mmen=0;
 MMFDR=0x06;//===3>彭
 MMCR1=0xa0;
 MMCR2=0;
 mmen=1;
 mmcrcbyte=1;

 }
 
 
  void mmiic_start(void) //包含错误判断//
{							
uchar k;
for(k=0;k<7;k++)
               {
               iic[k]=0;
               }

errcount=0;

do{
   test_b_com_err();
   if(b_com_err) break;
  }while (mmbb==1);		
  
if(!b_com_err) mmast=1;//??????

}

  void wr_mode(void)
{
mmrw=0;
mmtxak=0;
}

void rd_mode_ack(void)
{
mmrw=1;
mmtxak=0;
}

void rd_mode_nack(void)
{
mmrw=1;
mmtxak=1;
}
//============================================================

void mmiic_stop(void)
{
delaying(3);
MMDTR=0xff;
slave_mode_init();
}
//============================================================
//*
void test_b_com_err(void)
{
//============================================================
b_com_err=0;
errcount++;
delaying(2);
if(errcount>120) b_com_err=1;

} 
  

/*/
void test_b_com_err(void)
{
 b_com_err=0;
 feed_dog();  
 errcount++; // there no "do" formely !
 mm=0;
 
 do
   {
    mm++;
     if (errcount>200) 
              {
              b_com_err=1; 
              break;
              }
    
    
   }while(mm<250);
  
} 
    
  */
void repeat_start(void)
{
 repsen=1;
 MMDTR=0xff;
 errcount=0; 
 do
   {
    test_b_com_err() ;
    if(b_com_err) break;
   }while(repsen==1);
 }

	
void write(uchar wr)
{

 errcount=0;
 MMDTR=wr;  
 do{
   test_b_com_err();
   if(b_com_err) break;
   }while(mmtxbe==0) ;
 mmtxif=0; 
 mmiic_2:
 asm nop;
 }

 uchar  read(void)
{

MMDTR=0xff;
errcount=0;
do{
   test_b_com_err();
   if(b_com_err) break;
}while(mmrxbf==0) ;
mmrxif=0;
mmiic_r:
asm nop;
return(MMDRR); 
}

#endif

void  interrupt MMI2C(void)
{
#ifdef smart_charger
mmien=0;
slave_mode();
slave_mode_init();
asm nop;  
#endif
}
//定义智能充电器编译开关结束

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -