本帖最后由 xiaolingoei 于 2018-10-9 20:53 编辑 最近用STM32F429(180M)读取一块500K数据速率的16位AD。两块芯片之间有3线输出(FSO,SCO,SDO),1线输入(FSI),采用的串行输出方式,共有16位数据,每一位数据的传输时间大概是250ns。 FSO ---- PC9 SCO ---- PC8 SDO ---- PB7 FSI ---- PA2 设置上面4个引脚GPIO_Speed_100MHz。但是,调用库函数里面的GPIO_ReadInputDataBit命令,GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)读取不到SDO电平的变化。 测量AD的输出引脚,发现FSO,SCO,SDO的信号显示正确,排除AD工作不正常的情况。 我认为可能是库函数的读取速度达不到?或者是代码有问题?不知道有没有更快GPIO口电平的读取方式? AD读取代码如下: unsigned long AD_Get(void) { vu16 result16bit = 0; unsigned char i = 0; GPIO_SetBits(GPIOA,GPIO_Pin_2); GPIO_ResetBits(GPIOA,GPIO_Pin_2); if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)) { while(i<=15) { while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)==0) { LED1 = !LED1; result16bit = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7); result16bit = result16bit << 1; i++; } } return result16bit; } else { return 0xFFFF; } } |
盘古UE-STM32F407工控板原理图
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
STM32F407 的1588问题(已解决)
评分
查看全部评分
STM32F429的GPIO速度满足你4MHz应该没问题,至于用库函数的效率可能会低一点,但这不是主要问题。
你的程序很问题,不清楚你用的什么ADC。
但是,你的程序中没加软件延时,而STM32是有流水的,那么
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)) ,有可能要比GPIO_ResetBits(GPIOA,GPIO_Pin_2); 先执行。
也就是说,第1个if有可能直接就不成立,return 0xffff返回了。除非你确认在调用AD_Get(void)时,PC9已经处于高电平。
至于后面,while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)==0) ,也是有问题的,当PC8保持为0时间较长(比如1us左右)的时候,怎么办?result16bit 直接就塞满了
每次都执行 result16bit = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);,那么后面的移位还有什么意义?
好好捋一下逻辑吧
评分
查看全部评分
十分感谢!AD的时序图已经放在楼下了,没放图却是失误,每次移位的原因就是MSB在前,result16bit中是一次传输16位的数据。
至于STM32的流水,我不太了解(正在学STM32的新手学生),一直觉得是单线程顺序执行的=。=,能不能讲解一下,麻烦了。然后,感觉STM32加不了精确ns级别的delay,不知道您有没有什么好方法?
AD的时序图,补发一下,自己傻了,各位大佬不好意思
FSO:帧同步输出
SCO:串行时钟输出
SDO: 串行数据输出
FSI:帧同步输入
ADæ¶åºå¾
hello ,你好可以说一下是怎么解决的吗