xiaolingoei 发表于 2018-10-5 20:53:45

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;
      }
}

衔胆栖冰 发表于 2018-10-5 23:25:52

确认一下初始化为输入方式,把whlie循环里其他不相干的操作去掉,只读IO,快的话可以考虑一下直接读寄存器,全部读完再处理,

七哥 发表于 2018-10-6 00:49:39

本帖最后由 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 09:57:49

本帖最后由 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:01:29

本帖最后由 xiaolingoei 于 2018-10-6 10:09 编辑

AD的时序图,补发一下,自己傻了,各位大佬不好意思:L
FSO:帧同步输出
SCO:串行时钟输出
SDO: 串行数据输出
FSI:帧同步输入

xiaolingoei 发表于 2018-10-9 20:53:27

问题已经解决,主要的问题确实是在软件上。

knock 发表于 2023-8-15 15:15:25

xiaolingoei 发表于 2018-10-9 20:53
问题已经解决,主要的问题确实是在软件上。

hello ,你好可以说一下是怎么解决的吗
页: [1]
查看完整版本: STM32F429读取IO口传输的数据速率