《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践

news2025/3/14 23:23:01

在这里插入图片描述

文章目录

    • 一、引言
    • 二、SPI总线协议的基本原理
    • 三、SPI通信模式详解 —— CPOL与CPHA
      • 3.1 时钟极性(CPOL)
      • 3.2 时钟相位(CPHA)
      • 3.3 四种SPI模式
    • 四、主从设备通信机制
      • 4.1 通信流程概述
      • 4.2 数据帧结构与传输细节
      • 4.3 主设备与从设备的协同工作
    • 五、上位机实现SPI通信
      • 5.1 硬件接口与驱动支持
      • 5.2 软件实现方法
        • 5.2.1 基于硬件SPI模块的实现
        • 5.2.2 基于软件模拟SPI(Bit-Banging)的实现
    • 六、实例分析与调试技巧
      • 6.1 常见问题及故障排查
      • 6.2 调试工具与方法
      • 6.3 实例应用
    • 七、总结与展望
    • 结语

在这里插入图片描述

一、引言

在嵌入式系统、工业自动化、消费电子以及数据采集等领域中,总线通信协议扮演着至关重要的角色。SPI(Serial Peripheral Interface,串行外设接口)总线协议作为一种高速、全双工的同步串行通信协议,由摩托罗拉公司提出并广泛应用于各类设备之间的数据交换。相较于I²C协议,SPI通信具备传输速度快、通信模式灵活、实现简单等优势,因此在需要高速数据传输或对延迟要求较高的场合,SPI成为主流选择。

本篇文章将深入探讨SPI总线协议的基本原理、通信模式(特别是CPOL与CPHA的详细定义与影响)、主从设备之间的通信机制以及上位机在实际应用中的实现方法。通过系统分析SPI通信各环节的设计思想和实际应用实例,旨在为工程师在系统设计、调试及故障排查中提供详尽的理论指导和实践参考。


在这里插入图片描述

二、SPI总线协议的基本原理

SPI总线是一种全双工、同步串行通信协议,主要由主设备(Master)与一个或多个从设备(Slave)构成。SPI通信一般至少需要四根信号线,每根信号线都有其特定的作用:

  1. SCLK(Serial Clock,时钟信号)
    由主设备生成的同步时钟信号,用于同步数据传输。时钟频率的高低直接影响数据传输速率,是SPI协议高速通信的基础。

  2. MOSI(Master Out Slave In,主设备发送从设备接收)
    用于主设备向从设备发送数据。在数据传输过程中,主设备将数据按位依次输出,从设备接收并存储数据。

  3. MISO(Master In Slave Out,从设备发送主设备接收)
    用于从设备向主设备传送数据。SPI协议支持全双工通信,数据可以在同一时钟周期内双向传输,即主设备在发送数据的同时,也能接收从设备传来的数据。

  4. CS/SS(Chip Select/Slave Select,片选信号)
    用于选择具体的从设备。主设备通过拉低相应从设备的CS信号来启动数据传输,结束时再将该信号置为高电平。对于多从设备系统,通常需要为每个从设备单独提供一个CS信号,或通过其他多路复用技术实现选中操作。

SPI通信协议的最大特点在于其全双工数据传输方式和高速传输能力。由于数据传输与时钟同步进行,理论上在每个时钟周期内都可实现一位数据的交换,从而使得SPI总线在需要大数据量快速传输的场合表现优异。


三、SPI通信模式详解 —— CPOL与CPHA

SPI通信模式主要由两个参数决定:时钟极性(CPOL)和时钟相位(CPHA)。这两个参数共同决定了数据在SCLK信号中的采样时刻和传输边沿。理解CPOL和CPHA的含义,对于正确配置SPI接口、保证数据传输的稳定性至关重要。

3.1 时钟极性(CPOL)

CPOL用来定义时钟信号空闲状态下的电平,即在没有数据传输时,SCLK保持高电平还是低电平:

  • CPOL = 0:表示空闲状态下SCLK为低电平。当通信开始时,SCLK将从低电平开始变化。
  • CPOL = 1:表示空闲状态下SCLK为高电平。当通信开始时,SCLK将从高电平开始变化。

在不同的硬件设计中,CPOL的设置需要与从设备的要求相匹配。若主从设备之间的CPOL不一致,就可能导致数据采样时出现错误,从而引起数据传输异常。

3.2 时钟相位(CPHA)

