📄 mmiic.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 + -