|
前面的项目中一直使用无源晶振作为ADS1255的时钟,可以正常运行。但因项目需要使用,将无源晶振改换为有源晶振后,虽然也有波形,但是ADS1255无法过初始化,DRDY引脚一直为低电平,图中放了无源和有源晶振产生的波形,都是7.69MHz,只不过无源的接近正弦,有源的接近方波。ADS1255的初始化代码如下(使用无源晶振可以运行)。请各位大佬指点一下。
#include "ads1256.h"
//-----------------------------------------------------------------------------------------------//
// Pin assign
// STM32 ADS1256
// GPIOA_Pin_8 <--- DRDY
// GPIOB_Pin_12 ---> CS
// GPIOB_Pin_13 ---> SCK
// GPIOB_Pin_14(MISO) <--- DOUT
// GPIOB_Pin_15(MOSI) ---> DIN
//-----------------------------------------------------------------------------------------------//
/*端口定义*/
#define RCC_DRDY RCC_APB2Periph_GPIOA
#define PORT_DRDY GPIOA
#define PIN_DRDY GPIO_Pin_8
#define RCC_RST RCC_APB2Periph_GPIOA
#define PORT_RST GPIOA
#define PIN_RST GPIO_Pin_11
#define RCC_CS RCC_APB2Periph_GPIOB
#define PORT_CS GPIOB
#define PIN_CS GPIO_Pin_12
#define CS_0() GPIO_ResetBits(PORT_CS, PIN_CS);
#define CS_1() GPIO_SetBits(PORT_CS, PIN_CS);
#define ADS1256_DRDY (PORT_DRDY->IDR & PIN_DRDY)
//-----------------------------------------------------------------------------------------------//
// 函数名称: SPI2_Init()
// 函数功能: SPI通信初始化
// 入口参数: 无
// 出口参数: 无
// 全局变量: 无
// 函数说明: 无
//-----------------------------------------------------------------------------------------------//
void SPI2_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/****Initial SPI2******************/
/* Enable SPI2 and GPIOB clocks */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/* Configure SPI2 pins: NSS(PB12), SCK(PB13), MISO(PB14) and MOSI(PB15) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* SPI2 configuration */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI2设置为两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI2为主模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行时钟在不操作时,时钟为低电平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //第一个时钟沿开始采样数据
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件(使用SSI位)管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为8
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI2 */
SPI_Cmd(SPI2, ENABLE);
}
//-----------------------------------------------------------------------------------------------//
// 函数名称: Init_ADS1256_GPIO()
// 函数功能: 初始化ADS1256 GPIO
// 入口参数: 无
// 出口参数: 无
// 全局变量: 无
// 函数说明: 无
//-----------------------------------------------------------------------------------------------//
void Init_ADS1256_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_DRDY | RCC_CS, ENABLE);
GPIO_InitStructure.GPIO_Pin = PIN_DRDY;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PORT_DRDY, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_RST;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(PORT_RST, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(PORT_RST,PIN_RST); //PB.5 输出高
//SPI2 NSS
CS_1();
GPIO_InitStructure.GPIO_Pin = PIN_CS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT_CS, &GPIO_InitStructure);
SPI2_Init();
}
//-----------------------------------------------------------------------------------------------//
// 函数名称: SPI_WriteByte()
// 函数功能: 模拟SPI通信
// 入口参数: TxData:发送的SPI数据
// 出口参数: RxData:接收的SPI数据
// 全局变量: 无
// 函数说明: 发送接收函数
//-----------------------------------------------------------------------------------------------//
unsigned char SPI_WriteByte(unsigned char TxData)
{
unsigned char RxData=0;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2,TxData);
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
RxData=SPI_I2S_ReceiveData(SPI2);
return RxData;
}
//-----------------------------------------------------------------------------------------------//
// 函数名称: ADS1256WREG()
// 函数功能: ADS1256 写数据
// 入口参数: regaddr: 待写入的寄存器地址
// databyte:待写入的数据
// 出口参数: 无
// 全局变量: 无
// 函数说明: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
CS_0();
while(ADS1256_DRDY);//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
//写入数据的个数n-1
SPI_WriteByte(0x00);
//向regaddr地址指向的寄存器写入数据databyte
SPI_WriteByte(databyte);
CS_1();
}
//-----------------------------------------------------------------------------------------------//
// 函数名称: ADS1256_Init()
// 函数功能: 初始化ADS1256
// 入口参数: 无
// 出口参数: 无
// 全局变量: 无
// 函数说明: 设置是否需要缓冲、放大倍数以及采样速率
//-----------------------------------------------------------------------------------------------//
void ADS1256_Init(void)
{
//第一行就过不了
while(ADS1256_DRDY);
CS_0();
SPI_WriteByte(ADS1256_CMD_SELFCAL);
while(ADS1256_DRDY);
CS_1();
ADS1256WREG(ADS1256_STATUS,0x06); // 高位在前、使用缓冲
//ADS1256WREG(ADS1256_STATUS,0x04); // 高位在前、不使用缓冲
//ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1); // 放大倍数1
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_500SPS); // 数据10sps
ADS1256WREG(ADS1256_IO,0x00);
//*************自校准****************
while(ADS1256_DRDY);
CS_0();
SPI_WriteByte(ADS1256_CMD_SELFCAL);
while(ADS1256_DRDY);
CS_1();
//**********************************
}
//-----------------------------------------------------------------------------------------------//
// 函数名称: ADS1256ReadData()
// 函数功能: 读取AD值
// 入口参数: channel:需要读取的通道
// 出口参数: sum: AD采集到的值
// 全局变量: 无
// 函数说明: 无
//-----------------------------------------------------------------------------------------------//
signed int ADS1256ReadData(unsigned char channel)
{
unsigned int sum=0;
while(ADS1256_DRDY); //当ADS1256_DRDY为低时才能写寄存器
ADS1256WREG(ADS1256_MUX,channel); //设置通道
CS_0();
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
SPI_WriteByte(ADS1256_CMD_RDATA);
sum |= (SPI_WriteByte(0xff) << 16);
sum |= (SPI_WriteByte(0xff) << 8);
sum |= SPI_WriteByte(0xff);
CS_1();
if (sum>0x7FFFFF) // if MSB=1,
{
sum -= 0x1000000; // do 2's complement
}
return sum;
}
|
-
无源晶振
-
有源晶振
|