SPI接口协议的学习1

article/2025/8/23 7:56:15

SPI接口是一种同步串行总线(Serial Peripheral Interface)。

四线SPI接口连线图:
在这里插入图片描述

CS为片选脚,用于选中从机。
SCLK为时钟脚,用于数据传输时提供时钟信号。
MOSI为主output,从input,即主机发送脚。对应从机的引脚为SDI。
MISO为主input,从output,机主机接收脚。对应从机的引脚为SDO。

上述SPI为标准SPI协议(Standard SPI)或单线SPI协议(Single SPI),其中的单线是指该SPI协议中使用单根数据线 MOSI 进行发送数据,单根数据线 MISO 进行接收数据。为了适应更高速率的通讯需求,半导体厂商扩展SPI协议,主要发展出了 Dual/Quad/Octal SPI协议,加上标准SPI协议(Single SPI),这四种协议的主要区别是数据线的数量及通讯方式,见下表:
在这里插入图片描述

除了上述接法,SPI还支持半双工1bit模式:
在这里插入图片描述

SCLK:时钟线。
I/O:数据线,同一时刻要么主机发送,要么主机接收。
SS:片选脚。

Dual SPI的2bit模式:
在这里插入图片描述

由于是半双工,同一时刻要么主机使用MOSI、MISO线,要么从机使用MOSI、MISO线。

Quad SPI(4线)模式
与Dual SPI类似,也是针对SPI Flash,也是半双工,Quad SPI Flash增加了两根I/O线(SIO2,SIO3),目的是SCLK一次触发传输4bit数据。

在这里插入图片描述

以AC63芯片SPI接口为例,进行代码分析:
根据SPI接口的时序要求,SPI接口可以通过软件实现,也可以通过硬件实现。这里仅分析硬件实现方式。

查看数据手册可知,芯片最多支持三个SPI接口,分别是SPI0、SPI1、SPI2。SPI接口支持DMA发送、接收功能。
每个SPI接口可以映射到多个不同的引脚,分别为不同的组,即组A、组B、组C、组D。

SPI硬件包含控制寄存器、波特率寄存器、buf缓冲区寄存器、DMA地址寄存器、DMA计数寄存器。
寄存器结构体定义如下:
typedef struct {
__RW __u32 CON;
__WO __u32 BAUD;
__RW __u32 BUF;
__WO __u32 ADR;
__WO __u32 CNT;
} JL_SPI_TypeDef;

每个SPI接口寄存器基地址:
#define JL_SPI0_BASE (ls_base + map_adr(0x1c, 0x00))
#define JL_SPI0 ((JL_SPI_TypeDef *)JL_SPI0_BASE)

#define JL_SPI1_BASE (ls_base + map_adr(0x1d, 0x00))
#define JL_SPI1 ((JL_SPI_TypeDef *)JL_SPI1_BASE)

#define JL_SPI2_BASE (ls_base + map_adr(0x1e, 0x00))
#define JL_SPI2 ((JL_SPI_TypeDef *)JL_SPI2_BASE)

现将三个SPI寄存器首地址定义在数组中:
static JL_SPI_TypeDef *const spi_regs[SPI_MAX_HW_NUM] = {
JL_SPI0,
JL_SPI1,
JL_SPI2,
};
通过SPI的编号就可以进行对应SPI寄存器的访问操作。
SPI编号的定义:
enum {
SPI0, //0
SPI1,
SPI2,
SPI_MAX_HW_NUM, //3
};

SPI引脚分组说明:
SPI0:A、B、C、D组,支持1bit、2bit、4bit位宽
SPI1:A、B组,支持1bit位宽
SPI2:A、B组,支持1bit位宽
可以看出,SPI接口最多支持4组映射。
#define SPI_MAX_IO_GROUP 4

