|
硬汉大哥,现在做项目用H750驱动AD7606(并口8080时序的),用的你们的驱动调试,
出现的问题是:串口读数一开始8个通道为-1,在采集口接入3.3V电压后8个通道读数为2669
FMC的接线如下:
接线配置:
PE6/BUSY
PC6/CONVST
PC8/OS0
PC9/OS1
PC10/OS2
PC11/RANGE
PC12/RESET
PD0/FMC_D2
PD1/FMC_D3
PD4/FMC_NOE
PD7/FMC_NE1
PD8/FMC_D13
PD9/FMC_D14
PD10/FMC_D15
PD14/FMC_D0
PD15/FMC_D1
PE7/FMC_D4
PE8/FMC_D5
PE9/FMC_D6
PE10/FMC_D7
PE11/FMC_D8
PE12/FMC_D9
PE13/FMC_D10
PE14/FMC_D11
PE15/FMC_D12
以下是驱动AD7606的代码 我是以定时采集的 所以没初始化BUSY引脚
就是在定时中断函数中
定时启动,然后读取
#include "ad7606.h"
#define OS0_0() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET)
#define OS0_1() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET)
#define OS1_0() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET)
#define OS1_1() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET)
#define OS2_0() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET)
#define OS2_1() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET)
#define CONVST_1() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET)
#define CONVST_0() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET)
#define RANGE_1() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET)
#define RANGE_0() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET)
#define RESET_1() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_SET)
#define RESET_0() HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_RESET)
#define AD7606_RESULT() *(__IO uint16_t *)0x60000000
AD7606_VAR_T g_tAD7606;
AD7606_FIFO_T g_tAdcFifo;
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_FMC_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF12_FMC;
/* ÅäÖÃGPIOD */
GPIO_InitStructure.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;
HAL_GPIO_Init(GPIOD, &GPIO_InitStructure);
/* ÅäÖÃ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);
}
/********************************
********************************/
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;
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;
HAL_SRAM_Init(&hsram, &SRAM_Timing, &SRAM_Timing);
}
/****************************************
*
**************************************/
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;
}
}
/***************************************
*
***************************************/
void AD7606_SetInputRange(uint8_t _ucRange)
{
if (_ucRange == 0)
{
g_tAD7606.ucRange = 0;
RANGE_0();
}
else
{
g_tAD7606.ucRange = 1;
RANGE_1();
}
}
/**********************************
***********************************/
void AD7606_Reset(void)
{
RESET_0();
RESET_1();
RESET_1();
RESET_1();
RESET_1();
RESET_0(); /* íË3ö¸′λ×′ì¬ */
}
/***********************************
************************************/
void AD7606_StartConvst(void)
{
CONVST_0();
CONVST_0();
CONVST_0();
CONVST_1();
}
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();
}
不是我不写注释,注释都是乱码啊
|
|