|
我想问一下各位关于AD7606这个芯片的问题,我画的板子用的是GPIOC接的AD7606的整个DB引脚,写的驱动每次读到的数据都为0,关于这点有没有什么好的建议?
#define READ_AD_DATA GPIO_ReadInputData(GPIOC);
#define OS0_1() GPIO_SetBits(GPIOB, GPIO_Pin_6);
#define OS0_0() GPIO_ResetBits(GPIOB, GPIO_Pin_6);
#define OS1_1() GPIO_SetBits(GPIOB, GPIO_Pin_5);
#define OS1_0() GPIO_ResetBits(GPIOB, GPIO_Pin_5);
#define OS2_1() GPIO_SetBits(GPIOB, GPIO_Pin_4);
#define OS2_0() GPIO_ResetBits(GPIOB, GPIO_Pin_4);
#define AD7606_CS_1 GPIO_SetBits(GPIOB, GPIO_Pin_3);
#define AD7606_CS_0 GPIO_ResetBits(GPIOB, GPIO_Pin_3);
#define AD7606_RD_1 GPIO_SetBits(GPIOD, GPIO_Pin_2);
#define AD7606_RD_0 GPIO_ResetBits(GPIOD, GPIO_Pin_2);
#define AD7606_RESET_1 GPIO_SetBits(GPIOA, GPIO_Pin_13);
#define AD7606_RESET_0 GPIO_ResetBits(GPIOA, GPIO_Pin_13);
#define AD7606_CONVST_1 GPIO_SetBits(GPIOA, GPIO_Pin_8 & GPIO_Pin_11);
#define AD7606_CONVST_0 GPIO_ResetBits(GPIOA, GPIO_Pin_8 & GPIO_Pin_11);
#define AD7606_BUSY_STATE GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15)
#define AD7606_FRSTDATA_STATE GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_14)
void AD7606_GPIOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
//----------------------------- AD7606 DATA GPIO ------------------------------
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//------------------------------------ End ------------------------------------
//ADCS->PB3, OS0->PB7, OS1->PB6, OS2->PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//ADREAD->PD2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
// ADFIRST->PA14, COVA->PA8, COVB->PA11, ADRESET->PA13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//ADRESET->PA13, ADBUSY->PA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//sampling rate 200kSPS
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 AD7606Initialization(void)
{
delay_ms(1);
AD7606_RESET_0
AD7606_SetOS(AD_OS_NO);
AD7606_CS_1
AD7606_CONVST_1
AD7606_RD_1
delay_ms(1);
}
void AD7606Reset(void)
{
AD7606_RESET_1;
delay_us(1);
AD7606_RESET_0;
delay_us(1);
}
void AD7606ReadSample(void)
{
char data[30];
//开启转换
AD7606_CONVST_0
__NOP();
AD7606_CONVST_1;
__NOP();
//当前数据状态 低电平可读取新数据 高电平可读取上次结果
while(AD7606_BUSY_STATE)
{
//高电平期间读取数据,过采样开启可用
}
AD7606_CS_0
__NOP();
//BUSY低电平读取新数据
AD7606_RD_0
__NOP();
ad_value[0]=READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[1] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[2] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[3] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[4] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[5] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[6] = READ_AD_DATA;
AD7606_RD_1;
__NOP();
AD7606_RD_0;
__NOP();
ad_value[7] = READ_AD_DATA;
AD7606_RD_1;
}
|
|