[原创] 分享下基于STM32F030+CS5530的驱动设计
6102 查看
6 回复
 楼主 | 发布于 2018-09-25 | 只看楼主
分享到:

做CS5530的驱动的时候,发现好多网上的代码不全,这个底层驱动基本都是自己写的,可以完美驱动CS5530,常用的寄存器配置都做了宏的定义。可以完美移植到其他MCU中。


#ifndef	__CS5530_H
#define	__CS5530_H

#include	"config.h"
#include 	<intrins.h>
#include	"delay.h"
#include	"uart.h"

//引脚的定义
sbit CS5530_SDI = P1^3;
sbit CS5530_SDO = P1^4;
sbit CS5530_SCK = P1^5;


#define CS5532_SCK_RESET() CS5530_SCK = 0
#define CS5532_SCK_SET()   CS5530_SCK = 1
#define CS5532_SDI_RESET() CS5530_SDI = 0
#define CS5532_SDI_SET()   CS5530_SDI = 1
#define TEST_CS5532_SDO()  (CS5530_SDO)
#define CS5532_CS_RESET()  //CS5530_CS = 0
#define CS5532_CS_SET()   //CS5530_CS = 1


// Command Register命令寄存器的定义
#define  SYNC1               0xff
#define  SYNC0               0xfe
#define  NULL_BYTE           0x00

#define  CMD_WRITE           (0x00<<3)//写指令
#define  CMD_READ            (0x01<<3)//读指令
 
#define  REG_OFFSET          0x01   //偏移寄存器
#define  REG_GAIN            0x02   //增益寄存器
#define  REG_CONFIG          0x03   //配置寄存器
 
 
#define  START_SINGLE        (0x00<<6) //单次转换
#define  START_CONTINUOUS    (0x01<<6)//连续转换
 
#define  NORMAL_CONVERSION   (0x80+0x00)//转换命令,格式为转换命令+单次转换,转换命令+连续转换
#define  SYSTEM_OFFSET_CAL   (0x80+0x05)//执行偏移校准
#define  SYSTEM_GAIN_CAL     (0x80+0x06)// 执行增益校准

// Configuration Register
//配置寄存器
#define  STANDBY_MODE        (0x00L<<31)//待机模式
#define  SLEEP_MODE          (0x01L<<31)//休眠模式
#define  POWER_SAVE_MODE     (0x01L<<30)  //节电模式
 
#define  NORMAL_MODE         (0x00L<<29)    //正常操作
#define  SYSTEM_RESET        (0x01L<<29)  //激活一个复位周期,复位后自动清零
 
#define  RESET_STATUS        (0x01L<<28)   //复位指令
 
#define  NORMAL_INPUTS        (0x00L<<27)   //正常输入
#define  SHORT_INPUTS        (0x01L<<27)   //短路输入
 
#define  VREF_HIGH           (0x00L<<25)  //参考电压大于2.5V
#define  VREF_LOW            (0x01L<<25)//参考电压1-2.5V
 
#define  CR_A1_0             (0x00L<<24)
#define  CR_A1_1             (0x01L<<24)
 
#define  CR_A0_0             (0x00L<<23)
#define  CR_A0_1             (0x01L<<23)
 
#define  LINE_FREQ_60        (0x00L<<19)  //滤波速率选择,缺省输入字
#define  LINE_FREQ_50        (0x01L<<19)  //乘以5/6
 
#define  DATARATE_100        (0x00L<<11)   //
#define  DATARATE_50         (0x01L<<11)
#define  DATARATE_25         (0x02L<<11)
#define  DATARATE_12P5       (0x03L<<11)
#define  DATARATE_6P25       (0x04L<<11)
#define  DATARATE_3200       (0x08L<<11)
#define  DATARATE_1600       (0x09L<<11)
#define  DATARATE_800        (0x0aL<<11)
#define  DATARATE_400        (0x0bL<<11)
#define  DATARATE_200        (0x0cL<<11)
 
#define  BIPOLAR_MODE        (0x00L<<10)  //双极性模式
#define  UNIPOLAR_MODE       (0x01L<<10)//单极性模式
 
#define  TURN_OFF_300NA       (0x00L<<9)  //
#define  TURN_ON_300NA       (0x01L<<9)  //

//增益寄存器
#define  GAIN_32        (0x01L<<29) 
#define  GAIN_16        (0x01L<<28) 
#define  GAIN_8        (0x01L<<27)
#define  GAIN_4        (0x01L<<26)
#define  GAIN_2        (0x01L<<25)
#define  GAIN_1        (0x01L<<24)
#define  GAIN_20        GAIN_16+GAIN_4
#define  GAIN_10        GAIN_8+GAIN_2

void cs5530_init(void);
extern int32_t ReadCs5530AD(void);
uint8_t ReadCs5530Byte(void);
void WriteCs5530Byte(uint8_t da);
void WriteCs5530Dword(uint32_t da);
#endif
#include	"cs5530.h"



