我是靠谱客的博主 愤怒心情,最近开发中收集的这篇文章主要介绍ADS1247使用例程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ADS1247 STM32使用例程

文件:ADS1247.h

#include "stm32f10x.h"

#define   WAKEUP       0x00  //Exit sleep mode 
#define   SLEEP        0x02  //Enter sleep mode
#define   SYNC         0x04  //Synchronize the A/D conversion
#define   RESET        0x06  //Reset to power-up values
#define   NOP          0xff  //No operation
#define   RDATA        0x12  //Read data once 
#define   RDATAC       0x14  //Read data continuously
#define   SDATAC       0x16  //Stop reading data continuously
#define   RREG         0x20  //Read from register rrrr 0010 rrrr (2xh) 
#define   WREG         0x40  //Write to register rrrr 0100 rrrr (4xh)
 
#define   Reg_MUX0     0x00 
#define   Reg_VBias    0x01 
#define   Reg_MUX1     0x02 
#define   Reg_SYS0     0x03 
#define   Reg_CFC0     0x04 
#define   Reg_CFC1     0x05 
#define   Reg_CFC2     0x06 
#define   Reg_FSC0     0x07 
#define   Reg_FSC1     0x08 
#define   Reg_FSC2     0x09 
#define   Reg_IDAC0    0x0a 
#define   Reg_IDAC1    0x0b 
#define   Reg_GPIOCFG  0x0c 
#define   Reg_GPIODIR  0x0d 
#define   Reg_GPIODAT  0x0e

extern void ADS1247_Init(void);
extern u32 ReadAdADSConversionData(void);
extern u8  ADS_RREG(u8 Address,u8 number); 

文件:ADS1247.c

#include "stm32f10x_gpio.h"
#include "ADS1247.h"
#include "MyClass.h"

#define ADS_SCLK_HIGH    GPIO_SetBits(GPIOB, GPIO_Pin_13)    //时钟高电平
#define ADS_SCLK_LOW     GPIO_ResetBits(GPIOB, GPIO_Pin_13)  //时钟低电平
#define ADS_CS_HIGH      GPIO_SetBits(GPIOB, GPIO_Pin_12)    //片选 高
#define ADS_CS_LOW       GPIO_ResetBits(GPIOB, GPIO_Pin_12)  //片选 低 有效
#define ADS_DIN_HIGH     GPIO_SetBits(GPIOB, GPIO_Pin_15)    //数据 高
#define ADS_DIN_LOW      GPIO_ResetBits(GPIOB, GPIO_Pin_15)  //数据 低

u8 Flag_calibration  = 0;

/* 发送一个字节数据 */
void ADS_WriteByte(u8 WriteData)   
{   
	u8 i=0;      
	ADS_CS_LOW;//片选拉低有效   
	for(i=0;i<8;i++)      
	{      
		if (WriteData & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;          
		ADS_SCLK_HIGH;      
		WriteData = WriteData << 1;        
		ADS_SCLK_LOW;   
	}      
	ADS_CS_HIGH;    
} 

u8 ADS_ReadByte(void)   
{   
	u8 i=0;      
	u8 ReadData=0;      
	ADS_CS_LOW;           
	for(i=0;i<8;i++)      
	{      
		delay_1us();   
		ADS_SCLK_HIGH;   
		ReadData = ReadData << 1;      
		ReadData |= (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14));   
		delay_1us();   
		ADS_SCLK_LOW;   
	}      
	ADS_CS_HIGH;      
	return(ReadData);      
} 
void ADS_Reset()   
{   
	ADS_WriteByte(RESET);   
	delay_10us();   
} 

void ADS_Sleep()   
{   
	ADS_WriteByte(SLEEP);   
	delay_10us();   
} 

