正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.1,2 SPI驱动实验-SPI协议介绍

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

SPI学习参考资料:

简述SPI通信协议-01_cpha选择为第一个边沿-CSDN博客

SPI中的CPHA,CPOL详解-CSDN博客

一文搞懂SPI通信协议_spi协议-CSDN博客

摩托罗拉 《SPI Block Guide V03.06》 手册

链接:https://pan.baidu.com/s/1_mvR5AD0-OBI2bYyx2i4Sw?pwd=f4bo 
提取码:f4bo

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第24讲 SPI驱动。本节将参考正点原子的视频教程第24讲和配套的正点原子开发指南文档进行学习。

0. 概述

通I2C一样,SPI是很常用的通信接口,也可以通过SPI来连接众多的传感器。相比I2C接口,SPI接口的通信速度很快,I2C最多400KHz,但是SPI可以到达即使MHz。I.MX6U 也有4个SPI接口,可以通过这4个SPI接口来连接一些SPI外设。I.MX6U-ALHPA使用SPI3接口连接了一个6周传感器 ICM-20608,本章我们就来学习如何使用I.MX6U的SPI接口来驱动ICM-20608,读取ICM-20608的六轴数据。

1. SPI简介

上一章我们讲解了I2C,I2C是串行通信的一种,只需要两根线就可以完成主机和从机之间的通信,但是I2C的速度最高只能到400KHz,如果对于访问速度要求比较高的话I2C就不适合了。本章我们就来学习另外一个和I2C一样广泛使用的串行协议:SPI,SPI的全称是 Serial Peripheral Interface,也就是串行外围设备接口。SPI是Motorola公司推出的一种同步串行接口技术,是一种高速,全双工的同步通信协议,SPI时钟频率相比I2C要高很多,最高可以工作到上百Mhz。SPI以主从方式工作,通常是有一个主设备和一个或多个从设备,一般SPI需要4根线,但是也可以使用三根线(单向传输),本章我们讲解标准的4线SPI,这4根线如下:

  1. CS/SS, Chip Select/Slave Select,这个是片选信号线,用于选择需要进行通信的从设备。I2C主机是通过发送从机设备地址来选择需要进行通信的从设备的,SPI主机不需要发送从机设备地址,而是直接将相应的从机设备片选信号拉低。
  2. SCK,Serial Clock,串行时钟,和I2C的SCL一样,为SPI通信提供时钟。
  3. MOSI/SDO,Master Out Slave In/Serial Data Output,简称主出从入线,这根数据线只能用户主机向从机发送数据,也就是主机输出,从机输入。
  4. MISO/SDI,Master In Slave Out/Serial Data Input,简称主入从出线,这根数据线只能用于从机向主机发送数据,也就是主机输入,从机输出。

SPI 通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过SPI线连接多个从设备的结构如下图所示:

 

1.1 SPI工作模式

SPI由四种工作模式,通过串行时钟极性(CPOL: Clock Polity)和相位(CPHA:Clock Phase)的搭配来得到四种工作模式:

描述
CPOL=0串行时钟空闲状态为低电平
CPOL=1

串行时钟空闲状态为高电平

此时可以通过配置时钟相位CPHA(Clock Phase)来选择具体的传输协议

CPHA=0串行时钟的第一个跳变沿(上升沿或下降沿)来采集数据
CPHA=1串行时钟的第二个跳变沿(上升沿或下降沿)来采集数据

这四种工作模式如下图所示:

跟I2C一样,SPI也是有时序图的,以CPOL=0,CPHA=0(正点原子提供的指导文档这里应该是写错了,从下面采样时序图来看是在第二个时钟沿采样MISO/MOSI数据的,应该是CPHA=1) 这个工作模式为例,SPI进行全双工通信的时序图如下图所示:

CPOL=0, CPHA=1,Mode0 工作模式:在空闲状态的时候,SCLK为低电平,CPHA=1在第二个时钟沿采样,所以是在从高电平跳变为低电平,也就是下降沿沿进行数据采样。

从图中可以看出,SPI的时序图很简单,不像I2C那样还要分为读时序和写时序,因为SPI是全双工的,所以读写时序在一起同时完成。上图中,CS片选信号先拉低,选中需要通信的从设备,然后通过MOSI和MISO这两根数据线进行收发数据,MOSI数据线发出了 0XD2 这个数据给从机,同时从设备也通过MISO线给主机返回了 0X66 这个数据。这个就是SPI的时序图。

1.2 什么是SPI的 CPHA 第一个上升沿,第二个上升沿?

