请教读取AD7606模块为0xFFFF的问题

2019-07-20 08:04发布


请教,硬件SPI通信读取值一直是0XFFFF


————————————ad7606.c——————————————
#include "ad7606.h"
#include "spi.h"
#include "delay.h"
#include "usart.h"
#include "stm32f4xx_hal_gpio.h"

/* 仅允许本文件内调用的函数声明 */

u16 s_adc_now[8];

void AD7606_ConfigGPIO(void)
{        

        GPIO_InitTypeDef GPIO_Initure;
   
        AD_CS_GPIO_CLK;
        AD_RESET_GPIO_CLK;
        AD_CONVST_GPIO_CLK;
        AD_RANGE_GPIO_CLK;
        AD_BUSY_GPIO_CLK;
        AD_OS0_GPIO_CLK;
        AD_OS1_GPIO_CLK;
        AD_OS2_GPIO_CLK;
        //PF6  CS
    GPIO_Initure.Pin=AD_CS_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;            
    GPIO_Initure.Pull=GPIO_PULLUP;               
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;               
    HAL_GPIO_Init(AD_CS_GPIO_PORT,&GPIO_Initure);
        //RESET
    GPIO_Initure.Pin=AD_RESET_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;            
    GPIO_Initure.Pull=GPIO_NOPULL;                 
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                     
    HAL_GPIO_Init(AD_RESET_GPIO_PORT,&GPIO_Initure);
        //CONVST
    GPIO_Initure.Pin=AD_CONVST_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              
    GPIO_Initure.Pull=GPIO_NOPULL;               
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                     
    HAL_GPIO_Init(AD_CONVST_GPIO_PORT,&GPIO_Initure);
        //RANGE
    GPIO_Initure.Pin=AD_RANGE_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;            
    GPIO_Initure.Pull=GPIO_NOPULL;                 
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                     
    HAL_GPIO_Init(AD_RANGE_GPIO_PORT,&GPIO_Initure);
        //BUSY
    GPIO_Initure.Pin=AD_BUSY_PIN;
    GPIO_Initure.Mode=GPIO_MODE_INPUT;              
    GPIO_Initure.Pull=GPIO_NOPULL;                 
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                        
    HAL_GPIO_Init(AD_BUSY_GPIO_PORT,&GPIO_Initure);
        //OS0-2
    GPIO_Initure.Pin=AD_OS0_PIN;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;            
    GPIO_Initure.Pull=GPIO_PULLDOWN;               
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;                     
    HAL_GPIO_Init(AD_OS0_GPIO_PORT,&GPIO_Initure);
        GPIO_Initure.Pin=AD_OS1_PIN;
        HAL_GPIO_Init(AD_OS1_GPIO_PORT,&GPIO_Initure);
        GPIO_Initure.Pin=AD_OS2_PIN;
        HAL_GPIO_Init(AD_OS2_GPIO_PORT,&GPIO_Initure);
}

/*_ucMode : 0-6  0表示无过采样,1表示2倍,2表示4倍,3表示8倍,4表示16倍,5表示32倍,6表示64倍*/        
void AD7606_SetOS(u8 _ucMode)
{
        

        if (_ucMode == 1)
        {
                AD_OS2_0();
                AD_OS1_0();
                AD_OS0_1();
        }
        else if (_ucMode == 2)
        {
                AD_OS2_0();
                AD_OS1_1();
                AD_OS0_0();
        }
        else if (_ucMode == 3)
        {
                AD_OS2_0();
                AD_OS1_1();
                AD_OS0_1();
        }
        else if (_ucMode == 4)
        {
                AD_OS2_1();
                AD_OS1_0();
                AD_OS0_0();
        }
        else if (_ucMode == 5)
        {
                AD_OS2_1();
                AD_OS1_0();
                AD_OS0_1();
        }
        else if (_ucMode == 6)
        {
                AD_OS2_1();
                AD_OS1_1();
                AD_OS0_0();
        }
        else        /* 按0处理 */
        {
                AD_OS2_0();
                AD_OS1_0();
                AD_OS0_0();
        }
}

