使用STM32F103ZET6与ADS1248相连,一直没有数据,串口调试助手一直显示0V

baidu_38280175 2017-05-09 09:36:01
程序如下
.C文件
#include "ads1247.h"
#include "delay.h"


u8 results1,results2,results3;
u32 D;

/*******************************************************************************
* Function Name : SPI_FLASH_Init
* Description : Initializes the peripherals used by the SPI FLASH driver.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SPI_ADS1248_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable SPI1 and GPIO clocks */
/*!< SPI_FLASH_SPI_CS_GPIO, SPI_FLASH_SPI_MOSI_GPIO,
SPI_FLASH_SPI_MISO_GPIO, SPI_FLASH_SPI_DETECT_GPIO
and SPI_FLASH_SPI_SCK_GPIO Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);

/*!< SPI_FLASH_SPI Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/*!< AFIO Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


/*!< Configure SPI_FLASH_SPI pins: SCK */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Deselect the FLASH: Chip Select high */

/* SPI1 configuration */
// W25X16: data input on the DIO pin is sampled on the rising edge of the CLK.
// Data on the DO and DIO pins are clocked out on the falling edge of CLK.
SPI_Cmd(SPI1, DISABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位模式
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //SCLK空闲时位低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //SCLK的下降沿采集数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //从机选择信号,软件模式,就是用GPIO选择从机
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //APB2或者APB1总线频率的1/2~1/256分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure);

/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
}

/*******************************************************************************
* Function Name : SPI_FLASH_SendByte
* Description : Sends a byte through the SPI interface and return the byte
* received from the SPI bus.
* Input : byte : byte to send.
* Output : None
* Return : The value of the received byte.
*******************************************************************************/
u8 SPI_ADS1248_SendByte(u8 byte)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(SPI1, byte);

/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI1);
}


/*******************************************************************
函数名:初始化DAC接口
函数原型:void ADC_gpio_init()
参数说明:无
返回: 无
********************************************************************/
void ADS1248_GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
////////start reset 引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin= ADS_RESET|ADS_START;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //--推免输出模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; //--GPIO翻转速度为50MHz
GPIO_Init(GPIOC , &GPIO_InitStructure); //--将配置写入对应的GPIO寄存器中


// GPIO_InitTypeDef GPIO_InitStructure;
///////// DRDY引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin= ADS_DRDY;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; //--浮点输入模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; //--GPIO翻转速度为50MHz
GPIO_Init(GPIOC , &GPIO_InitStructure); //--将配置写入对应的GPIO寄存器中

/////////// cs引脚设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin= SPI_ADS1248_CS_PIN;
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP; //--推免输出模式
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; //--GPIO翻转速度为50MHz
GPIO_Init(GPIOC , &GPIO_InitStructure); //--将配置写入对应的GPIO寄存器中
}

//-----------------------------------------------------------------//
// 功 能:ADS1248 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1248中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//

void ADS1248WREG(unsigned char regaddr,unsigned char databyte)
{
//向寄存器写入数据地址
SPI_ADS1248_SendByte(ADS1248_CMD_WREG+(regaddr & 0xF));
//写入数据的个数n-1
SPI_ADS1248_SendByte(0);
//向regaddr地址指向的寄存器写入数据databyte
SPI_ADS1248_SendByte(databyte);
}

//-----------------------------------------------------------------//
// 功 能:ADS1248 读数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 从ADS1248中地址为regaddr的寄存器读出一个字节databyte
//-----------------------------------------------------------------//

unsigned char ADS1248RREG(unsigned char regaddr)
{

unsigned char r=0;

SPI_ADS1248_SendByte(ADS1248_CMD_RREG+(regaddr & 0xF));

SPI_ADS1248_SendByte(0);

r=SPI_ADS1248_SendByte(ADS1248_CMD_NOP);

return r;
}

//-----------------------------------------------------------------//
// 功 能:ADS1248初始化子程序
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//-----------------------------------------------------------------//
void InitADS1248(void)
{
START_0;//发送复位命令
RESET_0;
delay_ms(10);
RESET_1;
delay_ms(10);
//ADS1248SPI(ADS1248_CMD_RESET);
//初始化MUX0多路复用控制寄存器
ADS1248WREG(ADS1248_REG_MUX0,0x01);//00100101,Bit7-6:传感器电流源检测不使用,Bit5-3:正输入为AIN0,Bit2-0:负输入为AIN1
delay_ms(10);
//初始化MUX1多路复用控制寄存器
ADS1248WREG(ADS1248_REG_MUX1,0x30); //00110000,Bit7:启用内部晶振,Bit6-5:内部基准一直打开,Bit4-3:输入基准为片上基准,Bit2-0:普通模式
//延时等待10ms,等待内部基准稳定
delay_ms(10);
//初始化VBIAS偏压寄存器
ADS1248WREG(ADS1248_REG_VBIAS,0); //00000000,Bit7-0:偏置电压选择关闭(默认)
//初始化IDAC1控制寄存器
delay_ms(10);
ADS1248WREG(ADS1248_REG_IDAC1,0xFF);//11111111,Bit7-4:断开内部第一恒流源的连接,Bit3-0:断开内部第二恒流源的连接 0X8F打开第一内部恒流源
//初始化IDAC0控制寄存器
delay_ms(10);
ADS1248WREG(ADS1248_REG_IDAC0,0x08); //00001000,Bit7-4:只读,Bit3:DRDY/DOUT功能复用Dout线 ,Bit2-0:关闭内部恒流源
//初始化SYS0系统控制寄存器
delay_ms(10);
ADS1248WREG(ADS1248_REG_SYS0,0x52); //00000000,Bit7:必须设置为0,Bit6-41:选择32倍增益,Bit3-0:选择20SPS测量速度
delay_ms(10);

}

