现在在单片机上有两个引脚,一个是数据口,一个时钟口,怎么用stm32来读取上面的数据时钟大概是4us一个周期,数据是8位.,时钟的上升沿时获取数据引脚的一位数据.用spi协议可以接收吗?还是可以用外部中断检测?还是利用定时器接收??求高手解决啊~~
就是根据上面的时序图来接收数据,stm32是接收的
那我详细说明下吧,现在用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的数据要怎么存呀?