SPI 访问从设备通讯流(字节流设置与一般化方法)

【S32K】S32K144入门笔记(3) SPI(lpspi组件) 0. 引言 与第二篇can对应,第三篇本来想写lin的,毕竟都是车身上常用的总线。但是lin比较麻烦,所以先拖后一下,先把SPI记录一下。 SPI在我们的系统架构中是S32K和ADAS之间做数据传输用的,毕竟速率够高,数据量能传的比较大。 1. 准备 1.1 SPI基础知识 1.2 开发环境 1.2.1 软件开发环境 1.2.2 硬件环境 SPI 2. Demo ... 阅读详情

概述

本文通过分析SPI主从通讯的特点,总结出一套访问从设备的一般化方法。

了解更多SPI可访问S32K1专栏:
NXP S32K1 SPI模块
NXP S32K1 SPI模块Driver使用
SPI时钟极性、相位设置
SPI实例之C++实现EEPROM访问

常见的SPI从设备有EEPROM、FLASH、收发器、转换器、通讯模块等,在片选信号有效后,在主机时钟线的驱使下,主机输出数据或者主机接收至从机。

Master Write

对于主机输出数据,亦从机接收数据(配置从机、写数据到从机的场景),主机需指明写数据到从机的哪里(地址、寄存器),写入的数据,甚至在“地址”区域需要搭配命令来指明这是一个写操作,或者像IIC一样,通过LSB的两种状态来指定操作。

Master Read

对于主机接收数据,亦从机输出数据,主机在本次通讯六中指明在从机的哪里(地址)去读取数据,只有主机告诉从机了这个地址,从机协议解析(处理器)模块才能将该位置的数据通过SPI数据流的方式输出。

一般化

由此从主机角度来看,SPI通讯流(字节流)有两部分组成:hdr+buff。
hdr: 头部,可能是Cmd和/或Reg+Addr,其割断的长度在不同的从机中也各不相同,可能是1Byte,也可能是2Bytes。
buff:数据缓冲区,rxBuf和txBuf,即使在主机输出数据的情况下,从机同样会移位输出输出到从机的接受线,反之亦然。

示例代码

bool EEPROM::ReadBytes(uint16_t addr, uint8_t *data, uint16_t len)
{
	bool rtv = false;
	if(data && (len>0))
	{
        uint8_t *pTx = new uint8_t[len+EE_LEN_HDR];
		uint8_t *pRx = new uint8_t[len+EE_LEN_HDR];

		if(pTx && pRx)
		{
			*(pTx+0) = EE_CMD_READ;
			*(pTx+1) = EE_GET_ADD_H(addr);
			*(pTx+2) = EE_GET_ADD_L(addr);

			if(STATUS_SUCCESS == LPSPI_DRV_MasterTransferBlocking(EE_SPI, pTx, pRx, len+EE_LEN_HDR, EE_TIME_OUT))
			{
				memcpy((uint8_t*)data,(uint8_t*)(pRx+EE_LEN_HDR),len);
				rtv = true;
			}
			else
			{
				rtv = false;
			}
		}
		else
		{
			rtv = false;
		}
		
		delete pTx;pTx = NULL;
		delete pRx;pRx = NULL;
	}

	return rtv;
}

结语

了解更多SPI可访问S32K1专栏:
NXP S32K1 SPI模块
NXP S32K1 SPI模块Driver使用
SPI时钟极性、相位设置
SPI实例之C++实现EEPROM访问

S32K144:12.LPI2C驱动AT24C16 1.打开官方例程 2.修改引脚配置 3.时钟可按照实际情况修改,也可不用更改,本例时钟不做更改 4.配置LPI2C模块 设置从机地址:从机地址如下图所示,低三位表示为AT24C16的块地址,AT24C16将2KB的内存空间分为8个块,每个块256个字节的数据,此处先读写块0的内存,故将地址设置为0x50。 I2C频率设置:此处使用标准模式速率为100KHz。按照AT24C16手册,也可配置为快速模式400KHz或1MHz,可按照需求配置。 5.按页写入数据到AT24C16 按照时序,先发送器件地 阅读详情

相关推荐

【使用C++开发MCU】SPI实例之C++实现EEPROM访问

本文是SPI 访问从设备通讯流(字节流设置与一般化方法)文章中方法论的具体实现,在NXP S32K1上使用C++实现对EEPROM的访问,后续可能会写EEPROM的上层参数管理方法,总结一般嵌入式系统中参数存在的形态、如何高效的组织、访问参数。