CPHA用于定义数据采样时钟边沿的选择,主要决定数据在时钟信号的哪一个边沿(上升沿或下降沿)采样:

  • CPHA = 0:数据在第一个时钟边沿采样,即当SCLK从空闲状态开始转换时就采样数据。数据应在时钟信号切换之前稳定。
  • CPHA = 1:数据在第二个时钟边沿采样,即数据在第一个边沿改变后,再于下一个边沿采样。这样做的好处在于为数据的稳定提供了更多的时间。

3.3 四种SPI模式

结合CPOL和CPHA的不同设置,SPI协议通常定义了四种工作模式,分别为:

  • 模式0(CPOL=0,CPHA=0)
    空闲状态下SCLK为低电平,数据在SCLK的上升沿采样。传输数据时,数据变化通常发生在SCLK下降沿。模式0在很多低速外设中广泛应用。

  • 模式1(CPOL=0,CPHA=1)
    空闲状态下SCLK为低电平,数据在SCLK的下降沿采样。此模式下,数据在第一个边沿发生变化,在第二个边沿采样。适用于对数据稳定性要求较高的场合。

  • 模式2(CPOL=1,CPHA=0)
    空闲状态下SCLK为高电平,数据在SCLK的下降沿采样。数据通常在SCLK上升沿发生变化,确保数据在下降沿采样时稳定。模式2常用于某些特定硬件设备要求高时钟电平的场合。

  • 模式3(CPOL=1,CPHA=1)
    空闲状态下SCLK为高电平,数据在SCLK的上升沿采样。数据变化发生在SCLK下降沿,传输时延相对模式2稍有不同。该模式适用于对时序要求较严谨的系统。

不同设备对SPI模式的要求可能不同,工程师在设计系统时必须查阅器件手册,确认所需的CPOL与CPHA设置。若主设备与从设备的SPI模式不一致,数据采样可能出现偏移或错误,从而导致通信失败或数据损坏。


四、主从设备通信机制

SPI通信采用主从架构,主设备负责生成时钟、控制片选信号以及数据读写,从设备则根据主设备的指令进行数据接收和发送。下面详细介绍主从设备间的通信流程及关键要点。

4.1 通信流程概述

典型的SPI通信流程可分为以下几个步骤:

  1. 片选控制
    在通信开始前,主设备首先通过拉低目标从设备的CS(Chip Select)信号,通知从设备准备进入通信状态。对于多从设备系统,只有被选中的从设备响应后续的数据传输。

  2. 时钟同步
    主设备产生SCLK信号,作为所有数据传输的同步时钟。时钟的频率由主设备配置,确保数据传输速率满足系统要求。

  3. 数据发送与接收

    • 全双工通信:SPI支持全双工数据传输,即在每个时钟周期内,主设备在MOSI线上发送数据的同时,从设备在MISO线上传回数据。这样设计使得数据交换效率极高。
    • 数据位序:通常情况下,每个数据帧为8位,也有部分设备支持16位或更长的数据帧。数据传输过程中,数据从高位到低位或相反顺序依赖具体实现。
  4. 数据同步与确认
    虽然SPI协议没有类似I²C那样的ACK机制,但数据采样依赖严格的时钟同步以及信号时序设计。主从设备在设计时需要保证数据在传输过程中没有干扰或时序偏差,否则可能造成数据错误。

  5. 结束通信
    数据传输完成后,主设备将CS信号置为高电平,从而结束本次通信,通知从设备退出通信状态,SPI总线恢复空闲。

4.2 数据帧结构与传输细节

在SPI总线中,数据传输通常按照“数据帧”进行,每个数据帧的结构受SPI模式的影响。典型的数据帧包括:

  • 起始状态:主设备拉低CS信号,启动通信。
  • 数据传输:在SCLK控制下,数据在MOSI和MISO线上同时传输。数据位的传输顺序(MSB优先或LSB优先)通常在硬件配置时指定。
  • 结束状态:主设备在传输完所有数据后拉高CS信号,结束通信。

在实际应用中,数据帧的长度可以根据应用需求进行设定。某些场合需要连续传输多个数据帧,此时主设备可不间断地输出数据,保证数据流的连续性。为了确保数据稳定,系统设计时往往会在每个数据帧之间插入一定的延时,或通过硬件流水线技术优化传输时序。

4.3 主设备与从设备的协同工作

