|
主要问题是不清楚为什么配置后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路样本 */
}
|
|