Kinetis_Linux的博客 1447

S32K在FreeRTOS下的外设中断设置

在调用外设blocking数据传输接口时(比如LPSPI_DRV_MasterTransferBlocking),需要在外设中断产生时调用操作系统的信号量接口来传递传输状态,这里面其实存在一个中断优先级的问题。

2hi9uo的博客 2988

SPI通信分析实战:从协议解析到硬件调试与性能优化

串行外设接口(SPI)作为一种高速同步串行总线,其核心在于通过时钟极性(CPOL)和相位(CPHA)的四种模式组合,定义了主从设备间的数据同步与采样机制。理解其通信原理是进行嵌入式系统外设驱动和优化的基础,对于保障数据传输的可靠性、排查通信故障具有重要技术价值。该技术广泛应用于微控制器与传感器、存储器、显示屏及FPGA等外设的高速数据交换场景。本文聚焦于SPI通信分析,深入探讨如何利用逻辑分析仪和示波器等工具,结合对**信号完整性**和**DMA传输**等关键环节的剖析,解决实际工程中的通信异常与性能瓶颈问

weixin_34379433的博客 373

RT1176开发板源码中LPSPI驱动问题

1、硬件配置:RT1176开发板 2、软件源码:MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\lpspi\polling_b2b_transfer\master\cm7 3、应用环境:使用SPI驱动FRAM芯片 4、异常现象:FRAM理论支持最大频率为40MHz,可是实际配置到1MHz以上时,就是出现程序停留在函数LPSPI_MasterTransferBlocking中无法退出。 5、原因分析:此函数在处理SPI发送时,存在逻辑上的问题,即用户待发

ttxs5000的博客 3927

lpspi_transfer_S32K146_spi_LPSPI

本套代码是在S32K146芯片实现LPSPI 通信的驱动代码,可以方便的移植到S32K14X的系统中。

STM32HAL库 基于外部Flash+FatFs模拟U盘方式进行固件拷贝升级(详解)

STM32HAL库 基于外部Flash+FatFs模拟U盘方式进行固件拷贝升级

qq_36075612的博客 1万+

嵌入式通讯接口选型指南:从I2C、SPI到CAN、以太网的实战解析

在嵌入式系统设计中,通讯接口承担着设备间信息交互的关键角色,如同系统的神经网络。其工作原理基于不同的物理层和协议层标准,通过串行或并行方式传输数据,核心价值在于实现可靠、高效的数据交换,是系统功能扩展和外部连接的基础。从简单的板级通信到复杂的工业网络,不同的接口技术如I2C、SPI、UART、CAN、RS-485、USB和以太网,各自对应着特定的应用场景。例如,I2C凭借其简单的两线制和多设备支持,常用于连接传感器和存储器;而CAN总线则以其高可靠性和非破坏性仲裁机制,成为汽车电子和工业控制的首选。本文聚焦

weixin_30634661的博客 375

先楫HPM6E00EVK EtherCAT从站配置与CIA402 8轴运动控制实战解析

本文详细解析了先楫HPM6E00EVK开发板的EtherCAT从站配置与CIA402 8轴运动控制实战。从环境准备、XML文件配置、代码移植到TwinCAT工程设置,提供了完整的移植指南,帮助开发者实现高效的多轴同步运动控制。

o5p6q的博客 416

SylixOS设备驱动

驱动简介 设备驱动是最底层的、直接控制和监视各类硬件的部分,它们的职责是隐藏硬件的具体细节,并向其他部分提供一个抽象的、通用的接口,设备驱动是内核空间的一部分,其运行在内核态下。 按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA 通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。 在BSP工程将驱动静态的和内核编译在一起(生成.elf / .bin等文件),为了减小编译出的镜像大小,可以将驱动

动感超人_Crush 675

神经网络基础概念总结(小白入门自用)

神经网络人工神经网络多层感知机激活函数反向传播算法损失函数权值初始化正则化方法 人工神经网络 人工神经元:人工神经元是人工神经网络的基本单元。模拟生物神经元,人工神经元有1个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。 人工神经网络:大量的人工神经元以某种链接方式得来的

qq_42011158的博客 648

尝试使用CubeMX做stm32开发之九:SYS配置

参考《STM32中文参考手册_V10》,研究CubeMX中有关SYS的配置

Forster-C的博客 9420

linux设备驱动程序简介

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的。)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。驱动程序的任务是把这些标准化调用映...

