硬汉嵌入式论坛

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

[有问必答] AD7606程序求助

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2016-12-8 15:49:04 | 显示全部楼层 |阅读模式
请教:例程中是通过配置fmsc并口访问        #define AD7606_RESULT()    *(__IO uint16_t *)0x6C400000, 我可不可以直接通过配置并口模式访问,直接读取DB对应管脚的值就可以了,以下是我的程序,请指导:
/****************************************************************************************************************************************

        PA10             ---> AD7606_OS0                OS2:OS0 选择数字滤波参数
    PA11                        ---> AD7606_OS1
    PA12                        ---> AD7606_OS2
    PC15                       ---> AD7606_CONVSTA/B    启动ADC转换 (CONVSTA 和 CONVSTB 已经并联)
    +3.3V                       ---> AD7606_RAGE              输入模拟电压量程,正负5V或正负10V
    PE14                        ---> AD7606_RESET            复位
       PE13                        ---> AD7606_RD                    总线读信号
       PC11                        ---> AD7606_CS                    片选
       PC13                       < ---AD7606_BUSY                    忙信号   
      PD0---15                  < ---DB0---15
****************************************************************************************************************************************/





/**********************************************************************************************************    函 数 名: AD7606_Init
*    功能说明: 配置连接外部SRAM的GPIO和FSMC*    形    参:  无
*    返 回 值: 无*********************************************************************************************************/
void AD7606_Init(void){
    AD7606_CtrlLinesConfig();    AD7606_Set_Over_Sampling(AD_OS_NO);        /* 无过采样 */
    AD7606_Reset();    //AD7606_CONVST = 1;                    /* 启动转换的GPIO平时设置为高 */
}

/**********************************************************************************************************    函 数 名: AD7606_CtrlLinesConfig
*    功能说明: 配置LCD控制口线,FSMC管脚设置为复用功能*    形    参:  无
*    返 回 值: 无*********************************************************************************************************/

static void AD7606_CtrlLinesConfig(void){
    GPIO_InitTypeDef GPIO_Initure;    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();      
    GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|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; //PD0---15    GPIO_Initure.Mode=GPIO_MODE_INPUT;   
    GPIO_Initure.Pull=GPIO_PULLDOWN;              GPIO_Initure.Speed=GPIO_SPEED_HIGH;      
    HAL_GPIO_Init(GPIOD,&GPIO_Initure);

    GPIO_Initure.Pin=GPIO_PIN_10|GPIO_PIN_13; //PC10......FRSTDATA  PC13......BUSY    HAL_GPIO_Init(GPIOC,&GPIO_Initure);

    GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10; //PA8,9,10......OS    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
    GPIO_Initure.Pull=GPIO_NOPULL;           GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);      
      GPIO_Initure.Pin=GPIO_PIN_1;     //PH1......ADC_SEL    HAL_GPIO_Init(GPIOH,&GPIO_Initure);

    GPIO_Initure.Pin=GPIO_PIN_15;    //PC15.....CONVEST       HAL_GPIO_Init(GPIOC,&GPIO_Initure);

    GPIO_Initure.Pin=GPIO_PIN_13;    //PE13.....RD      HAL_GPIO_Init(GPIOE,&GPIO_Initure);

    GPIO_Initure.Pin=GPIO_PIN_11;    //PC11.....CS1      HAL_GPIO_Init(GPIOC,&GPIO_Initure);   

    GPIO_Initure.Pin=GPIO_PIN_14;    //PC14.....CS0      HAL_GPIO_Init(GPIOC,&GPIO_Initure);     
}


