STM32F429读取IO口传输的数据速率
本帖最后由 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;
}
}
确认一下初始化为输入方式,把whlie循环里其他不相干的操作去掉,只读IO,快的话可以考虑一下直接读寄存器,全部读完再处理, 本帖最后由 toofree 于 2018-10-6 00:56 编辑
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);,那么后面的移位还有什么意义?
好好捋一下逻辑吧
本帖最后由 xiaolingoei 于 2018-10-6 10:10 编辑
toofree 发表于 2018-10-6 00:49
STM32F429的GPIO速度满足你4MHz应该没问题,至于用库函数的效率可能会低一点,但这不是主要问题。
你的程序 ...
十分感谢!AD的时序图已经放在楼下了,没放图却是失误,每次移位的原因就是MSB在前,result16bit中是一次传输16位的数据。
至于STM32的流水,我不太了解(正在学STM32的新手学生),一直觉得是单线程顺序执行的=。=,能不能讲解一下,麻烦了。然后,感觉STM32加不了精确ns级别的delay,不知道您有没有什么好方法?
本帖最后由 xiaolingoei 于 2018-10-6 10:09 编辑
AD的时序图,补发一下,自己傻了,各位大佬不好意思:L
FSO:帧同步输出
SCO:串行时钟输出
SDO: 串行数据输出
FSI:帧同步输入
问题已经解决,主要的问题确实是在软件上。 xiaolingoei 发表于 2018-10-9 20:53
问题已经解决,主要的问题确实是在软件上。
hello ,你好可以说一下是怎么解决的吗
页:
[1]