/*配置AD7606模拟信号输入量程,形参: _ucRange : 0 表示正负5V   1表示正负10V */
void AD7606_SetInputRange(u8 _ucRange)
{
        if (_ucRange == 0)
        {
                AD_RANGE_5V();        /* 设置为正负5V */
        }
        else
        {
                AD_RANGE_10V();        /* 设置为正负10V */
        }
}

void AD7606_Reset(void)
{
        /* AD7606是高电平复位,要求最小脉宽50ns */
        AD_RESET_LOW();
        
        AD_RESET_HIGH();
        AD_RESET_HIGH();
        AD_RESET_HIGH();
        AD_RESET_HIGH();
        
        AD_RESET_LOW();
}
void AD7606_StartConv(void)
{
        /* 上升沿开始转换,低电平持续时间至少25ns  */
        AD_CONVST_HIGH();
        AD_CONVST_HIGH();
        AD_CONVST_LOW();
        AD_CONVST_LOW();
        AD_CONVST_LOW();
        AD_CONVST_LOW();        /* 连续执行2次,低电平约50ns */
        
        AD_CONVST_HIGH();
}

/*扫描调用本函数,用于读取AD转换器数据*/
void AD7606_Scan(void)                 /* 此函数代码按照时序编写 */
{
        uint8_t i;                        

        /* BUSY = 0 时.ad7606处于空闲状态ad转换结束 */        
        if (BUSY_IS_LOW())           
    {
                AD_CS_LOW(); /* SPI片选 = 0 */
        
                for (i = 0; i < CH_NUM; i++)
                {

                        s_adc_now[i] = SPI5_ReadWriteByte(0xff);

                        s_adc_now[i] = s_adc_now[i] * 256 + SPI5_ReadWriteByte(0xff); /* 读数据 */        
                }
        
                AD_CS_HIGH(); /* SPI片选 = 1 */

                AD7606_StartConv();        /* 给开始信号 */        
        }
}         

/**/
u16 AD7606_ReadAdc(uint8_t _ch)
{
        u16 sAdc;
        
        sAdc = s_adc_now[_ch];

        return sAdc;
}


void AD7606_Init(void)
{
        SPI5_Init();
        AD7606_ConfigGPIO();
        AD7606_SetInputRange(1);
        AD7606_SetOS(0);
        AD7606_Reset();
        AD_CONVST_HIGH();
}

void Demo_spi_AD7606(void)
{

        AD7606_Init();        /* 配置AD7606所用的GPIO */
}


————————————main.c——————————————


#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "ad7606.h"
#include "spi.h"


int main(void)
{

    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
        Demo_spi_AD7606();
        
        u16 n;
        u8 unitPlace;
        u8 tenPlace;
        u8 hundredPlace;
        u8 thousandPlace;
        u8 tenthousandPlace;
        while(1)
        {
                AD7606_Scan();
                n=AD7606_ReadAdc(0);
                //AD7606_Mak();
                //AD7606_Disp();

                unitPlace = (n / 1 )% 10;
                tenPlace = (n / 10 )% 10;
                hundredPlace = (n / 100) % 10;
                thousandPlace = (n / 1000) % 10;
                tenthousandPlace = (n / 10000) % 10;
               
               
                printf("%d\%d\%d\%d\%d\ ",tenthousandPlace,thousandPlace,hundredPlace,tenPlace,unitPlace);
        }                    
}

使用STM32F429IGT6,硬件接线如下

          +5V       <------   5.0V      5V供电
          GND       -------   GND       地
          CS        <------   PF6      SPI_CS
          RD/SCLK   <------   PF7       SPI_SCLK
          DB7/DOUT  ------>   PF8       SPI_MISO
          RAGE      <------   PE7        模拟信号输入量程
          RST       <------   PA6       复位信号
          CVA CVB   <------   PB1       启动AD转换
          OS0       <------   GND       过采样引脚0(默认接地)
          OS1       <------   GND       过采样引脚1(默认接地)
          OS2       <------   GND       过采样引脚2(默认接地)
          BUSY      ------>   PA0       BUSY信号
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。