硬汉嵌入式论坛

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

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

[复制链接]

1

主题

0

回帖

5

积分

新手上路

积分
5
发表于 2018-5-5 21:00:53 | 显示全部楼层 |阅读模式
请教,硬件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\\\t",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信号
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-6 10:59:07 | 显示全部楼层
特别测试下你的这个5V供电引脚是否正常,之前有网友不是5V供电,导致读出来的都是0xFFFF,你确定下你那里。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-7 10:28:55 | 显示全部楼层
eric2013 发表于 2018-5-6 10:59
特别测试下你的这个5V供电引脚是否正常,之前有网友不是5V供电,导致读出来的都是0xFFFF,你确定下你那里。

借楼请问一下,使用模拟SPI的时候为什么需要配置MOSI,这个只有单根信号线啊,我看图纸说明是接CS CLK MISO
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-7 10:36:14 | 显示全部楼层
王海靖 发表于 2018-5-7 10:28
借楼请问一下,使用模拟SPI的时候为什么需要配置MOSI,这个只有单根信号线啊,我看图纸说明是接CS CLK MI ...

你可以不接的
回复

使用道具 举报

1

主题

6

回帖

25

积分

新手上路

积分
25
发表于 2018-5-7 11:30:34 | 显示全部楼层
eric2013 发表于 2018-5-6 10:59
特别测试下你的这个5V供电引脚是否正常,之前有网友不是5V供电,导致读出来的都是0xFFFF,你确定下你那里。

目前的情况是,通道一输出为0XFFFF,通道二到通道八输出为0
回复

使用道具 举报

1

主题

6

回帖

25

积分

新手上路

积分
25
发表于 2018-5-7 11:32:36 | 显示全部楼层
eric2013 发表于 2018-5-6 10:59
特别测试下你的这个5V供电引脚是否正常,之前有网友不是5V供电,导致读出来的都是0xFFFF,你确定下你那里。

5v供电也是正常的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-7 12:39:45 | 显示全部楼层

你用的是HAL库吗,如果是HAL的话,就不太好给你检查了,当前我们的例子是基于标准库的,你特别查看下是不是配置上有问题。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-7 16:07:09 | 显示全部楼层

感谢您的回答,中午又看了一下程序,还有几个问题问一下。
我使用的是STM32F107模拟SPI
1,bsp_InitTimer();配置了定时器,但是没办法进入定时器中断;
2,bsp_StartAutoTimer(0, 500);看前面的程序只配置了TIM2 这里ID选择0,是选择配置的TIM2吗
3,if (bsp_CheckTimer(0)),该判断语句无法进入。
       if (s_tTmr[_id].Flag == 1)
        {
                s_tTmr[_id].Flag = 0;
                return 1;
        }
      s_tTmr[_id].Flag一直都是0,所以无法判断成功
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-7 16:13:21 | 显示全部楼层
王海靖 发表于 2018-5-7 16:07
感谢您的回答,中午又看了一下程序,还有几个问题问一下。
我使用的是STM32F107模拟SPI
1,bsp_InitTim ...

这个函数bsp_InitTimer(); bsp_StartAutoTimer(0, 500); 是基于滴答定时器的。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-7 16:35:46 | 显示全部楼层
eric2013 发表于 2018-5-7 16:13
这个函数bsp_InitTimer(); bsp_StartAutoTimer(0, 500); 是基于滴答定时器的。

TIM_ITConfig(TIM_HARD, TIM_IT_Update, ENABLE);加上这一句可以进入定时器中断,但是一直循环死在中断了。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-7 23:00:54 | 显示全部楼层
eric2013 发表于 2018-5-7 16:13
这个函数bsp_InitTimer(); bsp_StartAutoTimer(0, 500); 是基于滴答定时器的。

代码贴出来,忘您帮忙分析一下。CS      PD4            RESET    PA14              RANGE PE2          CONVST   PD3           BUSY      PD5
CLK    PA13           MISO     PA15

