在SPI接口使用之前,需要实现SPI提供的服务,包括:
SPI接口的初始化、配置、打开、关闭、发送、接收等,如果使能了中断,还需要提供中断服务程序,使能了DAM,需要提供DMA的收发程序等。
实现上述功能服务前,还需要提供一些基础的服务,比如寄存器配置、状态获取、配置参数获取和设置、GPIO相关初始化和配置控制等。
通过前面学习可知,SPI寄存器的基地址获取方式:
spi_regs[SPI0]
spi_regs[SPI1]
spi_regs[SPI2]
其中SPI0、SPI1、SPI2为SPI编号。
通过基地址和寄存器配置相关的宏定义,可以实现对寄存器的配置。
对于SPI GPIO的访问,需要知道使用了哪个SPI,即SPI的编号,使用了哪个组。
当上层使用SPI接口时,传入参数为SPI设备。这里提供函数,通过SPI设备返回其编号,函数实现如下:
static u8 spi_get_info_id(spi_dev spi)//获取ID
{
ASSERT(spi < SPI_MAX_HW_NUM);
return spi;
}
这里SPI设备号和SPI编号一致,因此为相同的值。
上层调用SPI接口时传入SPI设备即为SPI的编号。
通过SPI设备,获取其用了哪个端口,即哪个组,函数实现如下:
static u8 spi_get_info_port(spi_dev spi)
{
u8 port = (u8) - 1;
u8 id = spi_get_info_id(spi);
switch (id) {
#if SPI0_ENABLE
case SPI0:
port = spi0_p_data.port;
break;
#endif
#if SPI1_ENABLE
case SPI1:
port = spi1_p_data.port;
break;
#endif
#if SPI2_ENABLE
case SPI2:
port = spi2_p_data.port;
break;
#endif
default:
break;
}
ASSERT(port - ‘A’ < spi_io_map[id].num);
return port;
}
有了SPI的编号和组,就可以知道使用了哪些GPIO。
GPIO的相关操作:映射、初始化、配置等。
根据SPI的选择,需要配置端口的映射,将端口关联到SPI接口上。
0-3分别对应A-D:
A组IO: DI: PD2 DO: PD1 CLK: PD0 D2:PB7 D3:PD5
B组IO: DI: PA14 DO: PD1 CLK: PD0 D2:PA15 D3:PD5
C组IO: DI: PA6 DO: PA8 CLK: PA3 D2:PA7 D3:PA2
D组IO: DI: PB8 DO: PB10 CLK: PB5 D2:PB9 D3:PB4
static void spi0_iomc_config(spi_dev spi)//SPI0端口映射,A、B、C、D组
{
u8 port = spi_get_info_port(spi);//获取端口,即组
if (port == ‘A’) {
JL_IOMAP->CON0 &= ~(BIT(16) | BIT(17));//配置IOMAP的CON0的16和17bit
} else if (port == ‘B’) {
JL_IOMAP->CON0 &= ~(BIT(16) | BIT(17));
JL_IOMAP->CON0 |= (BIT(16));
} else if (port == ‘C’) {
JL_IOMAP->CON0 &= ~(BIT(16) | BIT(17));
JL_IOMAP->CON0 |= (BIT(17));
} else {
JL_IOMAP->CON0 |= (BIT(16) | BIT(17));
}
}
SPI1 模块 IO 选择
0:选择 PB0/PB1/PB2 作为 SPI1 的 CLK/DO/DI;
1:选择 PC4/PC5/PC3 作为 SPI1 的 CLK/DO/DI
static void spi1_iomc_config(spi_dev spi)//SPI1端口映射
{
u8 port = spi_get_info_port(spi);
if (port == ‘A’) {
JL_IOMAP->CON1 &= ~BIT(4);
} else if (port == ‘B’) {
JL_IOMAP->CON1 |= BIT(4);
}
}
SPI2 IO 选择
0: PB9/PB10/PB8 => CLK/DO/DI
1: USBDP/USBDM/PA13 => CLK/DO/DI
static void spi2_iomc_config(spi_dev spi)//SPI2端口映射
{
u8 port = spi_get_info_port(spi);
if (port == ‘A’) {
JL_IOMAP->CON1 &= ~BIT(16);
} else if (port == ‘B’) {
JL_IOMAP->CON1 |= BIT(16);
}
}
配置映射寄存器。进行GPIO与SPI的关联。
对于GPIO,需要配置其输入、输出、上下拉电阻等
static void spi_io_port_init(u8 port, u8 dir)//IO初始化
{
if (port != (u8) - 1) {
if (dir == 1) {
gpio_set_direction(port, 1);//输入
} else {
gpio_set_direction(port, 0);//输出
}
gpio_set_die(port, 1);//IO普通输入
gpio_set_pull_up(port, 0);//不上拉
gpio_set_pull_down(port, 0);//不下拉
}
}
static void spi_io_port_uninit(u8 port)//IO un int
{
if (port != (u8) - 1) {
gpio_set_direction(port, 1);//输入
gpio_set_die(port, 0);//IO模拟输入
gpio_set_pull_up(port, 0);//不上拉
gpio_set_pull_down(port, 0);//不下拉
}
}
注意:这里的port不是组,而是GPIO的端口号。
需要将SPI使能的组的GPIO进行初始化操作:
spi_set_bit_mode函数配置了SPI的位宽,不同位宽对应GPIO数量不同。
根据SPI编号和组,对相应GPIO进行了初始化。
void spi_set_bit_mode(spi_dev spi, int mode)//设置spi[单向/双向,位数]模式
{
u8 id = spi_get_info_id(spi);//ID
u8 port = spi_get_info_port(spi);//端口
u8 role = spi_get_info_role(spi);//主从
switch (mode) {
case SPI_MODE_BIDIR_1BIT://1bit
spi_bidir(spi_regs[id]);//双向
spi_data_width(spi_regs[id], 0);//1bit 数据宽度
break;
case SPI_MODE_UNIDIR_1BIT://1bit
spi_unidir(spi_regs[id]);//单向
spi_data_width(spi_regs[id], 0);//1bit 数据宽度
break;
case SPI_MODE_UNIDIR_2BIT://单向2bit
/* ASSERT(id == 0, “spi%d not support SPI_MODE_UNIDIR_2BIT\n”, id); /
spi_unidir(spi_regs[id]);//单向
spi_data_width(spi_regs[id], 1);//2bit 数据宽度
break;
case SPI_MODE_UNIDIR_4BIT://单向4bit
ASSERT(id == 0, “spi%d not support SPI_MODE_UNIDIR_4BIT\n”, id);//SPI0才支持4bit
spi_unidir(spi_regs[id]);//单向
spi_data_width(spi_regs[id], 2);//4bit 数据宽度
break;
}
//port为A、B、C
port -= ‘A’;
if (id == SPI2 && port + ‘A’ == ‘B’) {//如果使用的是SPI2的B组
JL_USB_IO->CON0 |= BIT(11); //IO MODE,配置USB端口为IO模式,USB两个端口当IO使用
spi_io_port_init(spi_io_map[id].io[port].di_pin, 1);//IO配置为输入
JL_USB_IO->CON0 &= ~BIT(2); //DP DIR OUT,DP配置为输出
JL_USB_IO->CON0 &= ~BIT(3); //DM DIR OUT,DM配置为输出
JL_USB_IO->CON0 |= BIT(9); //DP 1.2V digital input en,1.2V DP 数字输入使能
JL_USB_IO->CON0 |= BIT(10); //DM 1.2V digital input en,1.2V DM 数字输入使能
} else {
spi_io_port_init(spi_io_map[id].io[port].clk_pin, role == SPI_ROLE_MASTER ? 0 : 1);//主机模式下,CLK配置为输出,否则为输入
spi_io_port_init(spi_io_map[id].io[port].do_pin, 0);//DO配置为输出
//单向1bit下,DI不使用
if (mode == SPI_MODE_BIDIR_1BIT) {//双向1bit
spi_io_port_init(spi_io_map[id].io[port].di_pin, 1);//DI配置为输入
} else if (mode == SPI_MODE_UNIDIR_2BIT) {//单向2bit
spi_io_port_init(spi_io_map[id].io[port].di_pin, 0);//DI配置为输出
} else if (mode == SPI_MODE_UNIDIR_4BIT) {//单向4bit
spi_io_port_init(spi_io_map[id].io[port].di_pin, 0);//DI配置为输出
spi_io_port_init(spi_io_map[id].io[port].d2_pin, 0);//D2配置为输出
spi_io_port_init(spi_io_map[id].io[port].d3_pin, 0);//D4配置为输出
}
}
}*
相关推荐
高通平台SPI外设的片选信号配置
spi master 和spi device有各自的dts配置: 这是spi master的配置示例,也就是spi控制器 这是一个spi device的配置示例,也就是spi外设(从设备) 一个spi控制器上可以连接多个从设备,在任何时刻只有一个从设备可以通过spi控制器的数据线进行通信。片选信号就是用来确认当前和哪个外设进行通信的选择机制。一般情况下控制器想和哪个外设通讯时,会将连接到这个外...
杰里之. 输出 3 路 PMW【篇】
user_pwm_init(IO_PORTA_14,100 ,0,1); user_pwm_init(IO_PORTA_05,200 ,1,0); user_pwm_init(IO_PORTA_07,150 ,2,1); #define PWM_FRE 3000 void user_pwm_init(u32 port,u16 pwm_wide,u32 pwn_chl,bool output) { #if 1 log_info(“mio pwm init -> pwn_chl : %d\n”, pwn_
基于FPGA的SPI协议实现
一、SPI协议 1、SPI协议概括 SPI(Serial Peripheral Interface)——串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟,AD转换器以及数字信号处理器和数字信号解码器之间。SPI是一种高速,全双工,同步的通信总线,在芯片上只占用四根线(CS、MOSI、MISO、SCK),极大的...
杰理之复位IO维持电平使用说明【篇】
1、复位前设置IO状态 注意有些封装多IO内绑在一起,则需要设置另外IO为高阻模式,如PB8高阻: gpio_set_die(IO_PORTB_08, 0); gpio_set_pull_up(IO_PORTB_08, 0); gpio_set_pull_down(IO_PORTB_08, 0); gpio_direction_input(IO_PORTB_08); 硬件没外置上拉电阻则使用内部上下拉电阻 硬件外部上下拉,则需要关闭内部的上下拉 硬件没有上下拉,则使用内部上下拉:根据输出1开上拉关下拉,输出
SPI接口协议创新方向及实施路径分析
SPI接口协议创新方向及实施路径分析
20- ESP32-S3 SPI 外设,主设备编程方法
ESP32-S3 芯片集成了四个SPI 控制器,分别为和SPI3。SPI0 和SPI1 控器主要供内部使用以访问外部 FLASH 和 PSRAM,所以只能使用SPI2 和 SPI3。SPI2 又称为HSPI,SPI3 又称为VSPI,这两个属于GP-SPI。特性描述支持模式主机模式和从机模式支持通信方式半双工通信和全双工通信支持的数据模式。
SPI接口协议
SPI(Serial Peripheral Interface)是由Motorola公司定义的接口协议标准,串行外设接口(SPI)是微控制器和外围IC(如传感器、 ADC、 DAC、移位寄存器、 SRAM等)之间使用最广泛的接口之一。SPI是一种同步、全双工、主从式接口,来自主机或从机的数据在时钟上升沿或下降沿同步,主机和从机可以同时传输数据, SPI接口可以是3线式或4线式。
嵌入式(3):10大核心接口协议深度解析与实战指南
在嵌入式开发领域,设备间的数据交互离不开各类接口与协议,它们如同不同设备沟通的“数字语言”。从智能手环的传感器数据传输,到自动驾驶汽车的ECU协同控制,掌握这些“语言”是每一位嵌入式工程师的必修课。本文将深入剖析10大核心接口协议,结合实战代码、时序图和选型指南,助力你快速成长为嵌入式开发高手!
SPI接口协议的学习1
SPI接口的学习,包含SPI的模式,接口连线、定义等说明
《深入浅出图神经网络:GNN原理解析》学习笔记
期末考完了,该上道了 目录一、图的概述1.基本概念2.图的存储和遍历3.应用分类二、神经网络基础1.机器学习2.神经网络三、卷积神经网络(CNN)1.卷积与池化2.卷积神经网络四、表示学习1.意义2.自编码器五、图信号处理与图卷积神经网络1.矩阵计算前置知识2.图信号与图的拉普拉斯矩阵3.图傅里叶变换4.图滤波器(Graph Filter)5.图卷积神经网络(GCN) 一、图的概述 1.基本概念 1.顶点(Vertex)表示研究的对象,边(Edge)表示两个对象之间特定的研究关系 2.图为顶点和边的集合.
从零到一:Silvaco中跨导曲线的自动化脚本实现
本文详细介绍了如何使用Python脚本在Silvaco中实现跨导曲线(gm曲线)的自动化分析,包括数据加载、跨导计算和结果可视化。通过自动化处理Id-Vg曲线,显著提升半导体器件工程师的工作效率,特别适用于工艺优化和DOE分析。文章还提供了批量处理和关键参数提取的高级技巧,帮助工程师快速掌握Silvaco脚本开发。
FPGA常用接口协议--SPI
SPI是一种高速的、全双工、同步的通信总线, 常用于MCU和 EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。现如今,SPI总线已经成为被广泛应用的一种数据传输方式,由于其简单的接口、灵活性和易用性,SPI 已成为一种标准,SPI被半导体制造商广泛应用于IC芯片。
脑机接口(BCI)从原理到开发实战 01|意念控制真的来了?一文看懂脑机接口的技术革命
类型定义典型应用主动式用户主动产生特定思维模式来控制设备运动想象(想象左手/右手移动)反应式用户被动接受外部刺激,系统检测大脑反应P300拼写器、SSVEP(稳态视觉诱发电位)被动式系统监测用户自发脑状态,不要求主动控制疲劳监测、情绪识别、注意力评估本系列后续文章将重点围绕主动式(运动想象)和反应式(P300/SSVEP)展开实战。脑机接口,这个曾经只存在于科幻中的概念,正在政策、资本、技术的三重驱动下,加速从实验室走向产业落地。2026年,注定是脑机接口发展史上浓墨重彩的一年。
ESP32-S3的SPI接口
串行外设接口 (SPI) 是一种同步串行接口,可用于与外围设备进行通信。ESP32-S3 芯片集成了四个 SPI 控制器:• SPI0• SPI1• 通用 SPI2,即 GP-SPI2• 通用 SPI3,即 GP-SPI3SPI0 和 SPI1 控制器主要供内部使用以访问外部 flash 及 PSRAM。
从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南
本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。
PCIe扫盲(三)
需要特别注意的是,PCIe的Spec中明确规定只有Root有权限发起配置请求(Originate Configuration Requests),也就是说PCIe系统里面的其他设备是不允许去配置其他设备的配置空间的,即peer-to-peer的配置请求是不允许的。当配置请求进行BDF路由的时候,正是依靠这些信息来确定要找的设备的。前面的文章还介绍过,Root和Switch的每一个端口中都包含一个P2P桥,并且知道桥的配置空间头(Configuration Space Header)是Type1型的。
基于FPGA实现SPI接口协议(一)
UART,IIC以及SPI作为三个基本的低速接口协议,是我们经常使用的,本系列将简单介绍SPI的接口协议,然后用几个简单的demo案例(对flash的操作)对SPI接口进行熟悉。 本文介绍SPI通信协议的基本内容以及FLASH芯片的相关基本的知识。 SPI通信协议的基本介绍 SPI(Serial Peripheral Interface,串行外围设备接口)通讯协议,是 Motorola 公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于 .
金蝶个版本下载地址,记得保存收藏。
专业版 V10.0 http://downloads.cmcloud.cn/kis/kis_pro/10.0/kiszybV10sp1.rar V11.0 http://downloads.cmcloud.cn/kis/kis_pro/11.0/KISV11Setup.rar V12.0 http://dow...
SPI接口协议以及性能演进案例
为,是一种的通信协议,由摩托罗拉(Motorola)在 1980 年代中期提出,最初用于其微控制器(MCU)与外设之间的短距离通信。在 SPI 协议出现之前,微控制器与外设的通信多采用方式。并行通信需要多根数据线(如 8 位、16 位),硬件布线复杂,占用大量的 GPIO 引脚,不适合小型化、低成本的嵌入式系统。此外,当时的串行通信方案(如早期 UART)多为异步通信,速率较低且不支持全双工,无法满足高速外设(如 SPI Flash、ADC/DAC)的通信需求。
AUTOSAR模式管理-EcuM多核处理及其他概念
因此,EcuM不请求状态。因此,BswM必须确保,例如,在调用EcuM_GoHalt或EcuM_GoPoll之前,必须将关机目标从其默认值更改为ECUM_STATE_SLEEP。对于ECU的关闭,BswM(位于主EcuM的同一个分区中)最终调用主核上的GoOff,该GoOff将请求分发给所有的从核。在ECU Manager模块的早期版本中,睡眠目标被特殊处理,因为在ECU中实现的睡眠模式取决于ECU的功能。在使用了外部的SBC控制相关的MCU的下电的时候,在OFF阶段最后调用SBC进入到Sleep的指令。
Spark中Application、Job、Stage和Task区别详解
在Spark中,有一些关键的概念,如Application、Job、Stage和Task,它们描述了Spark作业的不同层次和组成部分。下面我将详细介绍每个概念,并通过示例说明它们之间的区别。
ESP32S3学习——SPI
ESP32S3学习——SPI
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
常见接口协议介绍
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
SPI时序简单理解(SPI0、SPI1、SPI2、SPI3)
基本概念: CPOL CPOL:Clock Polarity,时钟的极性。 时钟的极性是什么概念呢? 通信的整个过程分为空闲时刻和通信时刻; 如果SCLK在数据发送之前和之后的空闲状态是高电平,那么就是CPOL=1; 如果空闲状态SCLK是低电平,那么就是 CPOL=0。 CPHA CPHA:Clock Phase,时钟的相位。 CPHA=1,表示一个时钟周期的第一个沿上是输出。 CPHA=0,表示一个时钟周期的第一个沿上是采样。那输出就是第二个沿。 至于这个沿是上升还是下降要视CPOL的值而定,CPOL=
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
SPI接口协议的学习2
SPI接口学习笔记2,包括寄存器相关学习、配置等
8679



被折叠的 条评论
为什么被折叠?



