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

使用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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在STM32单片机使用硬件SPI驱动4线SPI-LCD的方法如下: 1. 首先,确保你已经连接好了STM32单片机和LCD屏幕,并且正确配置了SPI引脚。 2. 在代码中包含SPI库和LCD库的头文件。例如,对于ST7735驱动的LCD屏幕,你可以包含"ST7735.h"头文件。 3. 初始化SPI和LCD屏幕。在初始化之前,你需要设置背景色和画笔色。这些颜色将用于绘制图形和文本。 4. 使用SPI发送命令和数据给LCD屏幕。你可以使用SPI的发送函数来发送命令和数据。具体的命令和数据可以参考LCD屏幕的数据手册。 5. 在LCD屏幕上绘制图形和文本。你可以使用LCD库提供的函数来绘制图形和文本。例如,你可以使用画线函数来绘制线条,使用填充矩形函数来绘制矩形,使用显示字符函数来显示文本等等。 6. 最后,关闭SPI和LCD屏幕。在程序结束之前,记得关闭SPI和LCD屏幕以释放资源。 下面是一个示例代码,演示了如何使用硬件SPI驱动4线SPI-LCD: ```c #include "ST7735.h" #include "usart.h" u16 BACK_COLOR, POINT_COLOR; //背景色,画笔色 void WriteCommand_7735(u8 cmd) { // 使用SPI发送命令给LCD屏幕 // ... } void WriteData_7735(u8 data) { // 使用SPI发送数据给LCD屏幕 // ... } void InitLCD() { // 初始化SPI和LCD屏幕 // ... } void DrawGraphics() { // 在LCD屏幕上绘制图形和文本 // ... } int main() { // 设置背景色和画笔色 BACK_COLOR = WHITE; POINT_COLOR = BLACK; // 初始化SPI和LCD屏幕 InitLCD(); // 在LCD屏幕上绘制图形和文本 DrawGraphics(); // 关闭SPI和LCD屏幕 // ... return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值