使用STM32F103ZET6与ADS1248相连,一直没有数据,串口调试助手一直显示0V
程序如下
.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);
}
头文件和主函数我在回答里给出