你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F429读取IO口传输的数据速率

[复制链接]
xiaolingoei 提问时间:2018-10-5 20:53 /
本帖最后由 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;
        }
}

收藏 评论6 发布时间:2018-10-5 20:53

举报

6个回答
衔胆栖冰 回答时间:2018-10-5 23:25:52
确认一下初始化为输入方式,把whlie循环里其他不相干的操作去掉,只读IO,快的话可以考虑一下直接读寄存器,全部读完再处理,

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

七哥 回答时间: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);,那么后面的移位还有什么意义?

好好捋一下逻辑吧

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

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的时序图,补发一下,自己傻了,各位大佬不好意思
FSO:帧同步输出
SCO:串行时钟输出
SDO: 串行数据输出
FSI:帧同步输入

AD时序图

AD时序图
xiaolingoei 回答时间:2018-10-9 20:53:27
问题已经解决,主要的问题确实是在软件上。
knock 回答时间:2023-8-15 15:15:25

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

hello ,你好可以说一下是怎么解决的吗

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版