在SPI系统中,主设备起到了“总线控制者”的作用,其主要任务包括:

  • 产生稳定的时钟信号(SCLK),并根据CPOL/CPHA配置保证正确的时序。
  • 根据具体的应用场景,通过软件或硬件管理CS信号,精确控制从设备的选中与释放。
  • 同时处理MOSI和MISO两路数据,通过硬件FIFO或DMA技术提升数据传输效率,降低CPU负载。

从设备在接收到CS信号拉低后进入通信模式,开始同步接收主设备发送的数据,并在对应时钟边沿输出数据到MISO线上。由于SPI采用全双工传输,从设备的响应速度必须能够跟上主设备的时钟频率,这对于硬件电路设计提出了较高要求。

在设计多从设备系统时,还需考虑总线共享问题。通常,每个从设备都配有独立的CS信号,或通过多路复用技术实现片选。硬件设计师还需注意总线长度、阻抗匹配以及干扰抑制,确保在高速传输下信号质量不受影响。


五、上位机实现SPI通信

上位机在SPI通信中通常作为主设备,负责生成时钟、管理数据传输以及控制从设备。上位机的实现既可以基于专用的硬件SPI控制器,也可以采用软件模拟(Bit-Banging)方式实现。下面详细介绍上位机实现SPI通信的关键环节及常用方案。

5.1 硬件接口与驱动支持

在上位机平台(例如嵌入式Linux系统、单片机开发板或PC机)中,实现SPI通信的第一步是确保硬件平台具备SPI控制器。现代单片机如STM32、NXP、TI系列均内置SPI模块,用户只需通过寄存器配置实现SPI初始化。对于PC机系统,则可以通过USB-SPI转换器或专用的扩展板实现SPI通信。

常见的硬件接口特点包括:

  • 时钟频率配置:主设备需提供稳定的SCLK信号,时钟频率的选择依赖于从设备的最大支持速率以及总线电气特性。
  • 数据帧格式配置:包括数据位宽、传输顺序(MSB优先或LSB优先)、以及SPI模式(模式0~3)的选择。
  • 错误检测与中断支持:部分SPI控制器支持FIFO缓存、中断触发以及DMA传输,能够大幅降低CPU负载并提高数据吞吐率。

在Linux系统中,SPI设备通常由内核SPI子系统管理,用户可以通过设备文件(如/dev/spidev0.0)进行读写操作。内核提供的驱动程序(如spidev驱动)将SPI设备抽象成文件接口,使得上位机应用程序能够方便地调用标准I/O函数实现数据传输。

5.2 软件实现方法

5.2.1 基于硬件SPI模块的实现

利用硬件SPI模块时,上位机软件通常遵循如下步骤:

  1. 初始化SPI接口

    • 配置SPI模式(CPOL和CPHA),选择数据位宽(8位、16位等)。
    • 设置传输速率:通过时钟分频器确定SCLK频率,保证在从设备允许范围内工作。
    • 初始化CS引脚:配置为GPIO输出或由硬件自动控制,确保在数据传输前后正确管理片选信号。
  2. 数据读写操作

    • 调用驱动提供的接口函数(如Linux下的ioctlreadwrite等)将数据写入SPI数据寄存器。
    • 在全双工模式下,主设备可同步接收从设备数据,将接收到的数据存入缓冲区。
  3. 中断与错误处理

    • 对于高速传输或批量数据传输,可采用中断模式或DMA方式提高数据处理效率。
    • 在传输过程中,监测错误标志位,对总线故障、数据溢出等情况进行及时处理和恢复。

下面给出一个基于Linux下spidev设备文件的示例代码(伪代码):

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>

#define DEVICE "/dev/spidev0.0"
#define SPI_MODE SPI_MODE_0      // 对应CPOL=0, CPHA=0
#define BITS_PER_WORD 8
#define MAX_SPEED 500000         // 最大传输速率500kHz