SPI协议的CPHA(Clock Phase)相位决定是在第一个跳变沿还是在第二个跳变沿采集数据,那么什么时第一个跳变沿,什么又是第二个跳变沿哪?问下"百度AI助手好了",结果输出如下:

但是,百度AI助手大模型这里总结提炼的东西大部分是正确,但是中间的CPOL(Clock Polarity)和CPHA(Clock Phase)组合之后的采集沿是在第一个跳变沿采集还是在第二个跳变沿采集,百度AI助手大模型搞错了。这就是AI大模型助手的问题,有时间会给出看似正确但是实际上细节错误的东西。

不过这些百度AI助手提取出来的信息对于我来讲还是有效的,第一它给出了一些SPI CPOL(Clock Polarity)和CPHA(Clock Phase)的组合概念提炼,第二它给出了引用链接来源,我去读一下它的引用链接不就能得到有用信息了么,赞。

把百度AI助手提供的有用信息总结一下就是:

SPI协议中的CPHA(Clock Phase)决定了数据传输采样和移位方式,具体涉及到时钟信号的跳变沿。在一个时钟周期内,会有两次跳变沿:上升沿(从低电平到高电平的变化)和下降沿(从高电平到低电平的变化)。

  • 当CPHA=0时,表示数据在使用信号的第一个跳变沿(即上升沿或下降沿,具体取决于CPOL的设置)进行采样。
  • 当CPHA=1时,表示数据在时钟信号的第二个跳变边沿进行采样。

结合CPOL(Clock Polarity)的设置,可以形成SPI的四种工作模式:

  1. Mode0 (CPOL=0, CPHA=0):数据在时钟的第一个跳变沿采样,因为CPOL=0 低电平表示空闲Idle,所以第一个跳变沿是上升沿(由低到高)采样。
  2. Mode1 (CPOL=0, CPHA=1):数据在时钟的第二个跳变沿采样,因为CPOL=0 低电平表示空闲Idle,所以第二个跳变沿是下降沿(由高到低)采样。
  3. Mode2 (CPOL=1, CPHA=0):数据在时钟的第一个跳变沿采样,因为CPOL=1 高电平表示空闲Idle,所以第一个跳变沿是下降沿(由高到低)采样。
  4. Mode3(CPOL=1, CPHA=1):数据在时钟的第二个跳变沿采样,因为CPOL=1 高电平表示空闲Idle,所以第二个跳变沿是上升沿(由低到高)采样。

参考如下链接里的博文,给出了总结的图片,图片总结的很完备了

SPI中的CPHA,CPOL详解-CSDN博客

2. SPI协议更多扩展知识和资料

SPI协议更多扩展知识和资料见如下的引用博文和引用链接:

Introduction to SPI interface - NXP Community

SPI-DirectC v2021.1 User Guide

SPI有关CPOL和CPHA的时序图-CSDN博客

简述SPI通信协议-01-CSDN博客

一文搞懂SPI通信协议_spi协议-CSDN博客

SPI中的CPHA,CPOL详解-CSDN博客

有线通信--一文弄懂SPI--(基础篇)_spi 是无线还是有线-CSDN博客

下面内容引用自:不脱发的程序员

1 简介

SPI是串行外设接口(Serial Periphaeral Interface)的缩写,是美国摩托罗拉公司(Motorla)最先推出的一种同步串行传输规范,也是一种单片机外设芯片串行扩展接口,是一个汇总高速,全双工,同步通信总线,所以可以在同一时间发送和接收数据,SPI没有定义速度限制,通常能达到甚至超过10Mbps。

SPI由主,从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机),主模块选择一个从模块进行通信,从而完成数据的交换。提供时钟的为主设备(Master),接受时钟的为从设备(Slave),SPI的时钟永远由主设备提供,SPI接口的读写操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号(Chip Select)进行管理。

SPI工薪原理很简单,需要至少4根线,单向传输时需要3根线,它们是:MISO,MOSI,SCLK,和CS/SS。

  • MISO(Master In Slave Out):主设备输入,从设备输出
  • MOSI(Master Out Slave In):主设备输出,从设备输入
  • SCLK(Serial Clock):串行时钟,由主设备产生
  • CS/SS(Chip Select/Slave Select):片选信号,从设备使能信号,由主设备控制,一主多从时,CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先定义的使能信号(高电平或者低电平),主芯片对此从芯片的操作才有效。

一主一从模式

一主多从模式。

2 通信原理

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的串行寄存器写入一个字节来发起一次传输。

