硬汉嵌入式论坛

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

[有问必答] 对于安富莱官方AD7606例程移植的一些问题求解

  [复制链接]

1

主题

1

回帖

35

积分

新手上路

积分
35
发表于 2018-4-8 16:42:17 | 显示全部楼层 |阅读模式
主要问题是不清楚为什么配置后busy总是高电平,读取数据为65535,程序配置是否出现了什么问题?恳请各位大神不吝赐教!!!感激不尽!

硬件接口如下:CS---->D7[NE1]  ,
RD---->D4[NOE]  ,
D0~D15同官方例程,即FSMC数据线,
os0/1--->D12/13,os2直接接地
range---->G2
convst---->G3
RESET---->G4
BUSY保留,FRSTDATA保留;

程序源码如下:
1、以下为.h文件:
typedef enum
{
        AD_OS_NO = 0,
        AD_OS_X2 = 1,
        AD_OS_X4 = 2,
        AD_OS_X8 = 3,
}AD7606_OS_E;

typedef struct
{
        uint8_t ucOS;                        /* 过采样倍率,0 - 6. 0表示无过采样 */
        uint8_t ucRange;                /* 输入量程,0表示正负5V, 1表示正负10V */
        int16_t sNowAdc[8];                /* 当前ADC值, 有符号数 */
}AD7606_VAR_T;

/* 设置过采样的GPIO: PD12 PD13 */
#define OS0_0()                GPIO_ResetBits(GPIOD,GPIO_Pin_12)
#define OS0_1()                GPIO_SetBits(GPIOD,GPIO_Pin_12)
#define OS1_0()                GPIO_ResetBits(GPIOD,GPIO_Pin_13)
#define OS1_1()                GPIO_SetBits(GPIOD,GPIO_Pin_13)

/* 设置输入量程的GPIO G2  */
#define RANGE_0()        GPIO_ResetBits(GPIOG,GPIO_Pin_2)
#define RANGE_1()        GPIO_SetBits(GPIOG,GPIO_Pin_2)

/* 启动AD转换的GPIO : PG3*/
#define CONVST_0()        GPIO_ResetBits(GPIOG,GPIO_Pin_3)
#define CONVST_1()        GPIO_SetBits(GPIOG,GPIO_Pin_3)

/* AD7606复位口线 : PG4  */
#define RESET_0()        GPIO_ResetBits(GPIOG,GPIO_Pin_4)
#define RESET_1()        GPIO_SetBits(GPIOG,GPIO_Pin_4)

/* AD7606 FSMC总线地址,只能读,无需写 */
#define AD7606_RESULT()        *(__IO uint16_t *)0x60000000


2、以下为.c文件:
void AD7606_config(void)//引脚初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟                  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOG, ENABLE);

        GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);
        
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);//noe
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC);//cs
        
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化GPIO
}

void AD7606_FSMC(void)
{
        FSMC_NORSRAMInitTypeDef  init;
  FSMC_NORSRAMTimingInitTypeDef  timing;

/* FSMC_Bank1_NORSRAM4 configuration */
  timing.FSMC_AddressSetupTime = 3;
  timing.FSMC_AddressHoldTime = 0;
  timing.FSMC_DataSetupTime = 6;
  timing.FSMC_BusTurnAroundDuration = 1;
  timing.FSMC_CLKDivision = 0;
  timing.FSMC_DataLatency = 0;
  timing.FSMC_AccessMode = FSMC_AccessMode_A;

  init.FSMC_Bank = FSMC_Bank1_NORSRAM1;
  init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  init.FSMC_MemoryType = FSMC_MemoryType_SRAM;
  init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  init.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  init.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
  init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  init.FSMC_WrapMode = FSMC_WrapMode_Disable;
  init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  init.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
  init.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  init.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
  init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;

  init.FSMC_ReadWriteTimingStruct = &timing;
  init.FSMC_WriteTimingStruct = &timing;

  FSMC_NORSRAMInit(&init);

/* - BANK 1 (of NOR/SRAM Bank 1~4) is enabled */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}