/**********************************************************************************************
// 函数: static void WriteCs5530Byte(uint8_t da)
// 描述: 给CS5530写1个字节的数据
// 参数: 给CS5530写入的数据,1个字节
// 返回: non
// 说明: non
// 版本: V1.0, 2018-08-16
************************************************************************************************/
void WriteCs5530Byte(uint8_t da)   
{     
  uint8_t loop;
	CS5532_SCK_RESET();
	for(loop=0;loop<8;loop++)
	{
		if(da&0x80)
    {
      CS5532_SDI_SET();//00100000
    }
    else
    {
      CS5532_SDI_RESET();      
    }      
    da=da<<1;
    CS5532_SCK_SET(); 
    _nop_();
    _nop_();    
    CS5532_SCK_RESET();
    _nop_();
    _nop_();    
	}
}
/**********************************************************************************************
// 函数: static uint8_t ReadCs5530Byte(void)  
// 描述: CS5530读出一个字节的数据
// 参数: non
// 返回: CS5530读出的一个字节数据
// 说明: non
// 版本: V1.0, 2018-08-16
************************************************************************************************/
uint8_t ReadCs5530Byte(void)   
{     
  uint8_t loop,da;
	CS5532_SCK_RESET();
	for(loop=0;loop<8;loop++)
	{    
    da=da<<1;
    da=da|TEST_CS5532_SDO();
    CS5532_SCK_SET(); 
    _nop_();
    _nop_();    
    CS5532_SCK_RESET();
    _nop_();
    _nop_();    
	}
  return da;
}
/**********************************************************************************************
// 函数: static void WriteCs5530Dword(uint32_t da)  
// 描述: 给CS5530写4个字节的数据
// 参数: 给CS5530写入的数据,long类型,32位数据
// 返回: non
// 说明: non
// 版本: V1.0, 2018-08-16
************************************************************************************************/
void WriteCs5530Dword(uint32_t da)      
{ 
    union type1
    {
        uint8_t ch[4];
        uint32_t lon;
    };
   union type1 temp;
   temp.lon= da;
   WriteCs5530Byte(temp.ch[0]);
   WriteCs5530Byte(temp.ch[1]);
   WriteCs5530Byte(temp.ch[2]);
   WriteCs5530Byte(temp.ch[3]);
}
/**********************************************************************************************
// 函数: static uint32_t ReadCs5530(void)
// 描述: 读取CS5530的数据
// 参数: 32位的寄存器数据
// 返回: non
// 说明: non
// 版本: V1.0, 2018-08-16
************************************************************************************************/
int32_t ReadCs5530AD(void)  
{
  uint8_t loop;
  uint32_t da;
	CS5532_SCK_RESET();
  _nop_();
  _nop_(); 
//  WriteCs5530Byte(NORMAL_CONVERSION+START_SINGLE);//单次转换
  while(TEST_CS5532_SDO() == 1);//SDO为0的时候表示转换完成

  WriteCs5530Byte(NULL_BYTE);//发送8个NULL数据清到SDI引脚清SDO数据
  for(loop=0;loop<32;loop++)
  {
    da=da<<1;
    da=da|TEST_CS5532_SDO();
    CS5532_SCK_SET(); 
    _nop_();
    _nop_();    
    CS5532_SCK_RESET();
    _nop_();
    _nop_();    
  }
  da = da>>14;//取18位有效数字
  return(da);
}
/**********************************************************************************************
// 函数: static void cs5532_init(void)
// 描述: CS5530的初始化,固定速度为15sps
// 参数: non
// 返回: non
// 说明: non
// 版本: V1.0, 2018-08-16
************************************************************************************************/
void cs5530_init(void)
{
  uint8_t loop;
  
  //延时20ms,等待晶振启动
  delay_ms(20);
  CS5532_SDI_RESET();
  CS5532_SCK_RESET();

  //发送ADC串口复位指令,初始化ADC到可访问状态
  //发送SYNC1命令字,至少15个,这里发送30个
	for (loop=0;loop<30;loop++)
  {
    WriteCs5530Byte(SYNC1);
  }	
  //发送一个SYNC0命令字
	WriteCs5530Byte(SYNC0);	
	//启动系统复位
  WriteCs5530Byte(CMD_WRITE+REG_CONFIG);//写配置寄存器
  WriteCs5530Dword(SYSTEM_RESET);//写复位指令
  delay_ms(20); //直接延时,不进行复位成功的循环检测 
  
//  复位后读取配置寄存器的时候需要连续读两次,第一次RV为1,第二次RV为0
//  WriteCs5530Byte(CMD_READ+REG_CONFIG);//读配置寄存器
//  SendByte(ReadCs5530Byte());
//  SendByte(ReadCs5530Byte());
//  SendByte(ReadCs5530Byte());
//  SendByte(ReadCs5530Byte());
  WriteCs5530Byte(CMD_WRITE+REG_CONFIG);//写配置寄存器
  WriteCs5530Dword(NORMAL_MODE|DATARATE_12P5|UNIPOLAR_MODE);//正常操作,FRS=0,速度15sps,单极性模式
//  WriteCs5530Dword(SHORT_INPUTS|DATARATE_12P5|UNIPOLAR_MODE);//正常操作,FRS=0,速度15sps,单极性模式
  WriteCs5530Byte(NORMAL_CONVERSION+START_CONTINUOUS);//连续转换
  
}


(0 ) (0 )
回复 举报

回复于 2018-09-25 沙发

感谢分享
(0 )
评论 (0) 举报

回复于 2018-09-25 2#

谢谢分享!!!!!!!
(0 )
评论 (0) 举报

回复于 2018-09-26 3#

(0 )
评论 (0) 举报

回复于 2018-09-27 4#

支持一下,需要机器人方案的。硬件电路设计,软件编程,APP开发。机械臂非标自动化设计的,请联系我!
(0 )
评论 (0) 举报

回复于 2018-09-30 5#

谢谢分享                
(0 )
评论 (0) 举报

回复于 2019-05-12 6#

w345345635
(0 )
评论 (0) 举报
  • 发表回复
    0/3000





    举报

    请选择举报类别

    • 广告垃圾
    • 违规内容
    • 恶意灌水
    • 重复发帖

    全部板块

    返回顶部