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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章