STM32&CS5530

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值