int main(void) {
    int spi_fd;
    uint8_t tx_buf[3] = {0xAA, 0xBB, 0xCC};
    uint8_t rx_buf[3] = {0};

    // 打开SPI设备
    spi_fd = open(DEVICE, O_RDWR);
    if (spi_fd < 0) {
        perror("无法打开SPI设备");
        exit(1);
    }

    // 设置SPI参数:模式、位宽和时钟速率
    if (ioctl(spi_fd, SPI_IOC_WR_MODE, &SPI_MODE) < 0) {
        perror("设置SPI模式失败");
        close(spi_fd);
        exit(1);
    }
    if (ioctl(spi_fd, SPI_IOC_WR_BITS_PER_WORD, &BITS_PER_WORD) < 0) {
        perror("设置SPI位宽失败");
        close(spi_fd);
        exit(1);
    }
    if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &MAX_SPEED) < 0) {
        perror("设置SPI时钟失败");
        close(spi_fd);
        exit(1);
    }

    // 构建SPI传输结构体
    struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx_buf,
        .rx_buf = (unsigned long)rx_buf,
        .len = sizeof(tx_buf),
        .delay_usecs = 0,
        .speed_hz = MAX_SPEED,
        .bits_per_word = BITS_PER_WORD,
    };

    // 执行数据传输
    if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &tr) < 0) {
        perror("SPI传输失败");
        close(spi_fd);
        exit(1);
    }

    printf("接收到的数据:0x%X 0x%X 0x%X\n", rx_buf[0], rx_buf[1], rx_buf[2]);
    close(spi_fd);
    return 0;
}

该示例展示了如何在Linux系统中通过SPI设备文件进行简单的数据交换。在实际项目中,还需考虑错误重传、超时检测以及对特殊硬件要求的支持。

5.2.2 基于软件模拟SPI(Bit-Banging)的实现

在某些硬件平台上,可能不存在专用的SPI模块,此时可以采用软件模拟SPI的方法,即通过普通GPIO口按照SPI时序手动控制数据输出和时钟信号。实现步骤包括:

  • GPIO初始化:配置对应的GPIO为输出(用于SCLK、MOSI、CS)和输入(用于MISO)。
  • 时序控制:通过软件延时精确定时,模拟时钟上升沿和下降沿,从而实现数据的移位和采样。
  • 数据传输:依次控制每一位数据的输出,同时在相应边沿读取MISO口数据,完成全双工通信。

虽然软件模拟方式速度通常低于硬件SPI,但在简单应用和调试原型阶段依然具有较高的灵活性和易用性。


六、实例分析与调试技巧

在实际工程中,SPI通信往往会面临各种复杂情况,如信号干扰、时序偏差、不同设备间电平不匹配等。以下将介绍一些常见的调试方法和实例分析,帮助工程师快速定位和解决问题。

6.1 常见问题及故障排查

  1. 数据错误或丢失

    • 原因:时钟频率设置过高、时序控制不准确、信号干扰或电平不匹配。
    • 解决方案:使用示波器或逻辑分析仪监控SCLK、MOSI、MISO以及CS信号的时序;降低时钟频率;检查电气连接及终端匹配电阻;确认SPI模式配置正确。
  2. 从设备无响应

    • 原因:片选信号未正确拉低;从设备初始化失败;SPI模式设置错误。
    • 解决方案:检查CS信号的状态;确认从设备上电正常、初始化正确;参考设备手册验证CPOL、CPHA设置。
  3. 全双工数据混乱

    • 原因:数据移位顺序错误;数据采样与时钟边沿不匹配。
    • 解决方案:重新确认数据位顺序(MSB优先或LSB优先)的配置;检查SPI时钟相位设置是否与从设备匹配。

6.2 调试工具与方法

  • 逻辑分析仪
    利用逻辑分析仪采集SPI总线上各信号的时序图,观察SCLK、MOSI、MISO和CS信号的电平变化及边沿时序,能够直观判断数据传输是否符合预期时序。

  • 示波器
    通过示波器监控模拟信号波形,检查信号上升/下降时间、噪声干扰以及电平稳定性,对解决电气连接问题和信号完整性提供有力支持。

  • 软件调试与日志记录
    在上位机驱动或应用程序中添加详细的调试信息,记录每次传输的数据、错误码及时间戳,便于在系统出现异常时进行回溯和分析。

6.3 实例应用

以某嵌入式系统中与SPI闪存通信为例,工程师需完成如下任务:

  1. 系统初始化

    • 配置SPI主设备:设置工作模式(如模式0或模式3)、数据位宽、时钟频率等参数。
    • 初始化GPIO口,确保CS信号能够准确控制闪存片选。
  2. 数据读写操作

    • 写操作:先发送写命令及目标地址,然后传送数据。
    • 读操作:发送读命令及地址,接收返回的数据。
    • 每次传输完成后均需拉高CS信号,确保闪存正确保存数据。
  3. 错误处理

    • 针对闪存写入可能存在的写保护、忙状态等情况,设计超时重传机制。
    • 结合硬件调试工具,验证SPI时序是否满足闪存器件手册要求,调整时钟频率和数据传输延时。

通过对具体实例的调试和验证,工程师能够积累丰富的SPI通信经验,为后续系统设计提供宝贵参考。