void ADS_Wakeup()   
{   
	ADS_WriteByte(WAKEUP);   
	ADS_SCLK_HIGH;      
	delay_1us();       
	ADS_SCLK_LOW;     
	delay_10us();
}  

   
u8 WaiteRDY(void)      
{       
	ADS_CS_LOW;   
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14));   
	ADS_CS_HIGH;     
	return 0;   
}   
   
   
u32 ReadAdADSConversionData(void)      
{    
	u8 flag = 0;   
	u8 i=0;    
	u32 ConvertData = 0;   
	u8 WriteData = RDATA;//读取单次数据   
	static u32 lastvalue = 0;  
	
	/* 等待DRDY拉低,等待数据转换完成 */
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))return lastvalue;
//	ADS_CS_LOW;   
//	for(i=0;i<8;i++)      
//	{      
//		if (WriteData & 0x80)   
//			ADS_DIN_HIGH;      
//		else    
//			ADS_DIN_LOW;         
//		ADS_SCLK_HIGH;      
//		WriteData = WriteData << 1 ;        
//		ADS_SCLK_LOW;   
//	}   
//	ADS_DIN_HIGH; 
	
	
	ADS_CS_LOW;   
	for(i=0;i<24;i++)   
	{      
		ADS_SCLK_HIGH;   
		ConvertData = ConvertData << 1;   
		ConvertData |= (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14));   
		ADS_SCLK_LOW;   
	}     
	ADS_CS_HIGH;   
	lastvalue = ConvertData;
	return(ConvertData);   
}   
   
u8  ADS_RREG(u8 Address,u8 number)   
{     
	u8 i=0;      
	u8 ReadData = 0;    
	ADS_CS_LOW;   
	for(i=0;i<8;i++)      
	{      
		ADS_SCLK_HIGH;   
		if(Address & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;          
		Address = Address << 1 ;        
		ADS_SCLK_LOW;   
	}   
	delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别         
	for(i=0;i<8;i++)      
	{      
		ADS_SCLK_HIGH;      
		if (number & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;         
		number = number << 1 ;        
		ADS_SCLK_LOW;   
	}  
	delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别             
	ADS_DIN_HIGH;
	for(i=0;i<8;i++)      
	{      
		ADS_SCLK_HIGH;   
		ReadData = ReadData << 1;      
		ReadData |= (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14));   
		ADS_SCLK_LOW;   
	}  
    delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别       	
	//ADS_CS_HIGH;  
	return(ReadData);    
}   
 


/* 写寄存器
*  Address : 寄存器地址  0100 rrrr (0x4x) 
*  number  : 写入字节数   实际字节数-1,此处只需写一个字节固定为0x00
*  data    : 写入字节
*/
void ADS_WREG(u8 Address,u8 number,u8 data)   
{   
	u8 i=0;      
	ADS_CS_LOW;     
	for(i=0;i<8;i++)      
	{      
		if (Address & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;         
		ADS_SCLK_HIGH;      
		Address = Address << 1 ;        
		ADS_SCLK_LOW;   
	}   
	delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别    
	for(i=0;i<8;i++)      
	{      
		if (number & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;         
		ADS_SCLK_HIGH;      
		number = number << 1 ;        
		ADS_SCLK_LOW;   
	}   
	delay_1us(); //读写寄存器必须有此延时,否则无法芯片无法识别       
	for(i=0;i<8;i++)      
	{      
		if (data & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;         
		ADS_SCLK_HIGH;      
		data = data << 1 ;        
		ADS_SCLK_LOW;   
	}  
    delay_1us();//读写寄存器必须有此延时,否则无法芯片无法识别       	
	ADS_DIN_HIGH;   
	ADS_CS_HIGH;   
}   
  

void ADS1247_Init(void)   
{     
	u8 i=0;
	u8 WriteData = RDATAC;//连续读数据  RDATA  RDATAC
  	/* 写寄存器  ADC采集速率 40SPS */
	ADS_WREG(Reg_SYS0 | WREG,0x00,0x03);
	/* 设置为连续读取模式 */
	/* 等待DRDY拉低,等待数据转换完成 */
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7))
	{   
	}   

	ADS_CS_LOW;   
	for(i=0;i<8;i++)      
	{      
		if (WriteData & 0x80)   
			ADS_DIN_HIGH;      
		else    
			ADS_DIN_LOW;         
		ADS_SCLK_HIGH;      
		WriteData = WriteData << 1 ;        
		ADS_SCLK_LOW;   
	}   
	ADS_DIN_HIGH; //寄存器配置完成,拉高DIN  否则数据会出错
}   
使用的是STM32f103单片机,用引脚模拟时序操作。
问题:无法读取寄存器操作,回复的数据是0,通过示波器查看回复的数据一直为低。
解决:通过示波器观察到,读寄存器时,发送的指令三个连在一起。中间添加延时后即可接受到回复数据,写入寄存器和读取寄存器的值一致,以上代码为修改后的代码。

最后

以上就是愤怒心情为你收集整理的ADS1247使用例程的全部内容,希望文章能够帮你解决ADS1247使用例程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部