void AD7606_init(void)
{
        AD7606_config();
        AD7606_FSMC();
        AD7606_SetOS(AD_OS_NO);
        AD7606_SetInputRange(0);
        AD7606_Reset();
        AD7606_StartConvst();        
}
/*
*********************************************************************************************************
*        函 数 名: AD7606_SetOS
*        功能说明: 配置AD7606数字滤波器,也就设置过采样倍率。
*                         通过设置 AD7606_OS0、OS1、OS2口线的电平组合状态决定过采样倍率。
*                         启动AD转换之后,AD7606内部自动实现剩余样本的采集,然后求平均值输出。
*
*                         过采样倍率越高,转换时间越长。
*                         无过采样时,AD转换时间 4us;
*                                2倍过采样时 = 8.7us;
*                                4倍过采样时 = 16us
*                                 64倍过采样时 = 286us
*
*        形    参: _ucOS : 过采样倍率
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_SetOS(AD7606_OS_E _ucOS)
{
        g_tAD7606.ucOS = _ucOS;
        switch (_ucOS)
        {
                case AD_OS_X2:
                        OS1_0();
                        OS0_1();
                        break;

                case AD_OS_X4:
                        OS1_1();
                        OS0_0();
                        break;

                case AD_OS_X8:
                        OS1_1();
                        OS0_1();
                        break;

                case AD_OS_NO:
                default:
                        g_tAD7606.ucOS = AD_OS_NO;
                        OS1_0();
                        OS0_0();
                        break;
        }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_SetInputRange
*        功能说明: 配置AD7606模拟信号输入量程。
*        形    参: _ucRange : 0 表示正负5V   1表示正负10V
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_SetInputRange(uint8_t _ucRange)
{
        if (_ucRange == 0)
        {
                g_tAD7606.ucRange = 0;
                RANGE_0();        /* 设置为正负5V */
        }
        else
        {
                g_tAD7606.ucRange = 1;
                RANGE_1();        /* 设置为正负10V */
        }
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_Reset
*        功能说明: 硬件复位AD7606。复位之后恢复到正常工作状态。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_Reset(void)
{
    RESET_0();        

                RESET_1();        
                RESET_1();        
    RESET_1();
    RESET_1();

    RESET_0();        
}

/*
*********************************************************************************************************
*        函 数 名: AD7606_StartConvst
*        功能说明: 启动1次ADC转换
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_StartConvst(void)
{         
        /* page 7:  CONVST 高电平脉冲宽度和低电平脉冲宽度最短 25ns */
        /* CONVST平时为高 */
        CONVST_0();
        CONVST_0();
        CONVST_0();

        CONVST_1();
}
/*
*********************************************************************************************************
*        函 数 名: AD7606_ReadNowAdc
*        功能说明: 读取8路采样结果。结果存储在全局变量 g_tAD7606
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void AD7606_ReadNowAdc(void)
{
        g_tAD7606.sNowAdc[0] = AD7606_RESULT();        /* 读第1路样本 */
        g_tAD7606.sNowAdc[1] = AD7606_RESULT();        /* 读第2路样本 */
        g_tAD7606.sNowAdc[2] = AD7606_RESULT();        /* 读第3路样本 */
        g_tAD7606.sNowAdc[3] = AD7606_RESULT();        /* 读第4路样本 */
        g_tAD7606.sNowAdc[4] = AD7606_RESULT();        /* 读第5路样本 */
        g_tAD7606.sNowAdc[5] = AD7606_RESULT();        /* 读第6路样本 */
        g_tAD7606.sNowAdc[6] = AD7606_RESULT();        /* 读第7路样本 */
        g_tAD7606.sNowAdc[7] = AD7606_RESULT();        /* 读第8路样本 */
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-4-10 01:14:28 | 显示全部楼层
不好意思,楼主,刚看到你的问题还没有回复。

方便的话,看下你使用的FSMC接线图。
回复

使用道具 举报

1

主题

1

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2018-4-11 17:49:31 | 显示全部楼层
eric2013 发表于 2018-4-10 01:14
不好意思,楼主,刚看到你的问题还没有回复。

方便的话,看下你使用的FSMC接线图。