七、总结与展望

本文详细讲解了SPI总线协议的基本原理、通信模式(重点解析了CPOL和CPHA的工作原理及其对数据传输时序的影响)、主从设备间的通信机制以及上位机实现SPI通信的具体方法。主要内容总结如下:

  1. SPI总线协议基础

    • SPI采用全双工同步串行通信,通过SCLK、MOSI、MISO和CS四根信号线实现高速数据传输。
    • 主设备负责生成时钟及控制片选信号,从设备按时钟同步传输数据,保证通信效率。
  2. 通信模式与时钟配置

    • CPOL决定时钟空闲状态下的电平,CPHA决定数据采样边沿。
    • 四种SPI模式(模式0~3)在不同应用中各有优缺点,工程师需依据器件要求进行选择。
  3. 主从通信及应用实例

    • 主设备通过精确控制时钟及片选信号,实现对从设备的可靠数据交换。
    • 上位机实现SPI通信可基于硬件SPI模块或软件模拟方式,各有适用场景与优缺点。
    • 在实际应用中,借助逻辑分析仪、示波器和详细调试日志,有效定位并解决数据错误、时序偏差等问题。
  4. 上位机实现SPI通信的关键技术

    • 利用Linux下的spidev设备文件实现数据传输,通过ioctl接口设置SPI工作模式、位宽和时钟速率。
    • 软件模拟SPI(Bit-Banging)为缺乏硬件支持的平台提供了解决方案,尽管传输速度较低,但适用于部分低速设备通信。

展望未来,随着嵌入式系统与物联网设备对高速、低延迟通信的需求不断增加,SPI总线协议在数据传输效率、信号完整性以及多设备协同工作方面将持续得到优化。新一代的SPI控制器不仅在硬件层面支持更高的传输速率,还能结合DMA、中断技术实现数据流的自动管理,为复杂系统提供更为可靠的数据通道。

同时,随着系统集成度不断提高,多总线混合通信模式(如SPI与I²C、UART、CAN等联合应用)也将成为趋势。在这种背景下,工程师需要深入理解各种总线协议的特性,并针对具体应用场景进行合理选择与优化设计。通过不断积累和总结实践经验,将有助于实现更高效、更稳定的系统通信方案。


结语

SPI总线协议以其全双工、高速传输和灵活的通信模式在工业、消费电子和嵌入式系统中占据重要地位。本文从SPI的基本原理出发,详细解析了CPOL与CPHA对通信时序的影响,介绍了主从设备间的协同工作机制,并结合上位机实现SPI通信的方法和实际应用案例,为工程师提供了一份系统而深入的技术指南。希望本文能够为从事硬件设计和系统调试的技术人员在解决SPI通信问题时提供有力支持,同时也为后续相关技术的研究和发展奠定理论基础。

通过对SPI总线协议的全面分析,我们可以看到在高速数据传输、低延迟响应和系统扩展性方面,SPI依然具有不可替代的优势。未来,随着新材料、新工艺和新技术的不断涌现,SPI及其它总线协议将在满足更高数据传输需求的同时,实现更智能、更高效的系统协同工作模式,为各类创新应用提供坚实的通信平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode出现:No module named ‘requests‘ 问题的解决方法

问题&#xff1a; ① No module named requests ② pip install requests&#xff1a;显示已经安装成功 运行失败原因&#xff1a; 我的失败原因是因为&#xff1a;我的python环境有两个&#xff0c;电脑C盘默认一个、pycharm下载后在它的路径下有一个。而vscode所运行的环境…

【openwebui 搭建本地知识库(RAG搭建本地知识库)】

安装准备 openwebui 这个本地安装之前写过使用python安装。也可以直接用docker 命令 docker run --rm -d \-p 3080:8080 \-p 3081:8081 \-e WEBUI_AUTHtrue \-e DEFAULT_LOCALEcn \-e GLOBAL_LOG_LEVEL"INFO" \-e AIOHTTP_CLIENT_TIMEOUT100 \--privilegedtrue \-…

雷池WAF 处理 HTTP 请求的流程

项目介绍 SafeLine&#xff0c;中文名 "雷池"&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、…

JAVA-Thread类实现多线程

引言&#xff1a; 本章博客涉及进程线程内容&#xff0c;如果不了解的可以看&#xff1a;什么是进程线程-CSDN博客 线程是操作系统的概念&#xff0c;操作系统提供的API供程序员使用操作。但是不同的操作系统(Winodws、Linux、Unix……差别很大),但是做为JAVA程序员就不需要担心…

