#include"LTC6804.h"
#include"SPI.h"
#include"TIME.h"
static uint PEC15_Table[256]; // PEC15表声明
static uint CRC15poly = 0x4599; // 计算因子
void delay(void)
{
uint i;
for(i=0;i<200;i++);
}
/**********************************************************************************\
唤醒
\**********************************************************************************/
void WakeUp_idle(void)
{ //唤醒进入工作spi通信
SPI_CSB=0;
delay();
SPI_CSB=1;
}
/**********************************************************************************\
PEC15表初始化
\**********************************************************************************/
void PEC15_TABLE_Init(void)
{
int i,j;
int remainder;
for (i = 0; i < 256; i++)
{
remainder = i << 7;
for (j = 8; j > 0; --j)
{
if (remainder & 0x4000)
{
remainder = remainder << 1;
remainder = remainder ^ CRC15poly; //异或运算
}
else
{
remainder = remainder << 1;
}
}
PEC15_Table[i] = remainder&0x7FFF;
}
}
/**********************************************************************************\
PEC15表值计算 (CRC)校验相似
\**********************************************************************************/
int PEC_COUNT(int len,uchar *data) //PEC计算
{
int remainder,address;
int i; //一个字节一个字节的计算,先拿前面一个字节异或得到15位PEC码,
//再拿前面八位与下一个字节异或后再次求PEC码,直到所有字节计算完毕为此
remainder = 0x0010;
for (i = 0; i < len; i++)
{
address = ((remainder >> 7) ^ data[i]) & 0x00ff;
remainder = (remainder << 8 ) ^ PEC15_Table[address];
}
remainder=remainder<<1;
return (remainder);
}
/**********************************************************************************\
给LTC6804写入一个指令
\**********************************************************************************/
void SEND_DATA(int cmd)
{
uchar dat[4];
int pec,i;
dat[0]=(uchar)(cmd>>8);
dat[1]=(uchar)cmd;
pec=PEC_COUNT(2,dat);
dat[2]=(uchar)(pec>>8);
dat[3]=(uchar)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(dat[i]);
}
}
/**********************************************************************************\
给LTC6804写CFG寄存器
\**********************************************************************************/
void WRITE_WRCFG(void)
{
uchar dat[4], CFGR[8]={4,0,0,0,0,0,0,0};
int i,pec,j;
pec=PEC_COUNT(6,CFGR);
CFGR[6]=(char)(pec>>8);
CFGR[7]=(char)pec;
SPI_CSB=0;
dat[0]=0x00;
dat[1]=0x01;
pec=PEC_COUNT(2,dat);
dat[2]=(char)(pec>>8);;
dat[3]=(char)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(dat[i]);
}
for(i=0;i<LTC6804_ICNUM;i++)
{
for(j=0;j<8;j++)
{
SPI1_SEND(CFGR[j]);
}
delay();
}
SPI_CSB=1;
}
/**********************************************************************************\
读LTC6804CFG寄存器
\**********************************************************************************/
void READ_RDCFG(uchar *LTC6804_CFG)
{
uchar dat[4], CFGR[8];
uint i,pec,NUM;
SPI_CSB=0;
dat[0]=0x00;
dat[1]=0x02;
pec=PEC_COUNT(2,dat);
dat[2]=(char)(pec>>8);;
dat[3]=(char)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(dat[i]);
}
SPI1_SEND(0X00);
i=SPI1_RECIEV();
for(NUM=0;NUM<LTC6804_ICNUM;NUM++)
{
for(i=0;i<8;i++)
{
SPI1_SEND(0X00);
CFGR[i]=SPI1_RECIEV();
}
pec=PEC_COUNT(6,CFGR);
if(pec==(((uint)CFGR[6])<<8)+CFGR[7])
{
for(i=0;i<6;i++)
{
*(LTC6804_CFG+NUM*6+i)=CFGR[i];
}
}
}
SPI_CSB=1;
}
/**********************************************************************************\
清除电池AD转换寄存器
\**********************************************************************************/
void CLEAR_RDCV(void)
{
uint i,pec;
uchar dat[4]={0x07,0x11,0x00,0x00};
pec=PEC_COUNT(2,dat);
dat[2]=(char)(pec>>8);
dat[3]=(char)pec;
SPI_CSB=0;
for(i=0;i<4;i++)
{
SPI1_SEND(dat[i]);
}
delay();
SPI_CSB=1;
}
/**********************************************************************************\
清除辅助寄存器
\**********************************************************************************/
void CLEAR_RDAUX(void)
{
uint i,pec;
uchar cmd[4]={0x07,0x12,0,0};
SPI_CSB=0;
pec=PEC_COUNT(2,cmd);
cmd[2]=(char)(pec>>8);
cmd[3]=(char)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(cmd[i]);
}
delay();
SPI_CSB=1;
}
void ADCV_GPIO(void)
{
uchar cmd[4];
uint pec,i;
SPI_CSB=0;
cmd[0]=0x05;
cmd[1]=0x6f;
pec=PEC_COUNT(2,cmd);
cmd[2]=(char)(pec>>8);
cmd[3]=(char)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(cmd[i]);
}
delay();
SPI_CSB=1;
}
/**********************************************************************************\
电池AD转换模式设置
\**********************************************************************************/
void ADCV(int MD,int DCP,int CH) //MD选择工作频率,DCP为放电允许位1为放电允许,CH为转换的电池选择000为全选
{
uchar cmd[4];
uint pec,i;
SPI_CSB=0;
cmd[0]=(uchar)((0x02&MD)>>1)|0X02;
cmd[1]=(uchar)((0x01&MD)<<7)+0X60+(DCP<<4)+CH;
pec=PEC_COUNT(2,cmd);
cmd[2]=(char)(pec>>8);
cmd[3]=(char)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(cmd[i]);
}
delay();
SPI_CSB=1;
}
/**********************************************************************************\
读取某一个电池AD转换寄存器
\**********************************************************************************/
void READ_RDCV(int rdcv, uint *LTC6804_RDCV) //num为芯片数量,rdcv为读寄存器指令
{
uchar cmd[4],RDCV[8];
uint pec,L,i,j,NUM,temp;
SPI_CSB=0;
switch(rdcv)
{
case 0x04: cmd[0]=0x00;cmd[1]=0x04;L=0;break; //寄存器A
case 0x06: cmd[0]=0x00;cmd[1]=0x06;L=1;break; //寄存器B
case 0x08: cmd[0]=0x00;cmd[1]=0x08;L=2;break; //寄存器C
case 0x0a: cmd[0]=0x00;cmd[1]=0x0a;L=3;break; //寄存器D
default: break;
}
pec=PEC_COUNT(2,cmd);
cmd[2]=(char)(pec>>8);
cmd[3]=(char)pec;
for(i=0;i<4;i++)
{
SPI1_SEND(cmd[i]);
}
delay();
i=SPI1_RECIEV();
for(NUM=0;NUM<LTC6804_ICNUM;NUM++)
{
for(i=0;i<8;i++)
{
SPI1_SEND(0X00);
RDCV[i]=SPI1_RECIEV();
}
for(j=0;j<3;j++)
{
temp=(uint)((RDCV[2*j+1])<<8)+(RDCV[2*j]);
temp=(temp+5)/10;
*(LTC6804_RDCV+12*NUM+3*L+j)=temp;
}
}
SPI_CSB=1;
}
/**********************************************************************************\
读取所有电池AD转换寄存器
\**********************************************************************************/
void READ_RDCVALL(uint *LTC6804_RDCV)
{
uchar cmd[4],RDCV[8],tab[4]={0x04,0x06,0x08,0x0a};
uint pec,i,j,L,NUM,temp;
for(L=0;L<4;L++)
{
SPI_CSB=0;
cmd[0]=0x00;
cmd[1]=tab[L];
pec=PEC_COUNT(2,cmd);
cmd[2]=(char)(pec>>8);
cmd[3]=(char)pec;
for(i=0;i<4;i++)
35738618LTC6804.rar_LTC6804_LTC6811_unhappynpp
版权申诉
120 浏览量
2022-07-14
19:36:27
上传
评论
收藏 4KB RAR 举报
小波思基
- 粉丝: 72
- 资源: 1万+
最新资源
- 7777端口抓包数据集
- IMG_0694.GIF
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
- 基于Python+OpenCV对多张图片进行全景图像拼接,消除鬼影,消除裂缝+源代码+文档说明+界面截图(高分课程设计)
- 基于C++实现的全景图像拼接源码(课程设计)
- 基于SIFT特征点提取和RASIC算法实现全景图像拼接python源码+文档说明+界面截图+详细注释(95分以上课程大作业)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0