/** ###################################################################
** Filename : LTC6803.C
** Project : CVM
** Processor : MC9S08DZ60CLH
** Version : Driver 01.11
** Compiler : CodeWarrior HCS08 C Compiler
** Date/Time : 2014-12-12, 09:45
** Abstract :
** Main module.
** This module contains user's application code.
** Settings :
** Contents :
** No public methods
**
** ###################################################################*/
/* MODULE CVM_V1 */
/* Including needed modules to compile this module/procedure */
#include "Events.h"
#include "PE_Types.h"
#include "PE_Error.h"
#include "PE_Const.h"
#include "DataType.h"
#include "CVM_V1.h"
#include "IO_Map.h"
#include "LTC6803.h"
#define LTC6803CLK_LOW PTED_PTED3=0 //SPI CLOCK LOW
#define LTC6803CLK_HIGH PTED_PTED3=1 //SPI CLOCK HIGH
#define DZ60_MOSI_HIGH PTED_PTED4=1 //SPI SDO HIGH FOR DZ60
#define DZ60_MOSI_LOW PTED_PTED4=0 //SPI SDO LOW FOR DZ60
#define DZ60_MISO PTED_PTED5 //SPI SDI FOR DZ60
volatile byte CFG_CRC;
volatile byte LTC6803Init_CFGData[6];//LTC6803初始化CFG数据
volatile byte LTC6803Err_Counter; //LTC6803初始化错误计数
volatile bool LTC6803Err_Flag; //LTC6803初始化错误标志位
volatile bool LTC6803_Init_OK; //LTC6803初始化结果
static byte Original_CVR1[19]; //LTC6803第一块原始的CVR数据
static byte Original_CVR2[19]; //LTC6803第二块原始的CVR数据
volatile word Cell_CVR1[12]; //LTC6803第一块计算出来的12组电压
volatile word Cell_CVR2[12]; //LTC6803第二块计算出来的12组电压
CFGR LTC68031_CFGR; //LTC6803寄存器配置数组
CFGR LTC68032_CFGR; //LTC6803寄存器配置数组
//================================================================
// us延时函数
// filename:Delay_us()
// input:us,毫秒数
// output:none
//================================================================
void Delay_us(byte us)
{
byte i;
for(i=0;i<us;i++)
{
asm
{
nop
nop
nop
nop
nop
nop
nop
nop
}
}
}
//================================================================
//函数功能:片内SPI接口操作
//filename:SPIWrite()
//input:char 读操作,输入参数0
//output:none
//================================================================
void SPIWrite(byte Data)
{
byte i;
LTC6803CLK_LOW; //Set clock line low
for(i=0;i<8;i++) //Setup byte circulation bits
{
if((Data&0x80)==0x80) //Put LTC6803_WRBUF.7 on data line
{
DZ60_MOSI_HIGH;
}
else
{
DZ60_MOSI_LOW;
}
Delay_us(2); //延时2us子程序
LTC6803CLK_HIGH; //Set clock line high
Data<<=1; //Shift DATA_BUF
Delay_us(2); //延时2us子程序
LTC6803CLK_LOW; //Set clock line low
}
}
/*
** ===================================================================
** Event : SPI读取函数
**
** Component :
** Description : 读取LTC6803上发来的数据
** Parameters : None
** Returns : Nothing
** ===================================================================
*/
byte SPIRead(void)
{
byte i;
byte DZ60_MISO_DATA;
byte LTC6803_RDATA;
LTC6803_RDATA=0; //读取数据缓存单元清零
LTC6803CLK_LOW; //Set clock line low
for(i=0;i<8;i++) //Setup byte circulation bits
{
LTC6803_RDATA<<=1; //Left shift DATA_BUF
LTC6803CLK_HIGH; //Set clock line high
DZ60_MISO_DATA=DZ60_MISO; //读取MISO引脚电平
if(DZ60_MISO_DATA==1)
{
LTC6803_RDATA|=0x01; //Read data
}
Delay_us(2); //延时2us子程序
LTC6803CLK_LOW; //Set clock line low
Delay_us(2); //延时2us子程序
}
return LTC6803_RDATA; //将读取到的数据返回给调用程序
}
//===============================================================================
// 计算CRC校验码函数;
// 输 入: 要计算数据缓冲区的起始指针pBuff,缓冲区的字节数Len;
// 输 出: CRC校验码;
// 功 能: 计算CRC校验码。
//------------------------------------------------------------------------------------------------------
//CRC算法说明:
/*校验多项式为G(X)=X8+X2+X+1,对每个控制字或信息字的前5个字节进行CRC校验,生成一个8位的余数,该余数取反
后即可作为校验码尾随前5字节发送。计算方法如下:将每个控制字或信息字中的前5个字节按从低到高的顺序排列,
每个字节的位从高到低排列,构成一个位流,在这个位流的后面加上8个0,从而得到一个48位的位流。例如,对某个信息
字有B0-B5共6个字节,每个字节8位分别为bi7-bi0(i为字节序号,取值范围0~4),则按上面的方法得到的位序列为
b07b06...b00,b17b16..b10,...,b47b47...b40,00000000,用校验多项式107H (X^8+X^2+X+1)作为除数去除这个码流,
相除时不做减法而做异或,最后得到一个8位的余数*/
//===============================================================================
byte CRC8(byte *Buf, byte Len)
{
byte i,j=0;
byte CRC = 0x41;
while(Len--!=0)
{
for(i= 0x80;i!=0;i/=2)
{
if ((CRC & 0x80)!=0)
{
CRC *= 2;
CRC ^= 0x07;
}
else
{
CRC *= 2;
}
if ((*(Buf+j) & i)!=0)
{
CRC^=0x07;
}
}
j++;
}
return CRC;
}
/*
** ===================================================================
** Event : LTC6803 init
**
** Component :
** Description :配置2个LTC6803模块,初始化OK,那么进入AD转化和采集阶段
** Parameters : None
** Returns : Nothing
** ===================================================================
*/
void LTC6803Init(void)
{
unsigned char i,Err;
LTC68031_CFGR.Bits.CDC=LTC1MeasureMode;
LTC68031_CFGR.Bits.CELL10=Cell12Mode;
LTC68031_CFGR.Bits.LVLPL=JumpPolling;
LTC68031_CFGR.Bits.GPIO1=GPIO1DropDownOpen;
LTC68031_CFGR.Bits.GPIO2=GPIO2DropDownOpen;
LTC68031_CFGR.Bits.WDT=WDTCloseMode;
LTC68031_CFGR.Bits.DCC8_1=ShutOffShortSwitch1;
LTC68031_CFGR.Bits.DCC12_9=ShutOffShortSwitch2;
LTC68031_CFGR.Bits.MCI4_1=0x00;
LTC68031_CFGR.Bits.MCI12_5=0x00;
LTC68031_CFGR.Bits.VUV=0x00;
LTC68031_CFGR.Bits.VOV=0x00; /*config LTC6803_1 all the init parameter*/
LTC68032_CFGR.Bits.CDC=LTC2MeasureMode;
LTC68032_CFGR.Bits.CELL10=Cell12Mode;
LTC68032_CFGR.Bits.LVLPL=JumpPolling;
LTC68032_CFGR.Bits.GPIO1=GPIO1DropDownOpen;
LTC68032_CFGR.Bits.GPIO2=GPIO2DropDownOpen;
LTC68032_CFGR.Bits.WDT=WDTCloseMode;
LTC68032_CFGR.Bits.DCC8_1=ShutOffShortSwitch1;
LTC68032_CFGR.Bits.DCC12_9=ShutOffShortSwitch2;
LTC68032_CFGR.Bits.MCI4_1=0x00;
LTC68032_CFGR.Bits.MCI12_5=0x00;
LTC68032_CFGR.Bits.VUV=0x00;
LTC68032_CFGR.Bits.VOV=0x00; /*config LTC6803_2 the init parameter*/
CSBI_LOW(); //LTC6803片选信号置低
SPIWrite(WRCFG); //Write configuration
Delay_us(2); //延时2us子程序
SPIWrite(WRCFG_CRC); //Write CRC
Delay_us(2); //延时2us子程序
for(i=0;i<CFGNum;i++)
{
SPIWrite(LTC68031_CFGR.Tab[i]);
}
CFG_CRC=CRC8(LTC68031_CFGR.Tab,CFGNum); //计算CFGR单元的CRC码
SPIWrite(CFG_CRC); //写CRC校验字节
Delay_us(2); //延时2us子程序
for(i=0;i<CFGNum;i++)
{
SPIWrite(LTC68032_CFGR.Tab[i]);
}
CFG_CRC=CRC8(LTC68032_CFGR.Tab,C