已回答假定已回答

AD7663转换的数据为0

hnxyxiaomeng 在 2017-10-23 詢問的問題
最後回覆由hnxyxiaomeng於2017-10-30提供

使用STM32F4与AD7663通信,无论采用CPU自带的SPI口还是自己用普通IO口去读AD7663的数据,读出的结果都是0。采用AD7663的BUSY下降沿作为中断,可正常进入中断。用普通IO口模拟的时钟时序没问题。电路图和部分程序如下,求大神指教。

电路:

无标题.png

部分程序:

1、AD7663初始化

//连接AD7663的IO口初始化

void AD7663_IO_Init( void )

{

    GPIO_InitTypeDef  GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE ); //使能GPIOA时钟

    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE ); //使能GPIOB时钟

    RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE, ENABLE ); //使能GPIOE时钟

    //PB10——SCK

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init( GPIOB, &GPIO_InitStructure );

    //PB14——MISO,AD数据输出

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//

    GPIO_Init( GPIOB, &GPIO_InitStructure );

    //PA10——BUSY

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10  ;//PA10

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

    GPIO_Init( GPIOA, &GPIO_InitStructure ); //初始化

    //PE5——START,为低时启动ADC

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;//PE5

    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_DOWN;//上拉

    GPIO_Init( GPIOE, &GPIO_InitStructure ); //初始化

   

    AD7663_PIN_START = 1;

    AD7663_SCK_HIGH;

 

  delay_ms( 50 );

}

 

2、外部中断服务函数

//外部中断服务程序

//读取采集得到的数据并串口发出

void EXTI15_10_IRQHandler(void)

{

  AD7663_Stop();

  AD7663_ReadADCdata();

  EXTI_ClearITPendingBit(EXTI_Line10);  //清除LINE10上的中断标志位 

}

 

3、读取AD7663数据

//read data

void AD7663_ReadADCdata( void ) //

{

    uint8_t inByte[8];//4个通道,每通道2个字节

    uint8_t i = 0;

    uint8_t j = 0;

    uint16_t tmp_data = 0;

    uint16_t t;

 

 

    for( i = 0; i < 8; i++ )

    {

        inByte[i] = 100;

    }

 

 

    for( j = 0; j < 4; j++ ) //读4个通道

    {

        for( i = 0; i < 16; i++ ) //读每个点

        {

            AD7663_SCK_HIGH;

            t = 1000;

 

            while( t-- );

 

            tmp_data += AD7663_PIN_DATA;

            tmp_data <<= 1;

            AD7663_SCK_LOW;

            t = 1000;

 

            while( t-- );

        }

 

        printf( "%d\r\n", tmp_data );

        tmp_data = 0;

    }

}

就是在这个程序中,串口打印的tmp_data一直为0!!!

 

 

求助~

結果