硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1720|回复: 2
收起左侧

用有源晶振为ADS1255提供时钟,但ADC无法正常工作

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-5-14 21:35:41 | 显示全部楼层 |阅读模式
前面的项目中一直使用无源晶振作为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;
}


无源晶振

无源晶振

有源晶振

有源晶振
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-5-15 14:15:59 | 显示全部楼层
帮顶。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2024-5-27 09:31:49 | 显示全部楼层
问题已解决,电路和 程序没有问题,是ADS1255芯片坏了(是从其他板子上拆下来的),换了全新的芯片就可以正常运行了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 04:42 , Processed in 0.040434 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表