/**********************************************************************************************************
*    函 数 名: AD7606_Set_Over_Sampling*    功能说明: 配置AD7606数字滤波器,也就设置过采样倍率。
*             通过设置 AD7606_OS0、OS1、OS2口线的电平组合状态决定过采样倍率。*             启动AD转换之后,AD7606内部自动实现剩余样本的采集,然后求平均值输出。
**             过采样倍率越高,转换时间越长。
*             无过采样时,AD转换时间 4us;*             2倍过采样时 = 8.7us;
*             4倍过采样时 = 16us*              64倍过采样时 = 286us
**    形    参: Set_OS : 过采样倍率, 0 - 6
*    返 回 值: 无*********************************************************************************************************
*/static void AD7606_Set_Over_Sampling(uint8_t Set_OS)
{    GET_AD7606.AD_OS = Set_OS;
    switch (Set_OS)    {
        case AD_OS_X2:                AD7606_OS2 = 0;
                AD7606_OS1 = 0;                AD7606_OS0 = 1;
                break;

        case AD_OS_X4:                AD7606_OS2 = 0;
                AD7606_OS1 = 1;                AD7606_OS0 = 0;
                break;

        case AD_OS_X8:                AD7606_OS2 = 0;
                AD7606_OS1 = 1;                AD7606_OS0 = 1;
                break;

        case AD_OS_X16:                AD7606_OS2 = 1;
                AD7606_OS1 = 0;                AD7606_OS0 = 0;
                break;

        case AD_OS_X32:                AD7606_OS2 = 1;
                AD7606_OS1 = 0;                AD7606_OS0 = 1;
                break;

        case AD_OS_X64:                AD7606_OS2 = 1;
                AD7606_OS1 = 1;                AD7606_OS0 = 0;
                break;

        case AD_OS_NO:        default:
                GET_AD7606.AD_OS = AD_OS_NO;                AD7606_OS2 = 0;
                AD7606_OS1 = 0;                AD7606_OS0 = 0;
                break;    }
}/*
**********************************************************************************************************    函 数 名: AD7606_Reset
*    功能说明: 硬件复位AD7606。复位之后恢复到正常工作状态。*    形    参: 无
*    返 回 值: 无*********************************************************************************************************
*/static void AD7606_Reset(void)
{        AD7606_RESET = 0;    // 退出复位状态

        AD7606_RESET = 1;    // 进入复位状态         /*AD7606_RESET = 1;    // 仅用于延迟。 RESET复位高电平脉冲宽度最小50ns。
        AD7606_RESET = 1;        AD7606_RESET = 1;*/
        delay_us(60);        AD7606_RESET = 0;    /* 退出复位状态 */
}

/**********************************************************************************************************
*    函 数 名: AD7606_StartConvst*    功能说明: 启动1次ADC转换
*    形    参: 无*    返 回 值: 无
**********************************************************************************************************/
void AD7606_StartConvst(void){
    /* CONVST 高电平脉冲宽度和低电平脉冲宽度最短 25ns */    /* CONVST平时为高 */
    AD7606_CONVST = 0;    /*AD7606_CONVST = 0;
    AD7606_CONVST = 0;*/    delay_us(20);
    AD7606_CONVST = 1;}
/**********************************************************************************************************
*    函 数 名: AD7606_ReadNowAdc*    功能说明: 读取8路采样结果。结果存储在全局变量 g_tAD7606
*    形    参: 无*    返 回 值: 无
**********************************************************************************************************/
void AD7606_ReadNowAdc(void){
    delay_us(100);    uint16_t iTemp1,iTemp2,iTemp = 0;
    iTemp=HAL_GPIO_Read(GPIOD);    //while(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10));
    while(!AD7606_BUSY);//等待转换完成    AD7606_CS0 = 0;
    for(int i=0;i<8;i++)    {
        AD7606_RD = 0;        delay_us(30);
        ADbuffer=HAL_GPIO_Read(GPIOD)-iTemp;        delay_us(10);
        AD7606_RD = 1;        delay_us(15);
    }    AD7606_CS0 = 1;
    AD7606_CONVST = 0;    delay_us(10);
    AD7606_CS0 = 1;    delay_us(10);  
}

请帮忙看看  谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2016-12-9 09:08:40 | 显示全部楼层
需要定时器配合,应该为依次读取8个通道,具体你可以多测试测试。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2016-12-9 14:11:23 | 显示全部楼层
目前板子还没回来  回来后测试
如果我不用定时器  单独检测busy信号    如果转换完成直接读取通道的值是否可以?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2016-12-10 11:28:40 | 显示全部楼层
你测试下,具体我没有用过这个模块,这个模块是其他人做的。
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2016-12-10 18:19:58 | 显示全部楼层
不用定时器转换完可以直接读。你判不判断BUSY都无所谓。給启动脉冲,延迟,读数就行了。 也可以 读数 - 启动 -延迟。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2016-12-12 11:24:25 | 显示全部楼层
好的  谢谢  板子还没回来   测试后再讨论
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
QQ
发表于 2017-5-17 13:09:12 | 显示全部楼层
你们好,想请教下AD7606通过FSMC采集到数据用串口打印的程序,方便帮忙看看吗?串口打开成功却没有打印数据
#include "ad7606.h"