main
{
InitTimer();//初始化一个500ms定时器,每500ms把j赋值1
bsp_InitSPIBus();
g_tAD7606.Range = 1;        /* 10V */
bsp_spi_InitAD7606();       

while (1)
        {
if (j==1)
                {       
AD7606_Scan();
AD7606_Mak();
j=0;
}

}

#ifdef SOFT_SPI               
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_SCK | RCC_MISO, ENABLE);        
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin = PIN_SCK;
        GPIO_Init(PORT_SCK, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        
        GPIO_InitStructure.GPIO_Pin = PIN_MISO;
        GPIO_Init(PORT_MISO, &GPIO_InitStructure);
#endif




static void AD7606_ConfigGPIO(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);               
        
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
        

        RCC_APB2PeriphClockCmd(RCC_CS | RCC_RANGE | RCC_BUSY | RCC_RESET | RCC_CONVST, ENABLE);        
        

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        

        GPIO_InitStructure.GPIO_Pin = PIN_RESET;
        GPIO_Init(PORT_RESET, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = PIN_CONVST;
        GPIO_Init(PORT_CONVST, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = PIN_RANGE;
        GPIO_Init(PORT_RANGE, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = PIN_CS;
        GPIO_Init(PORT_CS, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;               

        GPIO_InitStructure.GPIO_Pin = PIN_BUSY;
        GPIO_Init(PORT_BUSY, &GPIO_InitStructure);
}




其他时序均参考例程

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-8 01:19:28 | 显示全部楼层
王海靖 发表于 2018-5-7 16:35
TIM_ITConfig(TIM_HARD, TIM_IT_Update, ENABLE);加上这一句可以进入定时器中断,但是一直循环死在中断了 ...

这个bsp_timer.c文件里面是做两个功能,一个是滴答定时器的,一个是通用定时器的,使用通用定时器的要用对应的初始化函数搞。

你之前截图的那个,是滴答定时器的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-8 01:21:16 | 显示全部楼层
王海靖 发表于 2018-5-7 23:00
代码贴出来,忘您帮忙分析一下。CS      PD4            RESET    PA14              RANGE PE2          ...

你发的这个程序,没看出有什么问题
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-8 08:24:24 | 显示全部楼层
eric2013 发表于 2018-5-8 01:19
这个bsp_timer.c文件里面是做两个功能,一个是滴答定时器的,一个是通用定时器的,使用通用定时器的要用 ...

例程是使用滴答定时器来使用延时功能的,我现在换成通用定时器,道理是一样的啊
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-8 08:49:16 | 显示全部楼层
eric2013 发表于 2018-5-8 01:21
你发的这个程序,没看出有什么问题

请问一下,为什么BUSY一直是高电平
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-8 17:57:35 | 显示全部楼层
王海靖 发表于 2018-5-8 08:24
例程是使用滴答定时器来使用延时功能的,我现在换成通用定时器,道理是一样的啊

我们那个不是做周期定时用的。是用来做单次定时触发用的,仅触发一次。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2018-5-8 17:58:24 | 显示全部楼层
王海靖 发表于 2018-5-8 08:49
请问一下,为什么BUSY一直是高电平

估计配置还是有问题。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2018-5-9 08:37:09 | 显示全部楼层
eric2013 发表于 2018-5-8 17:58
估计配置还是有问题。

没接好线,谢谢您了
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2019-7-11 21:23:46 | 显示全部楼层
eric2013 发表于 2018-5-8 17:57
我们那个不是做周期定时用的。是用来做单次定时触发用的,仅触发一次。

你好,我参考AD7606电路设计的电路用串口,测得AD7606   36、39,44,45脚电压都是0V,电压正常吗
还是我买的芯片有问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-7-12 09:44:04 | 显示全部楼层
青龙_NDpM6 发表于 2019-7-11 21:23
你好,我参考AD7606电路设计的电路用串口,测得AD7606   36、39,44,45脚电压都是0V,电压正常吗
还是我 ...

手头有我们的模块不,可以测试下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-7-12 09:51:26 | 显示全部楼层
青龙_NDpM6 发表于 2019-7-11 21:23
你好,我参考AD7606电路设计的电路用串口,测得AD7606   36、39,44,45脚电压都是0V,电压正常吗
还是我 ...

电压不正常,检查焊接问题

44 45 应该2.5V, 其它2个脚也不是0V
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 06:12 , Processed in 0.370998 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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