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

来源:互联网 发布:我赢职场java视频下载 编辑:程序博客网 时间:2024/05/16 14:02

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

调试中需要注意的点:

1、芯片初始化时,需要初始化M0,M1,M2.这将决定触发方式,数据帧长度,使能hamming code;(Page  5).我使用的是M0=VDD,M1=VDD,M2=GND;即异步中断+32bit数据帧通讯+hamming disable。

2.   时钟配置见下图,采样率为500HZ。基准电压采用内部4.0v。

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

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

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


/**********************************************************************  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_InitTypeDefNVIC_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));//发送unlockreceive <<= 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 ADS131do{RECEIVE = ADS13_WRITE_CMD(NULL);printf("receive data is : %X...\n", RECEIVE);if(RECEIVE == 0xff02) //ADS131A02 is ready.break loopprintf("ADS131A02 is ready!\n  Configuring Registers...\n");delay_ms(5);}while(RECEIVE != 0xff02); //初始化成功则跳出循环ADS13_WRITE_CMD(UNLOCK);//UNLOCK ADS131ADS13_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 *****0x21ADS13_REG(WREG|ADC_ENA, 0X0F); //ADC CHANNEL ENABLE ALLADS13_WRITE_CMD(WAKEUP);//WAKEUP ADS131adcenable_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); // 补齐0ADS13_SPI(0X00); // delay_us(6);ADS13_CS_H;    }    for(i=0;i<45;i++);    return temp;}

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