📄 i2c.#3
字号:
#include <c8051f015.h>
// SFR声明 //--------------------------------------------------------------------
// 全局常量
//--------------------------------------------------------------------
#define WRITE 0x00 // SMBus 写命令
#define READ 0x01 // SMBus 读命令
// 器件地址7位最低位没使用
#define CHIP_A 0x16 // 芯片A的器件地址
// SMBus状态
// MT = 主发送器
// MR = 主接收器
#define SMB_BUS_ERROR 0x00 // 对所有方式总线错误
#define SMB_START 0x08 // (MT & MR)起始条件已发送
#define SMB_RP_START 0x10 // (MT & MR)重复起始条件
#define SMB_MTADDACK 0x18 // (MT) 从地址 + W 已发送收到ACK
#define SMB_MTADDNACK 0x20 // (MT) 从地址 + W 已发送收到NACK
#define SMB_MTDBACK 0x28 // (MT) 数据字节已发送收到ACK
#define SMB_MTDBNACK 0x30 // (MT) 数据字节已发送收到NACK
#define SMB_MTARBLOST 0x38 // (MT) 竞争失败
#define SMB_MRADDACK 0x40 // (MR) 从地址 + R 已发送收到ACK
#define SMB_MRADDNACK 0x48 // (MR) 从地址 + W 已发送收到NACK
#define SMB_MRDBACK 0x50 // (MR) 收到数据字节ACK已发送
#define SMB_MRDBNACK 0x58 // (MR) 收到数据字节NACK已发送
#define TC_100ms 16000 // approx number of counts of 1.9MHz/12
#define MAXLEN 10;
#define OSCEN 0//0为使用外部晶振,1 为使用内部晶振
//DA
#define DAH 0x00 //DA TIMER0 high data
#define DAL 0x00 //DA TIMER0 low data
//串口
#define BAUDRATE 115200 // User-definable SW_UART baud rate
#if OSCEN
#define SYSCLK 16000000 // System clock derived from 18.432MHz XTL
#else
#define SYSCLK 24000000 // System clock derived from 18.432MHz XTL
#endif
#define RBUFSIZE 50 //定义串口缓冲区大小
#define SBUFSIZE 30 //定义串口缓冲区大小
#define ADDRESS 0 //定义串口缓冲区大小
//串口指令数据
#define CHARGE 'F'
#define UNCHARGE 'C' //WorkState(F:充电,C:放电,E:无操作,N:无电池)
#define NOPERATION 'E'
#define NOBAT 'N'
#define CONNECT 'A' //A:连接
#define NHDATA 'B' //C:无自主操作数据,应答
#define EHDATA 'D' //'D':有自主操作数据,应答
#define ACONTROL 'F'// 'F'传送动作控制代码
#define LSAMPLE 'S' //'S':采样数据
#define LCONTROL 'L' //'L':通道控制
#define GREPLY 'G' //'G':通用应答
#define HDATA 'H' //'H': 历史操作数据
#define ROMREAD 'R' //'R':读,
#define ROMWRITE 'W' //'W':写
//--------------------------------------------------------------------
//全局变量
//--------------------------------------------------------------------
struct Bat_Record // flash 中历史数据结构
{
struct Bat_Record *next;
unsigned char action;
unsigned int voltage;
unsigned int current;
unsigned int volume;
};
struct Run_Step //工步执行格式
{
//struct Bat_Record *next; //下一条记录指针
//struct Bat_Record *jmpnext; //下一条跳转到的记录指针
//unsigned char jmptimes; //跳转下一条记录次数,为0时直接执行下一个连续地址
unsigned char action;
unsigned int ref_exe;
unsigned int ref_stp;
};
char COMMAND; // 在SMBus中断服务程序中用于
// 保存从地址 + R/W 位
char WORD; // 保持SMBus要发送的数据字节
// 或刚收到的数据
char BYTE_NUMBER; // 在中用于检查发送的是什么数据
// 高地址字节低地址字节或数据字节
char RBYTE_NUMBER; // 用于检测数据是否读取完毕
unsigned char LOW_ADD; // EEPROM存储器地址的高低字节
unsigned char RECVLEN;
bit SM_BUSY; // 该位在发送或接收开始时被置1
bit Flash_Data;//表示FLASH区有否历史数据
bit Action_Control;//1表示进行动作,0表示停止
bit S_SMBUS;//1表示进行动作,0表示停止
// 操作结束后由中断服务程序清0
//sbit LED=P1^6;
unsigned char DAHIGH;
unsigned char DALOW;
sbit MODECON = P2^0; //充放电模式控制(0为放电,1为充电)
sbit CH =P1^1; //接电池CH,一般应为高电平
sbit RT =P1^0; //接电池RT,一般应为底电平
char RECVCHARS[10];
unsigned char STEP;//0表示还未写地址,1表示地址已写,2表示读到第一个字节,3表示读到第一个字节。。。
unsigned int DataSended;//串口已发送次数
xdata unsigned char RData[RBUFSIZE]_at_ 0x100; //串口接收数据缓冲区定义为30字节
idata unsigned char SData[SBUFSIZE] _at_ 0x50;
unsigned char Pos; //定义当前指向的缓冲区位置(结束位置)
unsigned char Head; //定义当前指向的缓冲区位置(起始位置)
unsigned char DataNo; //定义当前指向的缓冲区剩下数据个数
xdata struct Run_Step RunStep[50] _at_ 0x200;
unsigned char RStepNo;
unsigned char TStepNo;
unsigned char TestVar;
unsigned char TestVar1;
unsigned char TestVar2;
unsigned char TestVar3;
unsigned char TestVar4;
unsigned char TestVar5;
unsigned char TestVar6;
unsigned char RECVTIMES;
unsigned char Edition=49;
unsigned char WorkType='C';
//下面是不断从电池智能芯片中取得值
unsigned int RfrhTms;
unsigned int Current;
unsigned int Voltage;
unsigned int VolumeRatio;
unsigned int TimeRemain;
// <CurrentLow>+<CurrentHigh>(2)+<VoltageLow>+<VoltageHigh>(2)
// + VolumeRatio(2) + TimeRemain(2)]
//--------------------------------------------------------------------
// 函数原型
//--------------------------------------------------------------------
void SMBus_ISR (void);
void SM_Send (char chip_select, unsigned int byte_address, char out_byte);
void SM_Receive (char chip_select, unsigned char byte_address,unsigned char byte_length);
void RBuf (void) ;
void DAC_Init(void);
void Timer0_ISR (void);
void Timer2_ISR (void);
void Timer3_ISR (void);
void Sys_Init(void);
void Var_Init(void);
unsigned char OutCheckSum(void);
unsigned char RBufJudge();
unsigned char DoWithCommand(void);
void delay(int time);
//-----------------------------------------------------------------------------
void ReadFlash(void);
void WriteFlash(void);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -