|
本帖最后由 sanvlee 于 2018-7-22 13:39 编辑
想采用AD7685做一个16位的数据采集。采用IO模拟SPI,对着芯片数据手册上的3线无忙信号线的模式,死活读不出数据来。下面贴上程序和时序,大家帮忙看看有啥问题!
以下是程序:
void AD7685_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA
//PA4-CNV PA5-CLK PA7 SDI(弄busy模式输出高电平即可)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7); //PA4/PA5/PA7上拉
}
static void AD7685_ACQ_time(void)
{
CNV_LOW;
Delay_us(1);
CNV_HIGH;
Delay_us(1);
CNV_LOW;
Delay_us(1);
CNV_HIGH;
}
static void AD7685_CNV_Time(void)
{
Delay_us(5);
}
static u16 AD7685_ReadData_Time(u16 tData)
{
u8 i;
u16 ADData;
for(i=0; i<16; i++)
{
SCK_HIGH;
CNV_LOW;
ADData=ADData<<1; // 每次左移一位,右边补零
if(SDO) //每次下降沿到来,读出的是1,则运行下面的语句
ADData=ADData|0x01;
SCK_LOW;
}
return ADData;
}
u16 AD7685_oneAcq(u16 tData)
{
u16 Data = 0;
AD7685_ACQ_time();
AD7685_CNV_Time();
Data = AD7685_ReadData_Time(DUMMY) ;
Delay_us(1);
CNV_HIGH;
return Data;
}
|
|