#include "delay.h"

/* AD7606 FSMC总线地址,只能读,无需写 */

//#define AD7606_RESULT()    *(u32 *)(0x6C000000)
//#define AD7606_RESULT()    *(__IO int16_t *)0x6C000000
#define AD7606_RESULT()    *(__IO uint16_t *)0x6C400000

AD7606_VAR_T g_tAD7606;        /* 定义1个全局变量,保存一些参数 */
AD7606_FIFO_T g_tAdcFifo;    /* 定义FIFO结构体变量 */

/* 片选PB4 */
#define AD_CS_0()            GPIO_ResetBits(GPIOB, GPIO_Pin_4)
#define AD_CS_1()            GPIO_SetBits(GPIOB, GPIO_Pin_4)

/* 读 */
#define AD_RD_0()            GPIO_ResetBits(GPIOD, GPIO_Pin_4)
#define AD_RD_1()            GPIO_SetBits(GPIOD, GPIO_Pin_4)

/* 设置过采样的GPIO*/
#define OS0_1()        GPIOA->BSRRL = GPIO_Pin_8
#define OS0_0()        GPIOA->BSRRH = GPIO_Pin_8
#define OS1_1()        GPIOC->BSRRL = GPIO_Pin_9
#define OS1_0()        GPIOC->BSRRH = GPIO_Pin_9
#define OS2_1()        GPIOC->BSRRL = GPIO_Pin_8
#define OS2_0()        GPIOC->BSRRH = GPIO_Pin_8

/* 启动AD转换的GPIO:PC7 TIM3,ch2 */
#define CONVST_1()    GPIOC->BSRRL = GPIO_Pin_7
#define CONVST_0()    GPIOC->BSRRH = GPIO_Pin_7

/* 判断忙否 */
#define BUSY    PBout(15)

/* AD7606复位口线 : PB1  */
#define RESET_1()    GPIOB->BSRRL = GPIO_Pin_1
#define RESET_0()    GPIOB->BSRRH = GPIO_Pin_1

/*
    开发板接线方法:

    PD0/FSMC_D2
    PD1/FSMC_D3
    PD4/FSMC_NOE        --- 读控制信号,OE = Output Enable , N 表示低有效
    PD5/FSMC_NWE        --- 写控制信号,AD7606 只有读,无写信号
    PD8/FSMC_D13
    PD9/FSMC_D14
    PD10/FSMC_D15

    PD14/FSMC_D0
    PD15/FSMC_D1
   
    PE7/FSMC_D4
    PE8/FSMC_D5
    PE9/FSMC_D6
    PE10/FSMC_D7
    PE11/FSMC_D8
    PE12/FSMC_D9
    PE13/FSMC_D10
    PE14/FSMC_D11
    PE15/FSMC_D12

    PD7/FSMC_NE2        --- 主片选(TFT, OLED 和 AD7606)
   
    几个控制用的GPIO
            PA8/DCMI_D0/AD7606_OS0            ---> AD7606_OS0        OS2:OS0 选择数字滤波参数
            PC9/DCMI_D1/AD7606_OS1         ---> AD7606_OS1
            PC8/DCMI_D2/AD7606_OS2         ---> AD7606_OS2
            PC7/DCMI_D3/AD7606_CONVST      ---> AD7606_CONVST    启动ADC转换
            PB1/DCMI_D5/AD7606_RESET        ---> AD7606_RESET    复位

            PB15/DCMI_D6/AD7606_BUSY            ---> AD7606_BUSY    转换结束的信号
*/

