1. 电源配置
VA+ = +5V, VA- = 0V, VD+ = +3V~+5V
VA+ = +2.5V, VA- = -2.5V, VD+ = +3V~+5V
VA+ = +3V, VA- = -3V, VD+ = +3V
2. SCLK高电平最小值(VD+)- 0.45
3. 数字接口
方案一:VD+采用3.3V供电。
方案二:VD+采用5V供电,SCLK接上接电阻,采用开漏输出。
4. 解决问题注意方法。
5.驱动程序
////////////////////////////////////////////////////////////////////////////////
//定义
////////////////////////////////////////////////////////////////////////////////
#define GPIO_ModeAIN 0x00
#define GPIO_ModeInFloating 0x04
#define GPIO_ModeIPD 0x08
#define GPIO_ModeIPU 0x08
#define GPIO_ModeOutOD 0x06
#define GPIO_ModeOutPP 0x02
#define GPIO_ModeAFOD 0x0A
#define GPIO_ModeAFPP 0x0E
//IO
#define CS5530_CLK_H() (GPIOB->BSRR = GPIO_Pin_12)
#define CS5530_CLK_L() (GPIOB->BRR = GPIO_Pin_12)
#define CS5530_SDO_H() (GPIOB->BSRR = GPIO_Pin_13)
#define CS5530_SDO_L() (GPIOB->BRR = GPIO_Pin_13)
#define CS5530_SDI_H() (GPIOB->BSRR = GPIO_Pin_14)
#define CS5530_SDI_L() (GPIOB->BRR = GPIO_Pin_14)
#define CS5530_CS_H() (GPIOB->BSRR = GPIO_Pin_15)
#define CS5530_CS_L() (GPIOB->BRR = GPIO_Pin_15)
#define CS5530_CLK_IN() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (4<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeInFloating) << (4<<2))
#define CS5530_CLK_OUT() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (4<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeOutOD) << (4<<2))
#define CS5530_SDO_IN() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (5<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeInFloating) << (5<<2))
#define CS5530_SDO_OUT() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (5<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeOutPP) << (5<<2))
#define CS5530_SDI_IN() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (6<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeInFloating) << (6<<2))
#define CS5530_SDI_OUT() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (6<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeOutPP) << (6<<2))
#define CS5530_CS_IN() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (7<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeIPU) << (7<<2))
#define CS5530_CS_OUT() (GPIOB->CRH &= ~(((uint32_t)0x0F) << (7<<2)),GPIOB->CRH |= ((uint32_t)GPIO_ModeOutPP) << (7<<2))
#define CS5530_SDO_PIN() (GPIOB->IDR & GPIO_Pin_13 ? 1 : 0 )
//
#define CS5530_NOPS() l_Delay1us(2)
///////////////////////////////////////////////////////////////////////
//常量
///////////////////////////////////////////////////////////////////////
//命令
#define CMD_OFFSET_READ 0x09
#define CMD_OFFSET_WRITE 0x01
#define CMD_GAIN_READ 0x0A
#define CMD_GAIN_WRITE 0x02
#define CMD_CONFIG_READ 0x0B
#define CMD_CONFIG_WRITE 0x03
#define REG_CONFIG_RS 0x20000000 //系统复位
#define REG_CONFIG_RV 0x10000000 //有效复位
#define REG_CONFIG_UNIPOLAR 0x00000400 //第10位0:单极性,1:双极性
#define REG_DATA_OF 0x00000004 //溢出标志
#define CMD_CONVERSION_SIGLE 0x80
#define CMD_CONVERSION_CONTINU 0xC0
#define CMD_SYS_OFFSET_CALI 0x85
#define CMD_SYS_GAIN_CALI 0x86
#define CMD_SYNC1 0xFF
#define CMD_SYNC0 0xFE
#define CMD_NULL 0x00
/***************************************************************************************************
**函 数: static void CS5530_WriteByte(uint8_t dat)
**输入参数: @dat: 数据
**功 能: 向CS5530写1个字节
**返 回 值: 无
**其 他:
****************************************************************************************************/
static int CS5530_Get_REG_WR(uint32_t n)
{
const int tab[] = {0x04,0x03,0x02,0x01,0x00,0x0C,0x0B,0x0A,0x09,0x08};
int wr;
int r=0;
if(n<=512)
{
while(n>1)
{
n /= 2;
r++;
}
wr = tab[r];
}
else
{
wr = tab[9];
}
wr <<= 11;
return wr;
}
/***************************************************************************************************
**函 数: static void CS5530_WriteByte(uint8_t dat)
**输入参数: @dat: 数据
**功 能: 向CS5530写1个字节
**返 回 值: 无
**其 他:
****************************************************************************************************/
static void CS5530_WriteByte(uint8_t dat)
{
int i;
CS5530_CLK_L();
l_Delay1us(1);
for(i=0;i<8;i++)
{
if(dat&0x80)
{
CS5530_SDI_H();
}
else
{
CS5530_SDI_L();
}
l_Delay1us(1);
CS5530_CLK_H();
l_Delay1us(2);
CS5530_CLK_L();
l_Delay1us(1);
dat <<= 1;
}
}
/***************************************************************************************************
**函 数: static void CS5530_Write4Bytes(uint32_t dat);
**输入参数: @dat: 数据
**功 能: 向CS5530写4个字节
**返 回 值: 无
**其 他:
****************************************************************************************************/
static void CS5530_Write4Bytes(uint32_t dat)
{
int i;
uint8_t tmp;
for(i=3;i>=0;i--)
{
tmp = (uint8_t) (dat>>(8*i));
CS5530_WriteByte(tmp);
}
}
/***************************************************************************************************
**函 数: static void CS5530_Write_Reg(uint8_t reg,uint32_t dat);
**输入参数: @reg:寄存器地址 dat: 数据
**功 能: 向CS5530写寄存器
**返 回 值: 无
**其 他:
****************************************************************************************************/
static void CS5530_Write_Reg(uint8_t reg,uint32_t dat)
{
CS5530_WriteByte(reg);
CS5530_Write4Bytes(dat);
}
/****************************************************************************
* 函数原型:void WriteByt(void)
* 功能: 向CS5530写1个字节
* 参数: 无
* 返回值: 无
****************************************************************************/
uint8_t CS5530_ReadByte(void)
{
int i;
uint8_t dat=0;
CS5530_CLK_L();
l_Delay1us(1);
for(i=0;i<8;i++)
{
l_Delay1us(1);
CS5530_CLK_H();
l_Delay1us(2);
dat <<= 1;
if(CS5530_SDO_PIN())
{
dat |= 0x01;
}
else
{
dat &= 0xFE;
}
CS5530_CLK_L();
l_Delay1us(1);
}
return dat;
}
/****************************************************************************
* 函数原型:void Read4byt(void)
* 功能: 从CS5530读4个字节
* 参数: 无
* 返回值: 无
****************************************************************************/
int CS5530_Read4Bytes(void)
{
int i;
int dat=0;
for(i=0;i<4;i++)
{
dat <<= 8;
dat |= CS5530_ReadByte();
}
return dat;
}
/***************************************************************************************************
**函 数: static void CS5530_Write_Reg(uint8_t reg,uint32_t dat);
**输入参数: @reg:寄存器地址 dat: 数据
**功 能: 向CS5530写寄存器
**返 回 值: 无
**其 他:
****************************************************************************************************/
static int CS5530_Read_Reg(uint8_t reg)
{
int dat;
CS5530_WriteByte(reg);
dat = CS5530_Read4Bytes();
return dat;
}
/***************************************************************************************************
**函 数: bool CS5530_IsReady(void)
**输入参数: @
**功 能: 复位
**返 回 值: true or false
**其 他:
****************************************************************************************************/
static bool CS5530_Reset(void)
{
int i,tmp;
for(i=0;i<15;i++)
{
CS5530_WriteByte(0xff); //初始化串口
}
CS5530_WriteByte(0xfe);
l_Delay1ms(1);
CS5530_Write_Reg(CMD_CONFIG_WRITE,REG_CONFIG_RS);
l_Delay1ms(1);
tmp = CS5530_Read_Reg(CMD_CONFIG_READ); //读配置寄存器
l_Delay1ms(1);
if(tmp®_CONFIG_RV) //当配置寄存器中的RV没有置位时,表示系统没有复位
{
return true;
}
return false;
}
/***************************************************************************************************
**函 数: bool CS5530_IsReady(void)
**输入参数: @
**功 能: ad转换完成标志
**返 回 值: true or false
**其 他:
****************************************************************************************************/
static bool CS5530_IsReady(void)
{
if(CS5530_SDO_PIN()==0)
{
return true;
}
return false;
}
/****************************************************************************
* 函数原型:void Init5530IO(void)
* 功能: 初始化ADC的IO,P3.2,P3.3,P3.4,P4.3设为准双向
* 参数: 无
* 返回值: 无
****************************************************************************/
bool AD_Init(int hz)
{
int reg;
CS5530_CLK_OUT();
CS5530_CLK_L();
CS5530_SDI_OUT();
CS5530_SDI_L();
CS5530_SDO_IN();
CS5530_CS_OUT();
CS5530_CS_L();
if(CS5530_Reset()==false)
{
return false;
}
//while(1)
{
//转换率
reg = CS5530_Get_REG_WR(hz/7.5);
//双极性
CS5530_Write_Reg(CMD_CONFIG_WRITE,reg|REG_CONFIG_UNIPOLAR);
//设置为连续转换
CS5530_WriteByte(CMD_CONVERSION_CONTINU);
l_Delay1ms(1);
}
return true;
}
/***************************************************************************************************
**功 能: AD线程
**函 数: EAdStatus AD_Pthread(t_ad *ad);
**输入参数: @
**返 回 值:
**其 他:
****************************************************************************************************/
EAdStatus AD_Pthread(t_ad *ad)
{
t_ad rec_data = 0;
EAdStatus status;
if(CS5530_IsReady()==false)
{
status = E_AD_STATUS_BUSY;
}
else
{
rec_data = CS5530_Read_Reg(CMD_NULL);
if((rec_data®_DATA_OF)==0)
{
rec_data &= 0xFFFFFF00;
rec_data = l_Complement(rec_data);
*ad = rec_data >> 8;
status = E_AD_STATUS_READY;
}
else
{
status = E_AD_STATUS_OVERFLOW;
}
}
return status;
}