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