void Ads1248(void)
{
D=0; //发送单次读数据命令
SPI_ADS1248_SendByte(ADS1248_CMD_RDATA);//读取ADC转换完成的数据
results1=SPI_ADS1248_SendByte(0xFF);
results2=SPI_ADS1248_SendByte(0xFF);
results3=SPI_ADS1248_SendByte(0xFF);
D|=results1<<16|results2<<8|results3;
//发送空操作指令,强迫D_OUT变高
SPI_ADS1248_SendByte(ADS1248_CMD_NOP);

}
//-----------------------------------------------------------------//
// 功 能:测试一次电压数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: /
//-----------------------------------------------------------------//
void START_test(void)
{
START_1;
delay_us(800);
// delay_ms(7);
START_0;

}


/********************************************************************************
** 函数名称 : NVIC_Configuration(void)
** 函数功能 : 中断初始化
** 输 入 : 无
** 输 出 : 无
** 返 回 : 无
********************************************************************************
*/
void NVIC_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//连接IO口到中断线/

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

EXTI_InitStructure.EXTI_Line = EXTI_Line4; //--外部中断线,使用第1根
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //--中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //--上升沿触发模式
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //--打开中断
EXTI_Init(&EXTI_InitStructure); //--写入对应寄存器中

// 使能外部中断,并配置优先级// EXTI_Trigger_Falling EXTI_Trigger_Rising
NVIC_InitStructure.NVIC_IRQChannel =EXTI4_IRQn; //--第1个引脚,所以使用1通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//--设置中断优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //--设置子优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //--启用通道
NVIC_Init(&NVIC_InitStructure);

}

头文件和主函数我在回答里给出








...全文
1235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰风子 2017-09-20
  • 打赏
  • 举报
回复
同楼上,示波器每一路都看看出来的信号对不对,如果没问题再看看双踪,时序配合上对不对之类的,发现问题再针对问题看代码。
xqhrs232 2017-05-12
  • 打赏
  • 举报
回复
拿示波器测试信号!!!
zhujinqiang 2017-05-11
  • 打赏
  • 举报
回复
AD的参考电压正常吗?
mill_li 2017-05-10
  • 打赏
  • 举报
回复
你这代码这样子贴上来,让人咋看啊
fuchouzhe 2017-05-10
  • 打赏
  • 举报
回复
首先排除硬件问题,ID能读回否?然后在看采样率,PGA增益之类的。 通常没有人会看你的代码,没那个时间
baidu_38280175 2017-05-09
  • 打赏
  • 举报