static void AD7606_CtrlLinesConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* 使能FSMC时钟 */
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

    /* 使能 GPIO时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);

    /* 设置 PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
     PD.10(D15), PD.14(D0), PD.15(D1) 为复用推挽输出 */

    GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
    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_5 |
                                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_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /*
        PE4/FSMC_A20        --- 和主片选一起译码
        PE5/FSMC_A21        --- 和主片选一起译码

        PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
         PE.14(D11), PE.15(D12)
    */
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FSMC);
    GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FSMC);

    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_4 | GPIO_Pin_5 | 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_Init(GPIOE, &GPIO_InitStructure);

    /* 设置 PD7(NCE2) 为复用推挽输出 */
    GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
   
    /*    配置几个控制用的GPIO
            PA8/DCMI_D0/AD7606_OS0            ---> AD7606_OS0        OS2:OS0 选择数字滤波参数
            PC9/DCMI_D1/AD7606_OS1         ---> AD7606_OS1
            PC8/DCMI_D2/AD7606_OS2         ---> AD7606_OS2
            PC7/DCMI_D3/AD7606_CONVST      ---> AD7606_CONVST    启动ADC转换
            PB1/DCMI_D5/AD7606_RESET        ---> AD7606_RESET    复位

            PB15/DCMI_D6/AD7606_BUSY            ---> AD7606_BUSY    转换结束的信号
        */

    {
        /* 使能 GPIO时钟 */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD,ENABLE);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;//OS1,OS2,Convt
        GPIO_Init(GPIOC,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // OS0
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4; //reset cs
        GPIO_Init(GPIOB,&GPIO_InitStructure);
    }
}

void AD7606_SetOS(AD7606_OS_E _ucOS)
{
    g_tAD7606.ucOS = _ucOS;
    switch (_ucOS)
    {
        case AD_OS_X2:
            OS2_0();
            OS1_0();
            OS0_1();
            break;

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

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

        case AD_OS_X16:
            OS2_1();
            OS1_0();
            OS0_0();
            break;

        case AD_OS_X32:
            OS2_1();
            OS1_0();
            OS0_1();
            break;

        case AD_OS_X64:
            OS2_1();
            OS1_1();
            OS0_0();
            break;

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

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

    RESET_1();    /* 进入复位状态 */
    RESET_1();    /* 仅用于延迟。 RESET复位高电平脉冲宽度最小50ns。 */
    RESET_1();
    RESET_1();

    RESET_0();    /* 退出复位状态 */
}

void AD7606_StartConvst(void)
{
    /* page 7:  CONVST 高电平脉冲宽度和低电平脉冲宽度最短 25ns */
    /* CONVST平时为高 */
    CONVST_0();
    CONVST_0();
    CONVST_0();

    CONVST_1();
}

static void AD7606_FSMCConfig(void)
{
    FSMC_NORSRAMInitTypeDef  init;
    FSMC_NORSRAMTimingInitTypeDef  timing;
    /*
        AD7606规格书要求(3.3V时):RD读信号低电平脉冲宽度最短21ns,高电平脉冲最短宽度15ns。

        按照如下配置 读数均正常。为了和同BANK的LCD配置相同,选择3-0-6-1-0-0
        3-0-5-1-0-0  : RD高持续75ns, 低电平持续50ns.  1us以内可读取8路样本数据到内存。
        1-0-1-1-0-0  : RD高75ns,低电平执行12ns左右,下降沿差不多也12ns.  数据读取正确。
        FSMC_Bank1_NORSRAM2 configuration
    */
    AD_CS_1();
    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;
    AD_CS_0();
    AD_CS_1();
   
    /*
     LCD configured as follow:
        - Data/Address MUX = Disable
        - Memory Type = SRAM
        - Data Width = 16bit
        - Write Operation = Enable
        - Extended Mode = Enable
        - Asynchronous Wait = Disable
    */
    init.FSMC_Bank = FSMC_Bank1_NORSRAM2;
    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_NORSRAM2, ENABLE);
}

void AD7606_ReadNowAdc(void)
{
//     int i;
//     delay_us(100);  
//  
//   
//    while(BUSY);//等待转换完成    AD7606_CS0 = 0;
//    for(i=0;i<8;i++)  
//  {
//        AD_RD_0();      
//                delay_us(30);
//        g_tAD7606.sNowAdc= AD7606_RESULT();      
//                delay_us(10);
//        AD_RD_1();        
//                delay_us(15);
//    }   
//        AD_CS_1();
//    CONVST_0();   
//        delay_us(10);
//    AD_CS_1();
//    delay_us(10);  
   
    AD_CS_0();
    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路样本 */
    AD_CS_1();
   
}

