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;
}