回复
头文件 #ifndef __ADS1247_h #define __ADS1247_h /*****************************头文件包含*****************************************/ #include "stm32f10x.h" /********************************************************************************/ /******************ads1248寄存器地址*******************/ #define ADS1248_CMD_WAKEUP 0x00 #define ADS1248_CMD_SLEEP 0x02 #define ADS1248_CMD_SYNC 0x04 #define ADS1248_CMD_RESET 0x06 #define ADS1248_CMD_NOP 0xff #define ADS1248_CMD_RDATA 0x12 #define ADS1248_CMD_RDATAC 0x14 #define ADS1248_CMD_SDATAC 0x16 #define ADS1248_CMD_RREG 0x20 #define ADS1248_CMD_WREG 0x40 #define ADS1248_REG_MUX0 0x00 #define ADS1248_REG_VBIAS 0x01 #define ADS1248_REG_MUX1 0x02 #define ADS1248_REG_SYS0 0x03 #define ADS1248_REG_CFC0 0x04 #define ADS1248_REG_CFC1 0x05 #define ADS1248_REG_CFC2 0x06 #define ADS1248_REG_FSC0 0x07 #define ADS1248_REG_FSC1 0x08 #define ADS1248_REG_FSC2 0x09 #define ADS1248_REG_IDAC0 0x0a #define ADS1248_REG_IDAC1 0x0b #define ADS1248_REG_GPIOCFG 0x0c #define ADS1248_REG_GPIODIR 0x0d #define ADS1248_REG_GPIODAT 0x0e /******************ads1248测量通道选择*******************/ #define Ads_1 0x07 #define Ads_2 0x0f #define Ads_3 0x17 #define Ads_4 0x1f #define Ads_5 0x27 #define Ads_6 0x2f #define Ads_7 0x37 /******************ads1248引脚设置*******************/ //#define RCC_APB2Periph_ADS_PORT RCC_APB2Periph_GPIOC //#define ADS_PORT GPIOC #define ADS_RESET GPIO_Pin_6 #define ADS_START GPIO_Pin_2 #define ADS_DRDY GPIO_Pin_4 #define RESET_1 GPIO_SetBits(GPIOC, ADS_RESET) #define RESET_0 GPIO_ResetBits(GPIOC, ADS_RESET) #define START_1 GPIO_SetBits(GPIOC, ADS_START) #define START_0 GPIO_ResetBits(GPIOC, ADS_START) #define SPI_ADS1248_CS_PIN GPIO_Pin_1 /* PC.05 */ #define SPI_ADS1248_CS_LOW() GPIO_ResetBits(GPIOC, GPIO_Pin_1) #define SPI_ADS1248_CS_HIGH() GPIO_SetBits(GPIOC, GPIO_Pin_1) extern u8 results1; extern u8 results2; extern u8 results3; extern u32 D; void ADS1248_GPIO_init(void); void ADS1248WREG(unsigned char regaddr,unsigned char databyte); void InitADS1248(void); void Ads1248(void); void START_test(void); void SPI_ADS1248_Init(void); u8 SPI_ADS1248_SendByte(u8 byte); #endif 主函数 /********************************************************************************* * 文件名 :main.c * 描述 : * 实验平台: * 库版本 :ST3.0.0 * 连线 : ADS_START PC2 ADS_DRDY PC4 ADS_RESET PC6 ADS_CS ADS_CLK PA5 ADS_DIN PA7 ADS_DOUT PA6 * 作者 : **********************************************************************************/ #include "stm32f10x.h" #include "usart1.h" #include "delay.h" #include "ads1247.h" void NVIC_Configuration(void); /* * 函数名:main * 描述 :主函数 * 输入 :无 * 输出 :无 */ int main(void) { unsigned long Result_sum=0; unsigned long fVoltage; unsigned char buf[10],i; SystemInit(); //主频时钟初始化 delay_init(72); //延时时钟初始化 USART1_Config(); //串口初始化 printf("\r\n 这是一个ADS1248的实验 \r\n"); SPI_ADS1248_Init(); //SPI初始化 ADS1248_GPIO_init(); //端口初始化 SPI_ADS1248_CS_LOW(); NVIC_Configuration(); //外中断初始化 InitADS1248(); //ADC初始化 while(1) { START_1; // START_test(); delay_ms(500); // printf(" 最高位:%d ",results1); // printf(" 中间位:%d ",results2); // printf(" 最低位:%d ",results3); // printf("\n **输出稳定**\n"); // printf("%d\n",D); /*********发送AD转换后实际电压值到串口,因为计算精度问题,电压值有小的偏差*************/ Result_sum = D >> 8; if(Result_sum<0x8000) //测得电压值为正的情况 { fVoltage=Result_sum*625; //625=2.048/32768*10000000 6.144位基准电压 32768为2的15次方 10000000为为了计算的准确性转换为整形计算 buf[0]=(unsigned char)(fVoltage/10000000); buf[0]=buf[0]+0x30; buf[1]='.'; buf[2]=(unsigned char)((fVoltage%10000000)/1000000); buf[2]=buf[2]+0x30; buf[3]=(unsigned char)((fVoltage%1000000)/100000); buf[3]=buf[3]+0x30; buf[4]=(unsigned char)(fVoltage%100000/10000); buf[4]=buf[4]+0x30; buf[5]=(unsigned char)(fVoltage%10000/1000); buf[5]=buf[5]+0x30; buf[6]=(unsigned char)(fVoltage%1000/100); buf[6]=buf[6]+0x30; buf[7]='V'; //V buf[8]=0x20; buf[9]=0x20; } else //测得电压值为负的情况 { //buf[0]='-'; //取‘-’号 Result_sum=0xffff-Result_sum; //取反运算 fVoltage=Result_sum*625; //625=2.048/32768*10000000 6.144位基准电压 32768为2的15次方 10000000为为了计算的准确性转换为整形计算 buf[0]=(unsigned char)(fVoltage/10000000); buf[0]=buf[0]+0x30; buf[1]='.'; buf[2]=(unsigned char)((fVoltage%10000000)/1000000); buf[2]=buf[2]+0x30; buf[3]=(unsigned char)((fVoltage%1000000)/100000); buf[3]=buf[3]+0x30; buf[4]=(unsigned char)(fVoltage%100000/10000); buf[4]=buf[4]+0x30; buf[5]=(unsigned char)(fVoltage%10000/1000); buf[5]=buf[5]+0x30; buf[6]=(unsigned char)(fVoltage%1000/100); buf[6]=buf[6]+0x30; buf[7]='V'; //V buf[8]=0x20; //空格 buf[9]='-'; } i=0; while(i<10) { printf("%c",buf[i]); i++; } printf("\n"); START_0; } } /******************* (C) COPYRIGHT 2011 开发工作室 *****END OF FILE****/

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