void AD7606_EnterAutoMode(uint32_t _ulFreq)   // 采样频率
{
    /* 配置PC7为复用功能,TIM3_CH2 . 执行后bsp_InitAD7606()对PC7口线的配置将失效 */
    {
        GPIO_InitTypeDef GPIO_InitStructure;

        /*时钟使能:定时器和GPIO*/
        /* TIM3 clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

        /* GPIOC clock enable */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

        /* GPIOH Configuration: PC7  -> TIM3 CH2 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   //复用功能输出 必须
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
        GPIO_Init(GPIOC, &GPIO_InitStructure);  //初始化IO

        /* Connect TIM3 pins to AF2 */
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);      //复用映射
    }

    /* PC7输出PWM波 */
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        uint32_t uiTIMxCLK;
        uint16_t usPrescaler;
        uint16_t usPeriod;
        uiTIMxCLK = SystemCoreClock / 2;
        
        if (_ulFreq < 3000)
        {
            usPrescaler = 100 - 1;                    /* 分频比 = 10 */
            usPeriod =  (uiTIMxCLK / 100) / _ulFreq  - 1;        /* 自动重装的值 */
        }
        else    /* 大于4K的频率,无需分频 */
        {
            usPrescaler = 0;                    /* 分频比 = 1 */
            usPeriod = uiTIMxCLK / _ulFreq - 1;    /* 自动重装的值 */
        }
        
        /* Time base configuration */
        TIM_TimeBaseStructure.TIM_Period = usPeriod;
        TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化时基单元

        /* PWM1 Mode configuration: Channel1 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //模式一
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 4;   //比较器的值
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //有效极性为低

        TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //通道初始化

        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能预装载

        TIM_ARRPreloadConfig(TIM3, ENABLE);  //使能自动预装载立即生效

        TIM_Cmd(TIM3, ENABLE);  //使能定时器
    }
        
            /* 配置PB15, BUSY 作为中断输入口,下降沿触发 */
        {
            EXTI_InitTypeDef   EXTI_InitStructure;
            GPIO_InitTypeDef   GPIO_InitStructure;
            NVIC_InitTypeDef   NVIC_InitStructure;
            RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
            
        /* Enable SYSCFG clock
            系统配置控制器主要用于管理对可执行代码的存储区的地址重映射。
            选择以太网PHY接口以及管理GPIO的外部中断连接 必须开启的时钟
        */
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
            
            /* Configure PB15 pin as input floating */
            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
            GPIO_Init(GPIOB, &GPIO_InitStructure);
            
            /* Connect EXTI Line15 to PB15 pin */
            SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource15); //IO口与中断线的映射关系
            /* Configure EXTI Line15 10 */
            EXTI_InitStructure.EXTI_Line = EXTI_Line15;
            EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //模式:中断还是事件
            EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发

            //EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
            EXTI_InitStructure.EXTI_LineCmd = ENABLE;
            EXTI_Init(&EXTI_InitStructure);  //初始化中断线
            
            /* Enable and set EXTI Line15 Interrupt to the lowest priority */
            NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
            NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
            NVIC_Init(&NVIC_InitStructure);  //中断优先级
        }
}

/* 定时采集函数,中断里调用 */
void AD7606_ISR(void)
{
    uint8_t i;
    AD7606_ReadNowAdc();
        for (i = 0; i < 8; i++)
    {
        g_tAdcFifo.sBuf[g_tAdcFifo.usWrite] = g_tAD7606.sNowAdc;
        if (++g_tAdcFifo.usWrite >= ADC_FIFO_SIZE)
        {
            g_tAdcFifo.usWrite = 0;
        }
        if (g_tAdcFifo.usCount < ADC_FIFO_SIZE)
        {
            g_tAdcFifo.usCount++;
        }
        else
        {
            g_tAdcFifo.ucFull = 1;        /* FIFO 满,主程序来不及处理数据 */
        }
    }
   
}

/*线15的中断服务函数*/
void EXTI15_10_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line15) != RESET)
    {
        AD7606_ISR();

        /* Clear the EXTI line 6 pending bit */
        EXTI_ClearITPendingBit(EXTI_Line15);
    }
}