SPI IO引脚结构体:
struct spi_io {
u8 cs_pin;//片选
u8 di_pin;//输入
u8 do_pin;//输出
u8 clk_pin;//时钟
u8 d2_pin;//bit2
u8 d3_pin;//bit3
};

每个SPI支持的组数、组里面IO的定义,构成下面的结构体:
struct spi_io_mapping {
u32 num;//组数
struct spi_io io[SPI_MAX_IO_GROUP];//所有组的IO定义
};

SPI IO映射表:
static const struct spi_io_mapping spi_io_map[SPI_MAX_HW_NUM] = { //SPI_MAX_HW_NUM = 3
//SPI0
{
.num = 4,//SPI0有4组
//port A
.io[0] = {
.cs_pin = IO_PORTD_03,
.di_pin = IO_PORTD_02,
.do_pin = IO_PORTD_01,
.clk_pin = IO_PORTD_00,
.d2_pin = IO_PORTB_07,
.d3_pin = IO_PORTD_05,
},
//port B
.io[1] = {
.cs_pin = IO_PORTA_13,
.di_pin = IO_PORTA_14,
.do_pin = IO_PORTD_01,
.clk_pin = IO_PORTD_00,
.d2_pin = IO_PORTA_15,
.d3_pin = IO_PORTD_05,
},
//port C
.io[2] = {
.cs_pin = -1,//IO_PORTA_04,
.di_pin = IO_PORTA_06,
.do_pin = IO_PORTA_08,
.clk_pin = IO_PORTA_03,
.d2_pin = IO_PORTA_07,
.d3_pin = IO_PORTA_02,
},
//port D
.io[3] = {
.cs_pin = -1,//IO_PORTB_06,
.di_pin = IO_PORTB_08,
.do_pin = IO_PORTB_10,
.clk_pin = IO_PORTB_05,
.d2_pin = IO_PORTB_09,
.d3_pin = IO_PORTB_04,
}
},
//SPI1
{
.num = 2,//SPI1有2组
//port A
.io[0] = {
.cs_pin = -1,
.di_pin = IO_PORTB_02,
.do_pin = IO_PORTB_01,
.clk_pin = IO_PORTB_00,
.d2_pin = -1,
.d3_pin = -1,
},
//port B
.io[1] = {
.cs_pin = -1,
.di_pin = IO_PORTC_03,
.do_pin = IO_PORTC_05,
.clk_pin = IO_PORTC_04,
.d2_pin = -1,
.d3_pin = -1,
}
},
//SPI2
{
.num = 2,//SPI2有2组
//port A
.io[0] = {
.cs_pin = -1,
.di_pin = IO_PORTB_08,
.do_pin = IO_PORTB_10,
.clk_pin = IO_PORTB_09,
.d2_pin = -1,
.d3_pin = -1,
},
//port B
.io[1] = {
.cs_pin = -1,
.di_pin = IO_PORTA_13,
.do_pin = IO_PORT_DM,
.clk_pin = IO_PORT_DP,
.d2_pin = -1,
.d3_pin = -1,
}
},
};
SPI的选用需要按照上述各组IO的分配情况进行使用。


http://chatgpt.dhexx.cn/article/ejXesxar.shtml

相关文章

SPI接口详细介绍

概述 SPI Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线。常规只占用四根线,节约了芯片管脚,PCB的布局省空间。现在越来越多的芯片集成了这种通信协议,常…

软件模拟SPI接口程序代码

目录 SPI协议简介 SPI接口介绍 SPI接口连接图 SPI数据传输方向 SPI传输模式 模拟SPI程序 SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或者多个从设备,通常采用的是4根线,它们是MISO&…

SPI接口及驱动

1. 简介 SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构。支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输&#xf…

SPI 接口

SPI 接口的全称是“Serial Peripheral Interface”意为串行外围接口,是 Motorola 首先在其 MC68HCxx 系列处理器上定义的。SPI 接口主要应用于 EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。 SPI 接口是在 CPU 和外围低…

ESP32 SPI 接口的应用