SPI数据通信的流程可以分为一下几步:

  1. 主设备发起信号,将CS/SS拉低,启动通信
  2. 主设备发送时钟信号,来高速从设备进行写数据或者读数据操作(采集时机可能是时钟的上升沿(电平从低到高)或下降沿(电平从高到低),因为SPI由四种工作模式,后面会讲到),它将立即读取数据线上的信号,这样就得到了一个数据(1bit)。
  3. 主机(Master)将要发送的数据写到发送数据缓冲区(Memory),缓冲区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的传送给从机,同时MISO接口接收数据通过移位寄存器一位一位移到接收缓存区。
  4. 从机(Slave)也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接受主机发送的数据,这样,两个移位寄存器中的内容就被交换。

例如,如下示例中简单的模拟了SPI通信的流程,主机拉低NSS片选信号,启动通信,并且(主机)产生时钟信号,上升沿触发边沿信号,主机在MOSI线路一位一位发送数据 )X53,在MISO线路一位一位接收数据0X46,如下图所示。

备注:这里MISO,MOSI的数据发送和接收是同一个时间域,原博文的作者表示这个图只是一个示意图,原博解释这个图MISO,MOSI画成了串行的并解释说只是一个示意图。

这里有一点需要着重说明一下:SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。若只进行写操作,主机只需忽略接受到的字节(虚假数据);反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据,你要收一个数据必须也要发一个数据

3. 通信特性

3.1 设备选择

SPI是单主设备(Single Master)通信协议,只有一支主设备能发起通信,当SPI主设备向读/写从设备时,它首先拉低从设备对应的SS线(SS是低电平有效)。接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发送到MOSI实现“写”,同时对MISO采样实现“读”。如下图所示:

3.2 设备时钟

SPI色时钟特点主要包括:时钟频率,时钟极性,和时钟相位三方面。

3.2.1 时钟频率

SPI总线上的主设备必须在通信开始的时候配置并生成相应的时钟信号。从理论上将,只要实际可行,时钟频率可以是你想要的任何速率,当然这个速率受限于系统能够提供多大的时钟频率,以及SPI传输速率。

3.2.2 时钟极性

根据硬件制造商的命名规则不同,时钟极性土场写位CKP(ClocK Polarity)或者CPOL(Clock Polarity)。时钟极性和相位共同决定了读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。

CKP(ClocK Polarity)可以配置为1或者0。这意味着你可以根据需要将默认状态(Idle:空闲)设置为高或低。极性翻转可以通过简单的逻辑逆变器实现。你必须参考设备的数据手册才能设置正确的CKP和CKE。

  • CKP=0:时钟空闲IDLE为低电平0。
  • CKP=1:时钟空闲IDLE为高电平1。

3.2.3 时钟相位

根据硬件制造商的不同,时钟相位通常写为CKE(ClocK pHase)或者CPHA(Clock Phase)。顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿:

  • CKE=0:在时钟信号SCK的第一个跳变沿采样;
  • CKE=1:在时钟信号SCK的第二个跳变沿采样;

3.3 四种模式

根据SPI的时钟极性和时钟相位特性可以设置4中不同的SPI通信操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转有序列表换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(也就是时钟信号无效时是高还是低),详情见如下:

  • Mode0:CPOL=0,CPHA=0:当空闲状态时,SCK处于低电平,数据采集是在第一个边沿,也就是SCK由低电平到高电平的跳变,所以数据采集发生在上升沿(接收数据),数据发送是在下降沿。
  • Mode1:CPOL=0,CPHA=1:当空闲状态时,SCK处于低电平,数据采集是在第二个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集发生在下降沿,数据发送是在上升沿。
  • Mode2:CPOL=1,CHPA=0:当空闲状态时,SCK处于高电平,数据采集是在第一个边沿,也就是SCK从高电平变为低电平,所以数据采集是在下降沿,数据发送是在上升沿。
  • Mode3:CPOL=1,CPHA=1:当空闲状态时,SCK处于高电平,数据采集是在第二个边沿,也就是SCK从低电平变为高电平,所以数据采集是在上升沿,数据发送是在下降沿。

举个例子,下图是SPI Mode0 读/写时序,可以看出SCK空闲时为低电平,主机数据在第一个跳变沿被从机采样,数据输出同理。

下图是SPI Mode3 的读/写时序,SCK为空闲时为高电平,主机数据在第二个跳变沿别采样,数据输出同理。

4. 多从机模式

由两种方法可以将多个从机设备连接到主设备:

  1. 多片选
  2. 和菊花链

