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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版