总体介绍 1. ESP32 共有 4 个 SPI 控制器 SPI0、SPI1、SPI2、SPI3,用于连接支持 SPI 协议的设备。 SPI0 控制器作为 cache 访问外部存储单元接口使用;SPI1 作为主机使用;SPI2 和 SPI3 控制器既可作为主机使用又可作为从机使用。作主机使用时,每个 SPI 控…

SPI接口简介-Piyu Dhaker

SPI接口简介 作者: Piyu Dhaker 串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以…

弄懂SPI接口

SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,是一种高速的,全双工,同步的通信总线,在很多器件中被广泛应用。 SPI相关缩写 SS: Slave Select&…

SPI接口

SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用。 1. 接口 SPI接口经常被称为4线串行总线,SPI协议是主从模式:从机不主动发起访问&…

SPI接口简介

串行外设接口(SPI)是微控制器和外围IC(如传感器、ADC、DAC、移位寄存器、SRAM等)之间使用最广泛的接口之一。本文先简要说明SPI接口,然后介绍ADI公司支持SPI的模拟开关与多路转换器,以及它们如何帮助减少系统电路板设计中的数字GP…

SPI接口详解

一、SPI接口简介 SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用…

【科普贴】SPI接口详解

一、SPI接口简介 SPI接口是一种同步串行总线(Serial Peripheral Interface)多用于Flash存储器(如NOR Flash&Nand Flash),ADC、LCD控制器等外围器件的通讯接口。大大增强了处理器的外设扩展能力。 SPI接口缩写 SSE…

第四章 - 程序计数器

文章目录 1.PC 寄存器介绍2.PC 寄存器的作用3.代码示例4.两个常见面试题5.CPU时间片 官网文档 1.PC 寄存器介绍 JVM中的程序计数寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。…

运行时数据区 - 程序计数器

① 介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 PC寄存器用来存储指向下一条指令的地址(即将要执行的指令代码),由执行…

操作系统-程序计数器

查考资料:https://blog.csdn.net/xxb2008/article/details/42145649 程序计数器是用于存放下一条指令所在单元的地址的地方。 冯 诺伊曼计算机体系结构的主要内容之一就是“程序预存储,计算机自动执行”! 处理器要执行的程序(指…

04-程序计数器(PC计数器)

程序计数器 介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。 这里,并非是广义上所指的物理寄存器&…

三、程序计数器(PC寄存器)

文章目录 1.PC Register 介绍介绍作用 2.举例说明3.两个常见问题使用PC寄存器存储字节码指令的地址有什么用?PC寄存器为什么会被设定为线程私有的? 1.PC Register 介绍 介绍 JVM中的程序计时器(Program Counter Register)中&…

汇编语言、寄存器分类及程序计数器

目录 一、计算机语言 汇编语言 寄存器分类 二、程序计数器 一、计算机语言 计算机是由二进制构成的,它只能听懂二进制也就是机器语言,但是普通人是无法看懂机器语言的,这个时候就需要一种电脑既能识别,人又能理解的语言&…

Java --- JVM程序计数器(PC寄存器)

目录 一、程序计数器(PC寄存器) 二、主要功能作用 三、PC Register 四、PC寄存器面试题 五、CPU时间片 一、程序计数器(PC寄存器) JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。C…

计数器

文章目录 【 1. 同步计数器 】① 同步二进制计数器同步二进制加法计数器74161 十六进制四位二进制加法计数器74163 同步二进制减法计数器同步二进制加/减计数器单时钟方式 74191双时钟方式 74193 ② 同步十进制计数器同步十进制加法计数器7416074162 同步十进制减法计数器同步十…

4 程序计数器

1、输入日期,转化为毫秒数: 用calendar方法(calendar.getTime) 代码: public static void main(String[] args) {Calendar calendar Calendar.getInstance();calendar.set(2017, 6, 27, 15, 9, 0);System.out.print…