ADS131A02驱动调试笔记(stm32f407+spi)

一、问题背景

hah 由于实验室研究采集研究心电信号,故开始使用ADS1292,而后考虑使用分立器件自己搭。故采用了这款ADS131A02高精度24bit的adc芯片。

二、调试中需要注意的点

1、芯片初始化时,需要初始化M0,M1,M2电平(可以通过硬件直接拉高拉低)。这将决定数据的触发方式,数据帧长度,使能hamming code;(Page  5)我使用的是M0=VDD,M1=VDD,M2=GND,即「异步中断」+「32bit数据帧通讯」+「hamming disable」。

2、时钟源为16.348MHz,分频配置见下图,最后采样率 f_{DATA} 为 500HZ。

3、设置ADC基准电压采用内部4.0v。

4、SPI settings are CPOL = 0 and CPHA = 1 ;

5、配置寄存器强烈推荐看datasheet P79的那张图(Initialization Set Up (continued) ),超级详细。一步步来配置就好。

6、此芯片在通用spi的基础上,加上了点芯片自己的协议。芯片使用命令字+数据帧(数据帧长度即为M1设置的)的方式进行通信,需要注意!详细查考此代码和datesheet P49~54

                                                                             图1 本例子ADC 时钟分频情况

三、源代码

/*
*******************************************************************
**  Filename :  ADS131A02.c
**  Abstract :  This file implements user delay ctrol function.
**  Device   :  stm32f4xx
**  Compiler :  keil 5
**  Target   :  adc sample
**  By       :  yulong <hylong2111@163.com>
**  Date     :  2017-08-31 17:09:39
**  Changelog:1.首次创建
*******************************************************************
*/
#include "ADS131A02.h"
#include "stm32f4xx_exti.h"
#include "stdio.h"
#include "exti.h"
#include "Show_Scope.h"

/**初始化ADS131**/
void ADS131A02_Init(void) 
{
    GPIO_InitTypeDef    GPIO_InitStructure;
	NVIC_InitTypeDef	NVIC_InitStructure;
	EXTI_InitTypeDef 	EXTI_InitStructure;
    
    //ADS13 CS脚
    GPIO_InitStructure.GPIO_Pin = ADS13_CS;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 	GPIO_Init(ADS13_CS_G, &GPIO_InitStructure);
    GPIO_SetBits(ADS13_CS_G, ADS13_CS);//CS 高电平,先不选中
    //其他公用SPI的器件,将片选拉高
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PG15 //flash_cs
    GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
    GPIO_SetBits(GPIOG, GPIO_Pin_15);//PG15输出1,防止NRF干扰SPI FLASH的通信 
    
    //ADS13 DRDY脚
    GPIO_InitStructure.GPIO_Pin = ADS13_DRDY;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100M
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
 	GPIO_Init(ADS13_DRDY_G, &GPIO_InitStructure);   
    
    SPI3_Init();		   			//初始化SPI
    SPI3_SetSpeed(SPI_BaudRatePrescaler_256);		//设置为42M时钟,高速模式 

    //DRDY中断接收初始化
    EXTIX_Init();
}


/* write a command to ADS131a02 */
u16 ADS13_WRITE_CMD(u16 command)
{
	u16 receive=0x0000;
	
	ADS13_CS_L;
	delay_us(10);
	receive = ADS13_SPI((u8)(command>>8));//发送unlock
	receive <<= 8;
	receive |= ADS13_SPI((u8)(command));
	ADS13_SPI(0X00);//填满4个字节 
	ADS13_SPI(0X00);//填满4个字节 
	ADS13_CS_H;	
	delay_us(10);
	
	return receive; //返回接收的数据
}

/*****************************************************************************************
* Function Name: ADS13_PowerOnInit
* Description  : ADS13上电复位
* Arguments    : NONE
* Return Value : NONE
******************************************************************************************/
int adcenable_flag=0;
void ADS13_PowerOnInit(void)
{	
	u16 RECEIVE=0X0000, i=0, count=0; //接收spi返回的字符
	
	ADS13_CS_H;
	delay_ms(20);
	ADS13_WRITE_CMD(RESET);	 //RESET ADS131
	do
	{
		RECEIVE = ADS13_WRITE_CMD(NULL);
		printf("receive data is : %X...\n", RECEIVE);
		if(RECEIVE == 0xff02) //ADS131A02 is ready.break loop
			printf("ADS131A02 is ready!\n  Configuring Registers...\n");
		delay_ms(5);
	}while(RECEIVE != 0xff02); //初始化成功则跳出循环
	
	ADS13_WRITE_CMD(UNLOCK);//UNLOCK ADS131
	ADS13_REG(WREG|A_SYS_CFG, 0X78); //enable internal reference volatage (4.0v)
	ADS13_REG(WREG|CLK1, 0X08); //ADC CLK1  fICLK = fCLKIN(16.384mhz) / 8 
	ADS13_REG(WREG|CLK2, 0X21); //fMOD = fICLK / 2  fICLK = fCLKIN / 2048 ****** now is 500hz *****0x21
	ADS13_REG(WREG|ADC_ENA, 0X0F); //ADC CHANNEL ENABLE ALL
	ADS13_WRITE_CMD(WAKEUP);//WAKEUP ADS131
	
	adcenable_flag=1; //初始化完毕标志位
}

/*****************************************************************************************
* Function Name: ADS13_SPI
* Description  : 通过SPI总线与ADS131通信
* Arguments    : com:需写入的数据
* Return Value : 返回读取的数据
******************************************************************************************/
unsigned char ADS13_SPI(unsigned char com)
{
    return(SPI3_ReadWriteByte(com));
}

/*****************************************************************************************
* Function Name: ADS13_REG
* Description  : 对ADS131内部寄存器进行操作 
* Arguments    : com:读写寄存器地址,data:需写入的数据
* Return Value : 返回读取的数据
******************************************************************************************/
u16 ADS13_REG(unsigned char com, unsigned data)
{
	unsigned int i;
	u16 temp=0X0000;
		
	if((com&0x20)==0x20)//判断是否为读寄存器指令 if里面为读
	{	
		ADS13_WRITE_CMD(com);
		temp= ADS13_WRITE_CMD(NULL);
	}
    else //写寄存器
    {;
		ADS13_CS_L;
		ADS13_SPI(com);
        ADS13_SPI(data);
		ADS13_SPI(0X00); // 补齐0
		ADS13_SPI(0X00); // 
		delay_us(6);
		ADS13_CS_H;
    }
    for(i=0;i<45;i++);
    return temp;
}

 

四、验证

最后采用一次性Ag/AgCl电极,3导联方式采集ECG信号,用匿名上位机绘制波形如下(能看到尖锐的R波,幅值在2V左右,至此驱动调试完成):


 

  • 12
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值