ymj321的专栏 304

无人机多旋翼倾转动力测试系统-适用于(eVTOL开发、缩比模型测试、科研教育)

LY-QZ-F4多旋翼倾转动力测试系统是全球首款专为倾转四旋翼设计的多自由度动力测试平台,融合高精度传感、动态倾转模拟与智能工况分析,为下一代eVTOL技术提供全维度验证工具。采用航空级应变传感器(精度±0.1% FS),同步捕获推力、扭矩、俯仰/滚转力矩,动态误差<1%。同时测试电驱动系统(单轴最大150kW)与混合动力单元(增程式),支持高压(800V)平台。通过MET数据采集软件,控制采集一体化,定制化,实时观察上百个传感器数据,实时更改测试需求。可搭配六维姿态平台,温湿度舱、振动台等环境模拟设备。

weixin_49209795的博客 874

linux设备驱动第一篇:设备驱动程序简介

设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的。)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。驱动程序的任务是把这些标准化调用映射到实际硬件的设备特有操作上。 在编写驱动程序时,程序员应该特别注意下面这

haomcu的专栏 6739

在 CentOS Stream 10 上搭建 Kubernetes 集群并支持开发调试与日志查看

搭建 Kubernetes 集群的每个步骤详细的文档。

灵犀物润 1644

Ubuntu开机进入initramfs,解决办法来了!

摘要:Ubuntu系统启动时卡在initramfs界面,表明系统无法正常挂载根文件系统。常见原因包括引导配置错误、文件系统损坏、驱动程序问题和硬件故障。解决方法包括:1)使用fsck修复文件系统;2)通过dmesg排查驱动问题;3)检查硬盘等硬件状态;4)重新安装GRUB引导程序。建议做好系统备份等预防措施,遇到问题时按步骤排查。该问题通常可通过文件系统修复或引导配置重建解决。(148字)

米可的博客! 3421

Linux设备驱动第一篇:设备驱动程序简介

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢?设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的。)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。驱动程序的任务是把这些标准化调用映射到...

yexiang优快云的专栏 457

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

手把手教你 RT-DETR 添加注意力机制 | 一次性添加 20+ 种!

Coding... 2852

linux设备驱动第一篇:基础知识点

首先,我们知道驱动是内核的一部分,那么驱动在内核中到底扮演了什么角色呢? 设备驱动程序在内核中的角色:他们是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节。(说白了,驱动程序除了对外提供特定的接口外,任何实现细节对应用程序都是不可见的。)用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序。驱动程序的任务是把这些标准化调

东辉在线的专栏 1585

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java基础篇--IO

Java IO发展之路 Java传统IO 认识各种输入输出流 认识File类 ***:什么是绝对路径,什么是相对路径? ***:new File(path)生成的文件去哪了? 认识RandomAccessFile类 序列化流将对象序列化 利用转换流实现修改文件的编码格式 Java BIO ***:(实战)使用BIO实现cs(client-server)架构通讯 Java NIO ***:(实战)使用NIO实现cs架构通讯

i18n486的博客 431

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux驱动基础、内核模块(一)

【1】驱动大纲 1.linux内核模块 2.字符设备驱动 3.并发和静态的解决方法 4.IO模型 5.linux内核中断(中断底半部,linux内核定时器) 内核中不能用delay();这几秒进程就不能执行了,这就不能体现linux系统的高效,相互矛盾了 所以不可能在内核中断中使用延时了 6.pltform总线驱动—虚拟总线 7.i2c总线驱动 面试常见。尤为重要 8.spi总线驱动 9.块设备驱动 10.网卡设备驱动 【2】什么是驱动?它和ARM裸机驱动的有什么区别? 操作硬件工作这份代码就叫

生活?活着?的博客 425

【BMP180】大气感器压强传

1.VCC: 电源正极输入口2.GND: 电源负极输入口3.SCL: I2C时钟端口4.SDA: I2C数据端口BMP180 是一款数字式温度、压力传感器,是博世公司旗下Bosch Sensortec推出的新一代气压传感器系列产品之一。它采用了高精度、低功耗的设计,可实现高精度、长期稳定的温度和压力测量,并通过标准的I2C/SPI接口进行通讯和数据交换。

特纳斯电子官方博客站 2155
上一篇: SPI时钟极性、相位设置
下一篇: 【2022年的STM32】 01-开发环境上手初体验
mcucpp
博客等级 码龄12年 56粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值