使用SPI捕获外部波形的方法记录-(个人笔记)

该文章介绍了通过SPI接口作为从机模式进行外部波形数据采集的方法。利用SPI的CLK和CS信号,配合DMA和定时器,可以在外部时钟信号(如函数发生器产生的200KHz方波)的驱动下,捕获和分析数据。通过计时和数据分析,可以计算出信号的频率。在代码实现部分,作者展示了如何利用二分查找算法处理采集到的数据,以确定信号的周期。
摘要由CSDN通过智能技术生成

使用SPI捕获外部波形的方法记录-(个人笔记)

一、简介

1、spi这个外设作为从机模式的时候,与主设备连接后由主机的clk cs进行控制,如果cs拉低并且此时主设备clk也出现,这样就能采集到mosi与miso中的数据。(这个过程我们已经将spi外设的基本模式全部配置完成)。
spi连接图spi波形图
2、上面是spi的一些简介,我们了解它的一些基本知识后便可以发现一个现象:只要拥有时钟信号并且cs信号一直为低,这样便可以解析到两根数据线上的数据(MOSI,MISO),如果我们将CS、MOSI与MISO这三个引脚不进行配置,这样我们这些引脚默认就为0,也就是说我们的cs一直为低,MOSI与MISO的数据均为0。所以我们的数据的有无就取决于外部时钟的有无了。此时我们将外部的时钟引脚接入我们的待测信号端(函数发生器),我们使用函数发生器发出一个200Khz的方波信号,并将输出线接到我们的spi SCLK引脚,这样我们便能采集到数据了。如果我们知道采集开始和结束的时间便可以知道在采集到的所有数据中的总时间了。假设我们采集到了175个字节的数据(数据的值应该为0,上面的介绍中有提为啥为0),采集的总时间为3ms。于是我们就可以得到这个过程中一共采集到了175x8(一个字节8位)=1400bit 也就是1400个边沿,也就是1400个周期,而一个采集的总时间为7ms,我们就知道周期为7msx10^-3÷1400=0.000005s,则频率为1/T=200Khz。

二、代码实现

在这整个过程中我们需要使用到的外设有spi、dma、timer,在spi启动时开启timer计时,在timer计时结束后上完最后一个中断并读出此时的timer的count值,最后求出整个采集过程中的时间,在这个些过程中dma负责搬运数据,最后我们可以对数据进行处理,实际数据如下所示:

0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 
0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 
0x0 0x0 0x0 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 

这个buff中的数据我们会在初始化的时候赋值为全ff,在采集的时候如果有clk的时候便会采集到0,这个时候只要数采集到0的数量就知道采集了多少个周期。
其中在对数据分析的时候可以使用二分法进行数据处理。代码如下:(输出结果便为多少个直接,需要自行计算多少位)

uint16_t BinSearch(uint8_t *const pTab, const uint16_t Length)
{
    uint8_t tmpa, tmpb;
    bool errflag = FALSE; 
    uint16_t result = 0xff;
    if (pTab != NULL)
    {
        uint16_t Idx;
        uint16_t Head = 0;
        uint16_t Rear = Length - 1;
        while ((Rear - Head) > 1u)
        {
            Idx = (Head + Rear) >> 1;
            tmpa = pTab[Idx];

            if (tmpa == 0)
            { // forward
                tmpb = pTab[Idx + 1];
                if (tmpb == 0)
                {
                    Head = Idx;
                }
                else if (tmpb == 0xff)
                { // found
                    result = Idx+2;
                    break;
                }
                else
                {
                    errflag = TRUE;
                    break;
                }
            }
            else if (tmpa == 0xff)
            { // backward
                tmpb = pTab[Idx - 1];

                if (tmpb == 0xff)
                {
                    Rear = Idx;
                }
                else if (tmpb == 0)
                {
                    result = Idx+2;
                    break;
                }
                else
                {
                    errflag = TRUE;
                    break;
                }
            }
            else
            { // error
                errflag = TRUE;
                break;
            }
        }
    }

    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值