通常每个从机都需要一条单独的SS线。如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他SS信号线的状态为高电平;如果同时将两个SS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接受乱码数据。

菊花链的最大确定是信号串行传输,一旦数据链路中的某个设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了。另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况。

5. SPI的优缺点

  • 优点
  1. 无起始位和停止位,因此数据可以连续传输而不会被中断。
  2. 没有像I2C那样负责的从设备寻址系统
  3. 数据传输速率比I2C更高(几乎快两倍)
  4. 分离的MISO 和 MOSI 信号线,因此可以同时发送和接收数据。
  5. 极其灵活的数据传输,不限与8位,可以是任意大小的字。
  6. 非常简单的硬件结构,从机不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器(与UART不同)。不需要收发器(与CAN不同)。
  • 缺点
  1. 使用4根信号线(I2C和UART使用两根信号线)
  2. 无法确认传输是否已经成功接收数据(I2C有此功能)
  3. 没有任何形式的错误检查,如UART中的奇偶校验位
  4. 只允许一个主设备
  5. 没有硬件从机应答信号(主机可能在不知情的情况下无处发送)
  6. 没有定义硬件级别的错误检查协议
  7. 与RS-232和CAN总线相比,只能支持非常短的距离。​​​​​​

6. 摩托罗拉公司SPI协议规范:

摩托罗拉 《SPI Block Guide V03.06》 手册

链接:https://pan.baidu.com/s/1_mvR5AD0-OBI2bYyx2i4Sw?pwd=f4bo 
提取码:f4bo

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux实验六:进程间通信(二)

目录 一、实验目的二、实验内容三、实验环境四、参考代码五、实验步骤步骤1. 编辑源代码test6.c步骤2. 编译源代码test6.c步骤3. 运行可执行程序test6步骤4. 进一步调试源代码test6.c 六、实验结果七、实验总结 一、实验目的 1、理解 POSIX 和 System V 提供的 IPC 相关概念&a…

安防监控视频平台LntonCVS视频监控汇聚平台遏制校园暴力保护校园学生安全应用方案

未成年人被誉为祖国的花朵,是我们国家的未来。然而,最近频繁曝出的未成年霸凌事件却引发了社会的广泛关注。这些事件手段残忍,事态恶劣,引发了全社会对如何保护未成年身心健康、规避霸凌事件发生的深刻思考。 为了更好地保障学生的…

从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件

文章目录 从零开始:如何用Electron将chatgpt-plus.top 打包成EXE文件准备工作:Node.js和npm国内镜像加速下载初始化你的Electron项目创建你的Electron应用运行你的Electron应用为你的应用设置图标打包成EXE文件结语 从零开始:如何用Electron将…

echarts学习:将echats实例代理为响应式对象可能带来的风险

1.起源 最近我在学习如何封装echarts组件,我所参考的其中一篇博客中提到了一个“图表无法显示的问题”。 根据其中的介绍,造成此种问题的原因是因为,使用ref接受了echarts实例,使得echarts实例被代理为了响应式对象,进…

