概述
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使用例程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复