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
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: CS5530是一款集成多功能电能表芯片,而 STM32 是意法半导体(STMicroelectronics)推出的一系列32位微控制器产品线。 CS5530芯片具有广泛的应用领域,可以用于电力计量、电能质量分析、电力监测等方面。它采用了大量的数字信号处理(DSP)技术,能够快速而精准地测量电流和电压,并通过相关算法计算出电能、功率因数、谐波等相关参数。它还支持RS485和SPI通信接口,便于与外部设备进行数据交互。 而STM32系列微控制器则是一款功能强大、性能优越的32位嵌入式微控制器产品线。它采用了ARM Cortex-M内核,具有高速、低功耗和丰富的外设资源,适用于各种应用场景,包括工业自动化、消费类电子产品、医疗设备等。 相比于传统的8位或16位微控制器,STM32的处理能力更强,具有更大的存储空间和更多的外设资源,能够更好地满足复杂系统的需求。它还支持多种编程语言和开发工具,方便开发人员进行软件编程和调试。 综上所述,CS5530是一款电能表芯片,而STM32则是一款32位微控制器产品线。它们分别从硬件和软件的角度,为电力计量和嵌入式系统提供了可靠、高性能的解决方案。 ### 回答2: CS5530是一款基于STM32微控制器平台的芯片。STM32系列是意法半导体(STMicroelectronics)公司推出的一系列32位ARM Cortex-M内核的微控制器产品。 CS5530集成了强大的处理器核心、丰富的外设和广泛的存储器,可以满足广泛的应用需求。它拥有较高的性能和低功耗的特性,并且易于开发和使用。 CS5530的关键特性包括: 1. 32位ARM Cortex-M内核:提供高性能和低功耗的处理能力。 2. 丰富的外设:包括通用串行接口、通用定时器、串行外设接口等,满足各种外设连接和通信需求。 3. 大容量存储器:可选配不同大小的闪存和RAM,使得芯片能够存储和处理大量的数据。 4. 丰富的开发工具和支持:意法半导体提供了完善的软件开发工具和技术支持,便于开发者进行开发和调试。 由于CS5530是基于STM32平台的,因此还可以享受到STM32系列微控制器的许多优势,例如广泛的生态系统、丰富的代码库、灵活的软件开发环境等。 总的来说,CS5530是一款功能强大、性能稳定的微控制器芯片,适用于各种嵌入式系统和物联网应用。它的特性和优势使得开发者可以更加轻松地实现各种功能和创新,促进了嵌入式系统的发展和应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值