解决啦!程序是没问题的!主要是AD7606 2.5V电源的问题,多谢回复
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2018-8-30 00:01:32 | 显示全部楼层
楼主,麻烦问一下,你的程序里定义的
/* AD7606总线地址,只能读,无需写 */
#define AD 7606_RESULT()        *(__IO u in t 16 _t *) 0 x 60000000
你这里定义的地址总线地址与手册中是一致的。
官方例程里是
/* AD 7606 F S MC总线地址,只能读,无需写 */
#define AD 7606_RESULT()        *(__IO u in t 16_t *) 0 x 6 C 400000
例程选的是N E 4起始地址是0 x 6 c 000000,例程中比N E 4的起始地址偏移了o x 400000,请问这个设置有怎么算的,还说是这个偏移只要是16位的倍数都不影响?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-8-30 00:09:36 | 显示全部楼层
headic 发表于 2018-8-30 00:01
楼主,麻烦问一下,你的程序里定义的
/* AD7606总线地址,只能读,无需写 */
#define AD 7606_RESULT()   ...

这个是我们的开发板决定的,我们的开发板里面是NE4外接了一个译码器的。
QQ截图20180830000923.png
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2018-9-1 20:18:33 | 显示全部楼层
eric2013 发表于 2018-8-30 00:09
这个是我们的开发板决定的,我们的开发板里面是NE4外接了一个译码器的。

感谢管理员的回答,基本搞懂了,AD本身是没有地址的,不过片选的时候使用了FSMC的地址线,需要将FSMC_A21置1,而硬件管脚A21对应与地址的bit22,这确实是个神操作,多个设备的片选直接通过FSMC实现了。
https://blog.csdn.net/u011392772/article/details/72627513
其他人可以看看这个帖子写的,基本说清楚了。
虽然还有不懂的,但是基本明白了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-9-2 00:10:43 | 显示全部楼层
headic 发表于 2018-9-1 20:18
感谢管理员的回答,基本搞懂了,AD本身是没有地址的,不过片选的时候使用了FSMC的地址线,需要将FSMC_A21 ...

地址的说明看此贴就明白了:

http://www.armbbs.cn/forum.php?m ... 6&highlight=TFT
回复

使用道具 举报

0

主题

18

回帖

18

积分

新手上路

积分
18
发表于 2018-10-20 13:02:57 | 显示全部楼层
明白                                 
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2020-12-2 20:09:32 | 显示全部楼层
你好,我用这个例程,烧到stm32f407里面,串口都是0没有示数,这是怎么回事呢
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2020-12-2 21:05:10 | 显示全部楼层
上传不了图片吗?我用AD7606和stm32f407连接,波特率115200乱码,选38400,出来值全是0,不接5v电源,8通道采样是这样的


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2020-12-3 09:21:53 | 显示全部楼层
lindada652 发表于 2020-12-2 21:05
上传不了图片吗?我用AD7606和stm32f407连接,波特率115200乱码,选38400,出来值全是0,不接5v电源,8通道 ...

你是不是程序没有修改,直接使用的,波特率问题一般是时钟问题,你将HSE_VALUE设置到和你板子的实际晶振大小一致即可。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2020-12-4 09:57:13 | 显示全部楼层
你好,我把HSE_VALUE改成80000000就可以用115200了,但是采集不到数据,8通道都是0,这是怎么回事呢,我的GPIO口设置是这样的:
OS0-PB5
OS1-PB6
OS2-PB7
CVA-PC8
RAGE-PC11
RESET-PD5
BUSY-PD3
CS-PD7
RD-PD4


不接5v电源和接5v电源,结果没区别;用单片机供电5v和外电源供电也没什么区别,而且VIO是单片机的3.3V
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2020-12-4 13:43:33 | 显示全部楼层
1289505774 发表于 2018-4-11 17:49
**** 作者被禁止或删除 内容自动屏蔽 ****

楼主 请问AD7606 2.5V电源接哪里,VIO口接3.3v单片机电源的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2020-12-5 09:51:28 | 显示全部楼层
lindada652 发表于 2020-12-4 13:43
楼主 请问AD7606 2.5V电源接哪里,VIO口接3.3v单片机电源的

2.5V是AD7606内部参考电压。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 17:41 , Processed in 0.355292 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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