【算法】DFS、BFS、拓扑排序

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;算法 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…

MySQL中 IN 到底走不走索引?

文章目录 前言数据库表结构查询sqlEXPLAIN介绍EXPLAIN 的输出每列解释 强制走索引查询时添加条件(复合索引字段)查询小时查询分钟 总结 前言 在 MySQL 中&#xff0c;IN 语句是否能够利用索引取决于多个因素&#xff0c;包括但不限于查询的具体形式、表的统计信息、索引的选择…

centos没有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc

腾讯云低代码开发应用

创建客户端应用 如上所示&#xff0c;登录腾讯云微搭低代码业务控制台&#xff0c;开始搭建企业官网应用 如上所示&#xff0c;在腾讯云微搭低代码业务控制台中&#xff0c;开始创建企业官网应用 如上所示&#xff0c;在腾讯云微搭低代码业务控制台中&#xff0c;开始编辑企业官…

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;很多人做了修改&#xff0c;denseNet网络无疑是最成功的…

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境

docker 搭建alpine下nginx1.26/mysql8.0/php7.4环境 docker-compose.yml services:mysql-8.0:container_name: mysql-8.0image: mysql:8.0restart: always#ports:#- "3306:3306"volumes:- ./etc/mysql/conf.d/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro- ./var/log…

Android7上移植I2C-tools

一&#xff0c;下载源码 cd hardware/libhardware/tests git clone https://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git 二&#xff0c; 在 i2c-tools 目录添加 Android.mk 编译文件 LOCAL_PATH: $(call my-dir)################### i2c-tools ###############…

Centos 7 修改语言和输入源为中文+修改终端快捷键复制为Ctrl+C、粘贴为Ctrl+V

目录 修改语言和输入源为中文 1、设置 2、Region & Language&#xff08;区域和语言&#xff09; 3、Add an Input Source&#xff08;添加输入源&#xff09; 4、修改语言为中文 5、Restart&#xff08;重启&#xff09; 6、Log Out &#xff08;注销&#xff09; …

DeepSeek-进阶版部署(Linux+GPU)

前面几个小节讲解的Win和Linux部署DeepSeek的比较简单的方法&#xff0c;而且采用的模型也是最小的&#xff0c;作为测试体验使用是没问题的。如果要在生产环境使用还是需要用到GPU来实现&#xff0c;下面我将以有一台带上GPU显卡的Linux机器来部署DeepSeek。这里还只是先体验单…

Python——计算机网络

一.ip 1.ip的定义 IP是“Internet Protocol”的缩写&#xff0c;即“互联网协议”。它是用于计算机网络通信的基础协议之一&#xff0c;属于TCP/IP协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机&#xff0c;并确保数据能够在复杂的网络环境中正…

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…

框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性

最近在思考一个问题&#xff1a;如何能够更好的分享主流框架源码学习笔记&#xff08;主要是源码部分&#xff09;?让有缘刷到的同学既可以有所收获&#xff0c;还能保持对相关技术架构探讨学习热情和兴趣。以及自己也保持较高的分享热情和动力。 今天尝试用一个SQL查询作为引…

ArrayList底层结构和源码分析笔记

参考视频&#xff1a;韩顺平Java集合 ArrayList特点 ArrayList 可以加入 null&#xff0c;包括多个。 ArrayList 是由数组来实现数据存储的 ArrayList 基本等同于 Vector&#xff0c;除了 ArrayList 是线程不安全&#xff08;执行效率高&#xff09;。在多线程情况下&#xf…

[内网渗透] 红日靶场2

环境配置 靶场地址: http://vulnstack.qiyuanxuetang.net/vuln/wiki/ 环境配置可以看这个: https://www.bilibili.com/video/BV1De4y1a7Ps/?spm_id_from333.337.search-card.all.click&vd_sourcecf73ac8de9b7c0322b1bccf77de91c5dNAT模式分配111段, DHCP也要更改 再添加…

MySQL 企业版 TDE加密后 测试和问题汇总

一、测试keyring file 1.1 当keyring file文件丢失或者被篡改 结论&#xff1a;不影响当前正在运行的数据库&#xff0c;但是在重启服务后会启动失败出现报错。 tail -n 100 /var/log/mysql/error.log 报错信息如下&#xff1a; 2025-03-12T08:04:54.668847Z 1 [ERROR] [M…