📄 cs5529.c
字号:
/*========================================================/
/ /
/ Copyright (C), 2001-2005, Pangu Automation. Co., Ltd. /
/ FileName: CS5529.c /
/ Author: Zheng M.D. /
/ Version: 1.0 /
/ Date: 2005.11.12 /
/ Description: CS5529驱动程序 /
/ Modify: /
/ /
/========================================================*/
#include <reg52.h>
#include "include/CS5529.h"
#include "include/time.h"
/**********************************************************************
CS5529的全局变量定义
**********************************************************************/
/***********************************************
Offset与 Gain寄存器共用一个变量
***********************************************/
unsigned char idata CS5529_OffetGainReg[3];
/***********************************************
配置寄存器变量
***********************************************/
unsigned char bdata CS5529_ConfigReg[3];
/***********************************************
转换数据寄存器变量
***********************************************/
unsigned char bdata CS5529_DataReg[3];
/**********************************************************************
CS5529的配置位定义
**********************************************************************/
//Low Power Mode(0:Normal Mode 2.5mW;1:Reduced Power Mode 1mW)
sbit __CS5529_CONFIG_LPM = CS5529_ConfigReg[0]^0;
//Unipolar/Bipolar(0:Bipolar;1:Unipolar)
sbit __CS5529_CONFIG_UB = CS5529_ConfigReg[1]^4;
//Reset System(0:Normal;1:复位系统,复位完后将RS位置0返回正常模式)
sbit __CS5529_CONFIG_RS = CS5529_ConfigReg[2]^7;
//Reset Valid(0:没有复位产生;1:已经产生影响有效的复位)
sbit __CS5529_CONFIG_RV = CS5529_ConfigReg[2]^6;
//Port Flag(0:Port Flag Mode Inactive此时通过查询配置寄存器的DF标志位判断数据转换是否完成;
//1:Port flag Mode active 此时能过查询SDO线判断数据转换是否完成)
sbit __CS5529_CONFIG_PF = CS5529_ConfigReg[2]^5;
//Power Save Select(0:标准模式,时钟正常;1:睡眠模式,时钟关闭
sbit __CS5529_CONFIG_PSS = CS5529_ConfigReg[2]^4;
//Done Flag (1:校准或者数据转换完成)
sbit __CS5529_CONFIG_DF = CS5529_ConfigReg[2]^3;
/**********************************************************************
CS5529的数据位定义
**********************************************************************/
//数据溢出
sbit __CS5529_DATA_OF = CS5529_DataReg[2]^0;
//振荡检测,当输入大大的超出范围(-2.5V~+2.5V)时,置位,此时的转换是不正确的
sbit __CS5529_DATA_OD = CS5529_DataReg[2]^1;
/*************************************************
//函 数 名: CS5529_WriteCmd(unsigned char nCmd)
//功 能: CS5529写命令子程序
//输入参数: nCmd(unsigned char)命令字
//返 回 值: 无
//备 注:
*************************************************/
void CS5529_WriteCmd(unsigned char nCmd)
{
unsigned char i;
__CS5529_SCLK = 0;
for(i = 0; i < 8; i++)
{
if(nCmd&0x80) //低电平写数据,高电平读数据
{
__CS5529_SDI=1;
}
else
{
__CS5529_SDI=0;
}
delay_us(CS5529_DELAY); //光偶廷时
__CS5529_SCLK = 1;
delay_us(CS5529_DELAY);
__CS5529_SCLK = 0;
nCmd <<= 1;
}
delay_us(CS5529_DELAY);
}
/*************************************************
//函 数 名: CS5529_WriteReg(unsigned char nReg)
//功 能: CS5529写寄存器值子程序
//输入参数: nReg(unsigned char)寄存器编址
//返 回 值: 无
//备 注: 数据来源CS5529_OffetGainReg,
CS5529_ConfigRega.
调用些子程序前要先调用WriteCmd写入写数据命令
*************************************************/
void CS5529_WriteReg(unsigned char nReg)
{
unsigned char idata *pWriteData;
unsigned char i,j,temp;
//不同的寄存器选择不同的内存
if((nReg==CS5529_REG_OFFSET)||(nReg==CS5529_REG_GAIN))
{
pWriteData=CS5529_OffetGainReg;
}
if(nReg==CS5529_REG_CONFIGURATION)
{
pWriteData=CS5529_ConfigReg;
}
if(nReg==CS5529_REG_DATA)
{
pWriteData=CS5529_DataReg;
}
//写数据,24个时钟周期
for(j=0;j<3;j++)
{
temp=*(pWriteData+j);
for(i = 0; i < 8; i++)
{
if(temp&0x80)
{
__CS5529_SDI=1;
}
else
{
__CS5529_SDI=0;
}
delay_us(CS5529_DELAY);
__CS5529_SCLK = 1;
delay_us(CS5529_DELAY);
__CS5529_SCLK = 0;
temp<<= 1;
}
}
delay_us(CS5529_DELAY);
//__CS5529_CS=1;
}
/*************************************************
//函 数 名: CS5529_ReadReg(unsigned char nReg)
//功 能: CS5529读寄存器值子程序
//输入参数: nReg(unsigned char)寄存器编址
//返 回 值: 无
//备 注: 读上来的数据保存在CS5529_OffetGainReg,
CS5529_ConfigRega或CS5529_DataReg;
分别对应寄存器.
调用些子程序前要先调用WriteCmd写入读数据命令
*************************************************/
void CS5529_ReadReg(unsigned char nReg)
{
unsigned char idata *pWriteData;
unsigned char i,j,temp;
//不同的寄存器选择不同的内存
if((nReg==CS5529_REG_OFFSET)||(nReg==CS5529_REG_GAIN))
{
pWriteData=CS5529_OffetGainReg;
}
if(nReg==CS5529_REG_CONFIGURATION)
{
pWriteData=CS5529_ConfigReg;
}
if(nReg==CS5529_REG_DATA)
{
pWriteData=CS5529_DataReg;
}
//读数据,24个时钟周期
for(j=0;j<3;j++)
{
temp=0x00;
for(i = 0; i < 8; i++)
{
__CS5529_SCLK = 1; //低电平写数据,高电平读数据
delay_us(CS5529_DELAY);
temp<<=1;
if(__CS5529_SDO)
{
temp|=0x01;
}
__CS5529_SCLK = 0;
delay_us(CS5529_DELAY);
}
*(pWriteData+j)=temp;
}
delay_us(CS5529_DELAY);
//__CS5529_CS=1;
}
/*************************************************
//函 数 名: CS5529_SyncSeq(
//功 能: SPI初始化序列
//输入参数: 无
//返 回 值: 无
//备 注:
*************************************************/
void CS5529_SyncSeq()
{
unsigned char i;
//__CS5529_CS=0;
for(i=0;i<16;i++)
{
CS5529_WriteCmd(CS5529_CMD_SYNC1);//最少15个SYNC1("11111111")序列
}
CS5529_WriteCmd(CS5529_CMD_SYNC0); //以1个SYNC0("11111110")序列结束
//__CS5529_CS=1;
}
/*************************************************
//函 数 名: CS5529_StartupDelay()
//功 能: 上电后延时子程序
//输入参数: 无
//返 回 值: 无
//备 注: CS5529在上电后必需延时500ms.
*************************************************/
void CS5529_StartupDelay()
{
unsigned char i,j;
for(j=0;j<50;j++)
{
for(i=0;i<50;i++)
{
delay_us(200);
}
}
}
/*************************************************
//函 数 名: CS5529_Reset()
//功 能: 复位子函数
//输入参数: 无
//返 回 值: 无
//备 注:
*************************************************/
void CS5529_Reset()
{
/*将配置寄存器的RS位置1并写入CS5529*/
__CS5529_CONFIG_RS=1;
CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
CS5529_WriteReg(CS5529_REG_CONFIGURATION);
/*读配置寄存器直到RV标志位等于1*/
do{
CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
CS5529_ReadReg(CS5529_REG_CONFIGURATION);
}while(__CS5529_CONFIG_RV!=1);
/*清除RS位,回到命令模式*/
__CS5529_CONFIG_RS=0;
CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
CS5529_WriteReg(CS5529_REG_CONFIGURATION);
/*再次读CS5529的状态*/
CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
CS5529_ReadReg(CS5529_REG_CONFIGURATION);
}
/*************************************************
//函 数 名:CS5529_Init()
//功 能:初始化CS5529
//输入参数:无
//返 回 值:无
//备 注:
*************************************************/
void CS5529_Init()
{
__CS5529_SDO=1;
CS5529_Selected();//选择CS5529(本系统中CS5529的SPI总线是独立的,所以一直选中)
CS5529_StartupDelay(); //初始化廷时
CS5529_SyncSeq();//初始化SPI总线
CS5529_Reset();//复位CS5529
CS5529_SetPortFlag();//设置成Porg Flag模式,通过SDO判断是否完成校准或者数据转换
CS5529_SelfCalibration(CS5529_OFFSET_SELF_CALIBRATION); //自我校准
CS5529_SetWordRate(CS5529_WORD_RATE_15);//设置每秒转换次数
//CS5529_LatchOutputs(6);//输出数字量
//CS5529_SetGain(0); //设置内部放大陪数
}
/*************************************************
//函 数 名:CS5529_SetPortFlag()
//功 能:设置为PortFlag模式
//输入参数:无
//返 回 值:无
//备 注:
*************************************************/
void CS5529_SetPortFlag()
{
__CS5529_CONFIG_PF=1; //Port Flag有效
CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
CS5529_WriteReg(CS5529_REG_CONFIGURATION);
delay_us(120);
CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
CS5529_ReadReg(CS5529_REG_CONFIGURATION);
}
/*************************************************
//函 数 名:CS5529_SelfCalibration(unsigned char Type)
//功 能:自校准
//输入参数:Type(unsigned char)自校准类型
//返 回 值:无
//备 注:自校准类型由CS5529.h预定义
*************************************************/
void CS5529_SelfCalibration(unsigned char Type)
{
CS5529_ConfigReg[2]|=Type; //ConfigReg的0~2位是校准类型
CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
CS5529_WriteReg(CS5529_REG_CONFIGURATION);
//等待校准完成
//当SDO=0时退出等待
//在调用该子程序前应先将PorgFlag设为有效
while(__CS5529_SDO==1){}
delay_us(120);
CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
CS5529_ReadReg(CS5529_REG_CONFIGURATION);
}
/*************************************************
//函 数 名:CS5529_SetWordRate(unsigned char wordrate)
//功 能:设置转换速率
//输入参数:wordrate(unsigned char)每秒转换次数
//返 回 值:无
//备 注:转换速率由头文件CS5529.h预定义
*************************************************/
void CS5529_SetWordRate(unsigned char wordrate)
{
CS5529_ConfigReg[1]|=wordrate; //ConfigReg的13~15设置转换速率
CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_CONFIGURATION);
CS5529_WriteReg(CS5529_REG_CONFIGURATION);
delay_us(120);
CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
CS5529_ReadReg(CS5529_REG_CONFIGURATION);
//delay_us(120);
}
/*************************************************
//函 数 名:CS5529_LatchOutputs(unsigned char outputs)
//功 能:CS5529的4个开关量输出,用于选择模拟开关通道
//输入参数:outputs(unsigned char)开关量
//返 回 值:无
//备 注:
************************************************
void CS5529_LatchOutputs(unsigned char outputs)
{
outputs=outputs<<2;
CS5529_ConfigReg[0]|=outputs;
delay_us(120);
CS5529_WriteCmd(CS5529_CMD_READ_REG|CS5529_REG_CONFIGURATION);
CS5529_ReadReg(CS5529_REG_CONFIGURATION);
//delay_us(120);
}*/
/*************************************************
//函 数 名:CS5529_SetGain(unsigned char GainIndex)
//功 能:设定放大倍数
//输入参数:GainIndex (unsigned char)
//返 回 值:无
//备 注:放大倍数由表格给出,能过索引获取GainReg值
************************************************
void CS5529_SetGain(unsigned char GainIndex)
{
CS5529_OffetGainReg[0]=GainTable[GainIndex][0];
CS5529_OffetGainReg[1]=GainTable[GainIndex][1];
CS5529_OffetGainReg[2]=GainTable[GainIndex][2];
CS5529_WriteCmd(CS5529_CMD_WRITE_REG|CS5529_REG_GAIN);
CS5529_WriteReg(CS5529_REG_GAIN);
}*/
/*************************************************
//函 数 名:CS5529_SingleConversion()
//功 能:进行一次转换
//输入参数:无
//返 回 值:无
//备 注:
*************************************************/
void CS5529_SingleConversion()
{
CS5529_WriteCmd(CS5529_CMD_SINGLE_CONVERSION);
//等待转换完成
//当SDO=0时退出等待
//在调用该子程序前应先将PorgFlag设为有效
while(__CS5529_SDO==1){}
CS5529_WriteCmd(CS5529_CMD_NULL);
CS5529_ReadReg(CS5529_REG_DATA);
//__CS5529_DATA_SIG=~__CS5529_DATA_SIG;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -