OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4559|回复: 3

stm32H750FMC驱动AD760(并行方式)

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-8-9
在线时间
3 小时
发表于 2021-8-9 21:17:03 | 显示全部楼层 |阅读模式
H750串口定时输出读取,现在的问题是给一个3.3V电压输入,串口输出数值不对,有没有大佬可以指点一下

//数据引脚定义
FMC_D0->PD14
FMC_D1->PD15
FMC_D2->PD0
FMC_D3->PD1
FMC_D4->PE7
FMC_D5->PE8
FMC_D6->PE9
FMC_D7->PE10
FMC_D8->PE11
FMC_D9->PE12
FMC_D10->PE13
FMC_D11->PE14
FMC_D12->PE15
FMC_D13->PD8
FMC_D14->PD9
FMC_D15->PD10

//信号引脚
FMC_NOE->PD4
FMC_CS->PC7

//控制引脚
BUSY->PE6
CONVEST->PC6
OS0->PC8
OS1->PC9
OS2->PC10
RANGE->PC11
RESET->PC12

代码如下
#include "ad7606.h"
#include "stdio.h"
#include "bsp_SysTick.h"

#define OS0_0()                GPIOC->BSRR = ((uint32_t)GPIO_PIN_8<<16U)
#define OS0_1()                GPIOC->BSRR = GPIO_PIN_8
#define OS1_0()                GPIOC->BSRR = ((uint32_t)GPIO_PIN_9<<16U)
#define OS1_1()                GPIOC->BSRR = GPIO_PIN_9
#define OS2_0()                GPIOC->BSRR = ((uint32_t)GPIO_PIN_10<<16U)
#define OS2_1()                GPIOC->BSRR = GPIO_PIN_10

#define CONVST_1()        GPIOC->BSRR = GPIO_PIN_6
#define CONVST_0()        GPIOC->BSRR = ((uint32_t)GPIO_PIN_6<<16U)

/*éè&#214;&#195;ê&#228;è&#235;á&#191;3ìμ&#196;GPIO: PC11 */
#define RANGE_1()        GPIOC->BSRR = GPIO_PIN_11
#define RANGE_0()        GPIOC->BSRR = ((uint32_t)GPIO_PIN_11<<16U)

/*AD7606&#184;′&#206;&#187;&#191;ú&#207;&#223; : PC12*/
#define RESET_1()        GPIOC->BSRR = GPIO_PIN_12
#define RESET_0()        GPIOC->BSRR = ((uint32_t)GPIO_PIN_12<<16U)

/*AD7606 FSMC×ü&#207;&#223;μ&#216;&#214;·£&#172;&#214;&#187;&#196;ü&#182;á,&#206;TDèD′ */
#define AD7606_RESULT()        *(__IO uint16_t *)0x60000000

AD7606_VAR_T g_tAD7606;                        /* &#182;¨ò&#229;1&#184;&#246;è&#171;&#190;&#214;±&#228;á&#191;£&#172;±£′&#230;ò&#187;D&#169;2&#206;êy */
AD7606_FIFO_T g_tAdcFifo;                /* &#182;¨ò&#229;FIFO&#189;á11ì&#229;±&#228;á&#191; */

static void AD7606_CtrlLinesConfig(void);
static void AD7606_FSMCConfig(void);

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

        AD7606_SetOS(AD_OS_NO);               
        AD7606_SetInputRange(0);

        AD7606_Reset();

        CONVST_1();                                       
}
/***********************************************

***********************************************/
static void AD7606_CtrlLinesConfig(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOC_CLK_ENABLE();
        __HAL_RCC_GPIOD_CLK_ENABLE();
        __HAL_RCC_GPIOE_CLK_ENABLE();
       
        __HAL_RCC_FMC_CLK_ENABLE();
       
        GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStructure.Pull = GPIO_NOPULL;
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStructure.Alternate = GPIO_AF12_FMC;
       
        /* &#197;&#228;&#214;&#195;GPIOD */
        GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |
                                 GPIO_PIN_14 |GPIO_PIN_15;
        HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
        /* &#197;&#228;&#214;&#195;GPIODE*/
        GPIO_InitStructure.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;
        HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
       
        {
                GPIO_InitTypeDef   GPIO_InitStructure;
                __HAL_RCC_GPIOC_CLK_ENABLE();
               
                GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;               
                GPIO_InitStructure.Pull = GPIO_NOPULL;                               
                GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM;         
               
                GPIO_InitStructure.Pin=GPIO_PIN_6|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
                HAL_GPIO_Init(GPIOC,&GPIO_InitStructure);       
        }
}

/********************************
*        oˉ êy &#195;&#251;: AD7606_FSMCConfig
*        1|&#196;ü&#203;μ&#195;÷: &#197;&#228;&#214;&#195;FSMC2¢&#191;ú·&#195;&#206;êê±Dò
********************************/
static void AD7606_FSMCConfig(void)
{
       
        SRAM_HandleTypeDef hsram = {0};
        FMC_NORSRAM_TimingTypeDef SRAM_Timing = {0};

        hsram.Instance  = FMC_NORSRAM_DEVICE;
        hsram.Extended  = FMC_NORSRAM_EXTENDED_DEVICE;
       
        /* FMCê1ó&#195;μ&#196;HCLK3£&#172;&#214;÷&#198;μ200MHz£&#172;1&#184;&#246;FMCê±&#214;ó&#214;ü&#198;ú&#190;íê&#199;5ns */
        SRAM_Timing.AddressSetupTime       = 5;  
        SRAM_Timing.AddressHoldTime        = 2;
        SRAM_Timing.DataSetupTime          = 5;  
        SRAM_Timing.BusTurnAroundDuration  = 1;  
        SRAM_Timing.CLKDivision            = 2;  
        SRAM_Timing.DataLatency            = 2;  
        SRAM_Timing.AccessMode             = FMC_ACCESS_MODE_A;

        hsram.Init.NSBank             = FMC_NORSRAM_BANK1;            
        hsram.Init.DataAddressMux     = FMC_DATA_ADDRESS_MUX_DISABLE;   
        hsram.Init.MemoryType         = FMC_MEMORY_TYPE_SRAM;         
        hsram.Init.MemoryDataWidth    = FMC_NORSRAM_MEM_BUS_WIDTH_16;       
        hsram.Init.BurstAccessMode    = FMC_BURST_ACCESS_MODE_DISABLE;  
        hsram.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;   
        hsram.Init.WaitSignalActive   = FMC_WAIT_TIMING_BEFORE_WS;      
        hsram.Init.WriteOperation     = FMC_WRITE_OPERATION_ENABLE;     
        hsram.Init.WaitSignal         = FMC_WAIT_SIGNAL_DISABLE;        
        hsram.Init.ExtendedMode       = FMC_EXTENDED_MODE_DISABLE;     
        hsram.Init.AsynchronousWait   = FMC_ASYNCHRONOUS_WAIT_DISABLE;  
        hsram.Init.WriteBurst         = FMC_WRITE_BURST_DISABLE;      
        hsram.Init.ContinuousClock    = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
  hsram.Init.WriteFifo          = FMC_WRITE_FIFO_ENABLE;         

        /* 3&#245;ê&#188;&#187;ˉSRAM&#191;&#216;&#214;&#198;&#198;÷ */
        if(HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing)!=HAL_OK)
        {
                while(1){;}
        }
}

/****************************************

**************************************/

void AD7606_SetOS(uint8_t _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;
        }
}

/***************************************
*        oˉ êy &#195;&#251;: AD7606_SetInputRange
*        1|&#196;ü&#203;μ&#195;÷: &#197;&#228;&#214;&#195;AD7606&#196;£&#196;aD&#197;o&#197;ê&#228;è&#235;á&#191;3ì&#161;£

***************************************/
void AD7606_SetInputRange(uint8_t _ucRange)
{
        if(_ucRange == 0)
        {
                g_tAD7606.ucRange = 0;
                RANGE_0();       
        }
        else
        {
                g_tAD7606.ucRange = 1;
                RANGE_1();       
        }
}

/**********************************
*        oˉ êy &#195;&#251;: AD7606_Reset
*        1|&#196;ü&#203;μ&#195;÷: ó2&#188;t&#184;′&#206;&#187;AD7606£&#172;&#184;′&#206;&#187;&#214;&#174;oó&#187;&#214;&#184;′μ&#189;&#213;y3£1¤×÷×′ì&#172;&#161;£
***********************************/
void AD7606_Reset(void)
{
        RESET_0();        /* í&#203;3&#246;&#184;′&#206;&#187;×′ì&#172; */
       
        RESET_1();        /* &#189;&#248;è&#235;&#184;′&#206;&#187;×′ì&#172; */
        RESET_1();       
        RESET_1();
        RESET_1();
       
        RESET_0();        /* í&#203;3&#246;&#184;′&#206;&#187;×′ì&#172; */
}

/***********************************
*        oˉ êy &#195;&#251;: AD7606_StartConvst
*        1|&#196;ü&#203;μ&#195;÷: &#198;&#244;&#182;ˉ1′&#206;ADC×a&#187;&#187;
************************************/
void AD7606_StartConvst(void)
{
       
        /* CONVST&#198;&#189;ê±&#206;a&#184;&#223; */
        CONVST_0();
        CONVST_0();
        CONVST_0();
        delay_us(1);
        CONVST_1();
}

/*********************************************
*        oˉ êy &#195;&#251;: AD7606_ReadNowAdc
*        1|&#196;ü&#203;μ&#195;÷: &#182;áè&#161;8&#194;·2é&#209;ù&#189;á1&#251;&#161;£&#189;á1&#251;′&#230;′¢&#212;úè&#171;&#190;&#214;±&#228;á&#191; g_tAD7606
**********************************************/
void AD7606_ReadNowAdc(void)
{
        g_tAD7606.sNowAdc[0] = AD7606_RESULT();       
        g_tAD7606.sNowAdc[1] = AD7606_RESULT();       
        g_tAD7606.sNowAdc[2] = AD7606_RESULT();       
        g_tAD7606.sNowAdc[3] = AD7606_RESULT();       
        g_tAD7606.sNowAdc[4] = AD7606_RESULT();
        g_tAD7606.sNowAdc[5] = AD7606_RESULT();       
        g_tAD7606.sNowAdc[6] = AD7606_RESULT();       
        g_tAD7606.sNowAdc[7] = AD7606_RESULT();
}
————————————————————————————————————————————————————
定时中断读取
void TIM3_IRQHandler(void)
{
        if((TIM3->SR & TIM_FLAG_UPDATE) != RESET)
        {
                AD7606_StartConvst();               
                AD7606_ReadNowAdc();               
                ucRefresh=1;
                HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
                TIM3->SR = ~ TIM_FLAG_UPDATE;
        }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4309
金钱
4309
注册时间
2019-9-4
在线时间
896 小时
发表于 2021-8-10 10:50:30 | 显示全部楼层
回复 支持 反对

使用道具 举报

4

主题

896

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4309
金钱
4309
注册时间
2019-9-4
在线时间
896 小时
发表于 2021-8-10 10:51:13 | 显示全部楼层
其实排查也就大概两个地方,一个是读取,一个是输出
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2021-8-9
在线时间
3 小时
 楼主| 发表于 2021-8-12 19:35:50 | 显示全部楼层
A571157242 发表于 2021-8-10 10:50
没用过AD760,帮顶

我写错了,是AD7606,大佬用过吗

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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