STM32F4 SPI
使用STM32F4与AD7663通信,无论采用CPU自带的SPI口还是自己用普通IO口去读AD7663的数据,读出的结果都是0。采用AD7663的BUSY下降沿作为中断,可正常进入中断。用普通IO口模拟的时钟时序没问题。电路图和部分程序如下,求大神指教。
电路:
部分程序:
1、AD7663初始化
//连接AD7663的IO口初始化
无效的 AD7663_IO_Init( 无效)
{
GPIO_InitTypeDef GPIO_Init结构;
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE ); //使能GPIOA时钟
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE ); //使能GPIOB时钟
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOE, ENABLE ); //使能GPIOE时钟
//pb10-sck
GPIO_Intistestructure.GPIO_Pin = GPIO_Pin_10; GPIO_Intistructure.GPIO_Pin = GPIO_Pin_10; GPIO_Intistructure.GPIO_Pin = GPIO_Pin =GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_Init结构.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init( GPIOB, GPIO_InitStructure );
//PB14——MISO,AD数据输出
GPIO_Intiste Struitrationre.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
GPIO_Init结构.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_ Init结构.GPIO_PuPd = GPIO_PuPd_NOPULL;/
GPIO_Init( GPIOB, GPIO_InitStructure );
//pa10-Busy
GPIO_ Init结构.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//开漏输出
GPIO_ Init结构.GPIO_Speed = GPIO_Speed_100MHz;// 100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init( GPIOA, GPIO_InitStructure ); //初始化
//PE5——START,为低时启动ADC
GPIO_ Init结构.GPIO_Pin = GPIO_Pin_5;//PE5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_ Init结构.GPIO_Speed = GPIO_Speed_100MHz;// 100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//上拉
GPIO_Init( GPIOE, GPIO_InitStructure ); //初始化
AD7663_PIN_裁武条约=1;
ad7663_sck_high;
延时( 50) ;
}
2、外部中断服务函数
//外部中断服务程序
//读取采集得到的数据并串口发出
无效的 EXTI15_10_IRQHandler( 撤销)
{
ad7663_stop () ;
ad7663_readcdata () ;
EXTI_ClearITPendingBit(EXTI_Line10); //清除LINE10上的中断标志位
}
3、读取AD7663数据
//阅读数据
无效的 AD7663_ ReadADCdata( 无效) //
{
uint8_t inByte[8];//4个通道,每通道2个字节
英特8_t i = 0;
金特8_t j = 0;
金特16_t tmp_data = 0;
金特16_t;
for( i = 0; i < 8; i++ )
{ { {
在Byte = 100;
时 时
for( j = 0; j < 4; j++ ) //读4个通道
{ { {
for( i = 0; i < 16; i++ ) //读每个点
{ { {
ad7663_sck_high;
t = 1000;
时间( t - - ) ;
mp_data = AD7663_PIN_DATA;
tmp_data <<= 1;
ad7663_sck_low;
t = 1000;
时间( t - - ) ;
时 时
printf( "%drn", tmp_data );
mp_data = 0; mp_data = 0; mp_data = 0; mp_data = 0; mp_data = 0; mp_data = 0; mp_data = 0;
时 时
}
就是在这个程序中,串口打印的tmp_data一直为0!!!
求助~
更多回帖