[C#]使用C#部署yolov8的obb旋转框检测tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:TensorRT-CShar…

3D视觉系统实现自动化上下料操作

在竞争激烈的汽车制造行业,提高生产效率、降低成本并保证产品质量是企业持续发展的关键。特别是在汽车制造过程中,各种零部件的上下料操作占据了大量的生产时间,因此如何实现这些操作的自动化、高效化成为了一个亟待解决的问题。 富唯智能3D视…

pom文件中,Maven导入依赖出现 Dependency not found

解决方案: 1、首先看一下自己的Maven是否配置好了 2、再检查一下镜像是否正确 3、如果上面都没有问题,看 dependencyManagement 标签 我这个出错,爆一大片红就是因为 这个标签 dependencyManagement 解决方法:在父工程中进行依…

在 Kubesphere 中开启新一代云原生数仓 Databend

上周六,由 KubeSphere 社区联合 Databend 社区以及纵目科技共同组织的云原生 Meetup 北京站在北京圆满落幕。本次 Meetup 活动邀请到了 SkyWalking PMC 成员、青云科技架构及可观测性团队负责人、江苏纵目科技 APM 研发总监、青云科技容器产品经理、数元灵科技 CTO …

JVM内存划分类加载的过程双亲委派模型的详解

JVM内存划分 JVM也就是java进程,这个进程一旦跑起来就会从操作系统这里申请一大块内存空间,JVM接下来就要进一步的对这个大的空间进行划分,划分成不同区域,从而每个区域都有不同的功能作用,一共分为如下几个区域 1.堆…

【数据结构】二叉树-堆(下)-链式二叉树

个人主页~ 二叉树-堆&#xff08;上&#xff09; 栈和队列 二叉树 四、堆的代码实现Heap.hHeap.ctest.c 五、堆的应用堆排序思想进行排序 六、二叉树链式结构的实现BTree.hBTree.ctest.c 四、堆的代码实现 Heap.h #pragma once#include <stdio.h> #include <stdlib…

Leetcode:寻找两个正序数组的中位数

题目链接&#xff1a;4. 寻找两个正序数组的中位数 - 力扣&#xff08;LeetCode&#xff09; 题目分析 1、当只有一个有序数组时&#xff0c;该数组的中位数会将该数组分为两份&#xff1a;左子数组 和 右子数组 2、当有两个有序数组时&#xff0c; 我们仍然可以通过一条分隔…

计算机网络之快重传和快恢复以及TCP连接与释放的握手

快重传和快恢复 快重传可以让发送方尽早得知丢失消息&#xff0c; 当发送消息M1,M2&#xff0c;M3,M4,M5后,假如消息M2丢失&#xff0c;那么按照算法会发送对M2报文前一个报文M1的重复确认&#xff08;M1正常接受到&#xff0c;已经发送了确认),然后之后收到M4,M5,也会发送两…

内网安全之注册和查看证书

注册证书 如图所示&#xff0c;是 Will Schroeder 和 Lee Christensen 发布的 Certified_Pre-Owned 白皮书里面画的证书注册流程: 从图中我们可以看到&#xff0c;证书注册流程如下&#xff1a; 客户端生成一对公、私钥。客户端生成证书签名请求(CSR&#xff0c;Certificate…

linux系统——性能检测工具glances

在linux系统中&#xff0c;由python开发的glances工具是一个功能强大的性能检测工具 可以通过yum进行安装 安装glances后&#xff0c;进入命令界面 glance支持网站模式&#xff0c;将监控到的数据以网站形式显示出来 这里需要用python包管理命令 使用glances -w开放…

Java集合-List(Collection子接口)及其子类(ArrayList、Vector、LinkedList)

List接口是 Collection接口的子接口。 1、List集合类中数据有序&#xff0c; 即添加顺序和取出顺序有序&#xff0c;而且可以重复。 2、List集合类中每个元素都有其对应的顺序索引&#xff0c;即支持索引。例&#xff0c;list.get(2)&#xff1b;取第三个元素。 3、实现类有很多…

百度地图1

地图的基本操作 百度地图3.0文档 百度地图3.0实例中心 设置地图 centerAndZoom(center: Point, zoom: Number)设初始化地图,center类型为Point时&#xff0c;zoom必须赋值&#xff0c;范围3-19级&#xff0c; // 百度地图API功能var map new BMap.Map("map"); //…

CentOS8搭载正反向解析dns服务器

1.介绍&#xff08;是什么&#xff09; DNS&#xff08;Domain Name System&#xff09;&#xff0c;即域名系统&#xff0c;是一个将域名和 IP 地址相互映射的分布式数据库&#xff0c;它可以将用户输入的域名转换成对应的 IP 地址。DNS 由多个服务器组成&#xff0c;分为多个…

企业想要搭建一个虚拟展厅需要多少钱?

企业搭建虚拟展厅的费用会根据多种因素有所不同&#xff0c;主要包括展厅的类型、规模、功能需求、技术复杂度以及服务商的定价策略等。以下是关于虚拟展厅搭建费用的分点说明和归纳&#xff1a; 一、展厅类型&#xff1a; 1、全景实拍展厅&#xff1a; 利用VR全景拍摄技术还…

结构体中内存的对齐

前言 学C的同学应该知道~ 想精通C语言就不得不面对—指针与内存 续上次指针进阶&#xff0c;这一章我来聊一聊C语言内存对齐的问题 学习结构体的你有没有注意过结构体向系统申请的内存为多少呢的&#x1f601; 思考 #include<stdio.h> typedef struct s1 {char a;char …

【Python】 如何获取 Python 函数的名称作为字符串?

基本原理 在 Python 中&#xff0c;获取函数名称是一个简单但非常有用的技巧&#xff0c;尤其是当你需要动态地引用函数或者在日志、调试中需要函数名称时。Python 提供了几种方法来获取函数的名称。 方法一&#xff1a;使用 __name__ 属性 每个函数对象都有一个 __name__ 属…