完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
使用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 = 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( "%drn", tmp_data ); tmp_data = 0; } } 就是在这个程序中,串口打印的tmp_data一直为0!!! 求助~ |
|
相关推荐
3个回答
|
|
AD7663的AVDD, DVDD需要5V供电,你的电路中给的是3.3V吗?
|
|
|
|
额,我的电路中给的是3.3V,我把电路改下试试。 |
|
2 条评论
|
|
你好,请问你的问题解决了吗
|
|
|
|
只有小组成员才能发言,加入小组>>
2280个成员聚集在这个小组
加入小组992 浏览 2 评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1387 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1940 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4271 浏览 2 评论
9063 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1527浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1694浏览 2评论
993浏览 2评论
1671浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1387浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 23:57 , Processed in 0.704147 second(s), Total 52, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号