/*判断FIFO中是否有新数据*/
uint8_t AD7606_HasNewData(void)
{
    if (g_tAdcFifo.usCount > 0)
    {
        return 1;
    }
    return 0;
}

/*判断FIFO是否满*/
uint8_t AD7606_FifoFull(void)
{
    return g_tAdcFifo.ucFull;
}

/*从FIFO中读取一个ADC值*/
uint8_t AD7606_ReadFifo(uint16_t *_usReadAdc)
{
    if (AD7606_HasNewData())
    {
        *_usReadAdc = g_tAdcFifo.sBuf[g_tAdcFifo.usRead];
        if (++g_tAdcFifo.usRead >= ADC_FIFO_SIZE)
        {
            g_tAdcFifo.usRead = 0;
        }

        //DISABLE_INT();
        if (g_tAdcFifo.usCount > 0)
        {
            g_tAdcFifo.usCount--;
        }
        ENABLE_INT();
        return 1;
    }
    return 0;
}

/*停止采集定时器*/
void AD7606_StopRecord(void)
{
    TIM_Cmd(TIM3, DISABLE);

    /* 将PC7 重新配置为普通输出口 */
    {
        GPIO_InitTypeDef GPIO_InitStructure;

        /* 使能 GPIO时钟 */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOH, &GPIO_InitStructure);
    }

    CONVST_1();                    /* 启动转换的GPIO平时设置为高 */    \\
}


/*开始采集*/
void AD7606_StartRecord(uint32_t _ulFreq)
{
    AD7606_StopRecord();

    AD7606_Reset();                    /* 复位硬件 */
    AD7606_StartConvst();            /* 启动采样,避免第1组数据全0的问题 */

    g_tAdcFifo.usRead = 0;            /* 必须在开启TIM2之前清0 */
    g_tAdcFifo.usWrite = 0;
    g_tAdcFifo.usCount = 0;
    g_tAdcFifo.ucFull = 0;

    AD7606_EnterAutoMode(_ulFreq);
}


void bsp_InitAD7606(void)
{
    AD7606_CtrlLinesConfig();
    AD7606_FSMCConfig();

    AD7606_SetOS(AD_OS_NO);        /* 无过采样 */

    AD7606_Reset();

    CONVST_1();                    /* 启动转换的GPIO平时设置为高 */
}

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "ad7606.h"


int main(void)
{
    uint8_t ucFifoMode = 0;
    uint8_t ucRefresh = 0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);  //初始化延时函数
//    TIM2_Int_Init(1999,8399);  /* 启动1个200ms的自动重装的定时器 */
    uart_init(115200);//初始化串口
    bsp_InitAD7606();
    AD7606_StartConvst();        /* 启动1次转换 */
   
    while(1)
    {
    if (ucRefresh == 1)
        {
            ucRefresh = 0;
            
            /* 打印ADC采样结果 */
            //printf("OS = %d\\r", g_tAD7606.ucOS);
            printf("CH0 = %6d\\r\\n",g_tAD7606.sNowAdc[0]);
            printf("CH7 = %6d\\r\\n",g_tAD7606.sNowAdc[7]);   

//            USART_SendData(USART1,(u16)g_tAD7606.sNowAdc[0]);
            delay_ms(500);
//            printf("CH1 = %6d\\r, CH2 = %6d\\r, CH3 = %6d\\r, CH4 = %6d\\r\\n",
//                g_tAD7606.sNowAdc[0], g_tAD7606.sNowAdc[1], g_tAD7606.sNowAdc[2], g_tAD7606.sNowAdc[3]);
//            printf("CH5 = %6d\\r, CH6 = %6d\\r, CH7 = %6d\\r, CH8 = %6d\\r",
//                g_tAD7606.sNowAdc[4], g_tAD7606.sNowAdc[5], g_tAD7606.sNowAdc[6], g_tAD7606.sNowAdc[7]);
        }        
        
        if (ucFifoMode == 0)    /* AD7606 普通工作模式 */
        {
//                if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
//                {
//            
              AD7606_ReadNowAdc();        /* 读取采样结果 */
                AD7606_StartConvst();        /* 启动下次转换 */
            
                ucRefresh = 1;    /* 刷新显示 */
//                }
        }
    };
}
沧海寄余生
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 17:47 , Processed in 0.290184 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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