永发信息网

利用stm32的两个引脚接收数据

答案:2  悬赏:70  手机版
解决时间 2021-04-01 00:23
  • 提问者网友:温旧梦泪无声
  • 2021-03-31 21:32
利用stm32的两个引脚接收数据
最佳答案
  • 五星知识达人网友:掌灯师
  • 2021-03-31 22:23
同样感觉问题不大清楚,如果单片机上的那两个引脚的协议确定,那么就接到stm32上的相应外设引脚即可,然后设置下双方工作模式。如果确定是两根线,那么iic的可能性大一些(不过要查下iic的总线时序,看看是否与描述的一致),毕竟标准spi要miso,mosi,clk与cs四根线。其他的串行通讯暂时能想到的都是异步的了。如果协议不确定,只是想分析协议与数据,那么最好的方式是使用逻辑分析仪。
如果这种情况下仍然想要使用stm32来分析,只能使用io口中断或定时器捕捉模式来分析协议。如果只是只想要数据的话,可以用io中断,再每个单片机clk的上升沿触发中断,在isr中把另一个io口采集到的数据保存并移位(要注意msb在前还是lsb在前,spi是msb在前),采集完8个后处理。不过这样肯定会做累的半死。所有的时序,都要处理好了。还要考虑到各种出错的可能性。
当然如果后面的描述正确的话,可以尝试使用spi协议(spi规定是msb在前,要对应好了)但是需要单片机上一根额外的引脚作为片选接到stm32上,或者想其他办法把片选接上,stm32作为从机使用mosi线,,设置下相位和极性即可。追问那我详细说明下吧,现在用stm32来接收单片机上的数据,对于那块单片机来说,我只有那2个引脚的资料,数据是从单片机上发出来的,stm32是负责接收,现在是确定用两个引脚,一个是clk,一个data,原来有程序是用spi来接收的,标准的spi是使用4根线,但是用spi的只接收模式,2根线也可以的.数据也是接收到的,但是数据不正确了,对了stm32的spi设置是从机模式.利用dma来读取数据的
现在我换了方案,用stm32来接收那些数据,但是怎么也接收不正确追答感觉对于这个问题,有两个问题需要解决,第一个个就是数据的起始位是哪个,这个一般在spi协议中用片选信号处理,即当cs片选拉低的时候就提示从机传输开始,然后根据相关的极性与相位设置来传输数据.如果单片机主站再启动后完成初始化就一直不停地发送数据,那么首先要确定的就是什么时候是一个字节传输的起始位,对于spi外设来说就必须要有cs片选,如果没有就要想办法确定,否则spi是没法工作的,毕竟spi本质上就是一个移位寄存器,理论上可以先传4bit,然后等半天在传后4bit.只要在一个cs片选有效周期内存在8个完整的clk脉冲就行,如果片选一直拉低,那么程序里也无法判断出什么时候是一个字节传输开始及结束,我们也就无法判断出到底采集到的数据时一个完整的字节,还是两个字节的部分拼接起来的.
要么就用io口中断模拟下时序,每个上升沿采集1bit.但是仍然要判断出什么时候是第一bit的数据.
当然如果发送数据不频繁倒是可以用延时或者定时器之类的处理下.
另一个问题是字节的传送顺序,这个好办,试下就行.

另外,上面的时序图如果是单片机主站的话,那么应该是out信号接到stm32上吧,如果是这样的话明显不是clk的上升沿锁存数据.倒像是在latch的上升沿锁存的输出数据,所以说感觉这个不像spi.追问我是这样设置的:
stm32的spi设为从机;nss为软件管理,或者cs是一直置低,MSB优先,表示spi可以一直接受数据
时钟我用示波器打出来是空闲时为高电平,这样就可以确定第一位数据是从时钟的第二个边沿的(上升沿)来接收,但是数据一直接收不正确....
这里我要接收的数据大概有4万个字节,数据量也蛮大的,所以用io中断什么的stm32就可能吃消不起了
上面的那个时序图是stm32的模拟接收时序图来的,引脚只用clk和data in追答这里cs片选一直置低恐怕不行,因为你也没办法确定什么时候采集一个字节结束,如果你知道这个,你也就可以模拟出一个片选了,比如用一个io口接到cs片选上.在认为要传输数据的时候拉低这根信号.现在手上没有手册,不知道stm32的spi是什么样子的.但是如果在一个cs片选有效期间传入的数据位数超过设置值(一直拉低就只这种情况),那么spi要么继续移位,要么忽略掉后面传送来的数据,
其实这个问题的关键依然是没有片选的情况下确定传送开始的时间.如果每两个传送字节的间隔比较长,那么就可以用时间判断起始bit.例如如果一个脉冲的上升沿结束后超过15us没有第二个脉冲出现,则认为数据传输结束.下一个clk脉冲就是下个字节传输的起始位.
至于数据量其实问题不大,毕竟cpu的处理速度要远远大于4us/bit的速率,
按照spi外设的时序规定,这种情况应该设置极性和相位都为1.(看下手册,记不太清了)这时应该保证片选信号在clk的第一个下降沿之前就有效,这样才能有效地采集到第一个上升沿的数据,但是按照描述,这个恐怕很难实现,所以我个人更建议用io口模拟时序.
用一个io口接clk,一个io口接数据线,在clk的上升沿触发中断,在这个isr中将采集到的数据保存并移位处理.并在isr中判断是传输的第几位及是否传输完毕等.
这种方式与spi硬件相比每一个字节要触发8次中断,而spi只要触发一次中断就可以了(当然如果spi有硬件缓冲区就会更理想了).因为clk的速率不高,才几百kbps,stm32有充足的时间去处理这些内容,主要是在采集到的数据处理上的算法不能太复杂.非要拿这些数据算fft或者stm32同时还要处理其它人机界面等任务就恐怕有点吃力.如果没有这些,io口模拟和硬件spi方式差别不大.
但是如果使用硬件spi,就必须满足spi规定的时序,否则就会出错.追问嗯嗯,spi的回答都正确
但是我之前的方案就是想用spi加dma方式来接收数据的
这样子的话,cpu就有空闲的时间来处理这些接收来的数据了
比如显示到lcd上,或者是存储到flash上
之前是有嗰程序,就是利用以上的方法来做的,但是我跟着来做
怎么也接收不了
那个方案是cc2530+at45存储+无线发射
现在用中断方式接收的话
理论是可以,但是之前试过,会卡死在某嗰地方
具体也不知道是什么原因
还有的是中断接收的话,那40k的数据要怎么存呀?
全部回答
  • 1楼网友:迟山
  • 2021-03-31 23:47
你的问题不是太清楚:
1. 是STM32要读取单片机上面的数据吗?可以使用很多协议,但是要先确定哪一方主动,如果是单片机主动发,那STM32最好用中断,单片机方根据需要或者定时发送;如果是STM32主动读,那STM32可以根据需要或者定时读,单片机则采用中断接收。只要双方匹配,根据你数据的实时程度,不难确定哪方主动。由于你只有两个口建议用I2C,SPI当然也可以,实现的方式可以手动模拟协议,也可以利用芯片内建的协议模块。
2. “时钟大概是4us一个周期,数据是8位.,时钟的上升沿时获取数据引脚的一位数据” 这个要求是单片机的要求还是STM32的要求?为什么会有这样的要求?
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