152 SPI主控制器驱动和核心函数

spi子系统 ti8168驱动备份 queue_work调度执行一个指定workqueue中的任务。输入参数: @ workqueue_struct:指定的workqueue指针 @work_struct:具体任务对象指针 spi目录下Makefile: ccflags-$(CONFIG_SPI_DEBUG) := -DDEBUG 如果配置了SPI_DEBUG则添加DDEBUG宏定义;其中cc 阅读详情

一、spi_controller 结构体框图

在这里插入图片描述
在这里插入图片描述

二、spi_imx_probe()函数

此函数是spi主机控制器的平台设备驱动的probe成员

static struct platform_driver spi_imx_driver = {
	.driver = {
		   .name = DRIVER_NAME,
		   .of_match_table = spi_imx_dt_ids,
		   .pm = IMX_SPI_PM,
	},
	.id_table = spi_imx_devtype,
	.probe = spi_imx_probe,
	.remove = spi_imx_remove,
};
module_platform_driver(spi_imx_driver);
  • 主要内容
    获取设备树节点信息,初始化spi时钟、dma…
    保存spi寄存器起始地址,填充spi控制器回调函数

drivers/spi/spi-imx.c

static int spi_imx_probe(struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
	const struct of_device_id *of_id =
			of_match_device(spi_imx_dt_ids, &pdev->dev);
	struct spi_imx_master *mxc_platform_info =
			dev_get_platdata(&pdev->dev);
	struct spi_master *master;
	struct spi_imx_data *spi_imx;
	struct resource *res;
	const struct spi_imx_devtype_data *devtype_data = of_id ? of_id->data :
		(struct spi_imx_devtype_data *)pdev->id_entry->driver_data;
	bool slave_mode;
	...
	// 判断当前spi主控制器节点工作在主模式还是从模式
	// 若是设置了这个属性,那么bool值返回1,为从模式
	// 让后更具主从模式进行不同的分配内存操作
	slave_mode = devtype_data->has_slavemode &&
			of_property_read_bool(np, "spi-slave");
	if (slave_mode)
		master = spi_alloc_slave(&pdev->dev,
					 sizeof(struct spi_imx_data));
	else
		master = spi_alloc_master(&pdev->dev,
					  sizeof(struct spi_imx_data));
	if (!master)
		return -ENOMEM;
	...
		// 读取此属性,获取片选信号的数量,保存在num_cs
		ret = of_property_read_u32(np, "fsl,spi-num-chipselects", &num_cs);
        if (ret < 0) {
            if (mxc_platform_info) {
                num_cs = mxc_platform_info->num_chipselect;
                master->num_chipselect = num_cs;
            }
        } else {
        	// 读取成功则赋值
            master->num_chipselect = num_cs;
        }
	
	// 获取 spi_controller->device->spi_imx_data
	spi_imx = spi_master_get_devdata(master);
	// bitbang结构体的存在是为了让我们能够用普通gpio来模拟spi的时序
	// 简单了解一下
	spi_imx->bitbang.master = master;
	spi_imx->dev = &pdev->dev;
	spi_imx->slave_mode = slave_mode;

	spi_imx->devtype_data = devtype_data;
	// 记录每个片选信号所使用的gpio引脚
	master->cs_gpios = devm_kzalloc(&master->dev,
			sizeof(int) * master->num_chipselect, GFP_KERNEL);
	
	spi_imx->bitbang.chipselect = spi_imx_chipselect;
	spi_imx->bitbang.setup_transfer = spi_imx_setupxfer;
	spi_imx->bitbang.txrx_bufs = spi_imx_transfer;
	spi_imx->bitbang.master->setup = spi_imx_setup;
	spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
	spi_imx->bitbang.master->prepare_message = spi_imx_prepare_message;
	spi_imx->bitbang.master->unprepare_message = spi_imx_unprepare_message;
	spi_imx->bitbang.master->slave_abort = spi_imx_slave_abort;
	spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \
	...
	init_completion(&spi_imx->xfer_done);
	// 获取spi控制器对应的寄存器组的基地址
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	spi_imx->base = devm_ioremap_resource(&pdev->dev, res);
	...
	// 详见下
	ret = spi_bitbang_start(&spi_imx->bitbang);
	...
}

spi_bitbang_start()函数

drivers/spi/spi-bitbang.c

int spi_bitbang_start(struct spi_bitbang *bitbang)
{
	struct spi_master *master = bitbang->master;
	int ret;

	if (!master || !bitbang->chipselect)
		return -EINVAL;

	mutex_init(&bitbang->lock);

	if (!master->mode_bits)
		master->mode_bits = SPI_CPOL | SPI_CPHA | bitbang->flags;

	if (master->transfer || master->transfer_one_message)
		return -EINVAL;
	// 填充的函数都和bitbang结构体相关,都是用来模拟spi时序
	master->prepare_transfer_hardware = spi_bitbang_prepare_hardware;
	master->unprepare_transfer_hardware = spi_bitbang_unprepare_hardware;
	master->transfer_one = spi_bitbang_transfer_one;
	master->set_cs = spi_bitbang_set_cs;

	if (!bitbang->txrx_bufs) {
		bitbang->use_dma = 0;
		bitbang->txrx_bufs = spi_bitbang_bufs;
		if (!master->setup) {
			if (!bitbang->setup_transfer)
				bitbang->setup_transfer =
					 spi_bitbang_setup_transfer;
			master->setup = spi_bitbang_setup;
			master->cleanup = spi_bitbang_cleanup;
		}
	}

	/* driver may get busy before register() returns, especially
	 * if someone registered boardinfo for devices
	 */
	 // 将spi主控制器注册到linux系统
	ret = spi_register_master(spi_master_get(master));
	if (ret)
		spi_master_put(master);

	return ret;
}
EXPORT_SYMBOL_GPL(spi_bitbang_start);

三、核心函数

1、spi_setup()函数

设置spi设备的片选信号、传输单位、最大传输速率…

drivers/spi/spi.c

int spi_setup(struct spi_device *spi)
{
	unsigned	bad_bits, ugly_bits;
	int		status;

	...
	// 对spi的传输单位进行设置,只能是8位或者16位
	status = __spi_validate_bits_per_word(spi->controller,
					      spi->bits_per_word);
	...
		// 用spi控制器的最大传输速率来限制spi设备的最大传输速率
		spi->max_speed_hz = spi->controller->max_speed_hz;
	...
	if (spi->controller->setup)//详见下
		status = spi->controller->setup(spi);
	...
	return status;
}

2、spi_imx_setup()函数

drivers/spi/spi-imx.c

static int spi_imx_setup(struct spi_device *spi)
{
	dev_dbg(&spi->dev, "%s: mode %d, %u bpw, %d hz\n", __func__,
		 spi->mode, spi->bits_per_word, spi->max_speed_hz);
	// 若当前spi设备不支持片选信号模式,直接返回
	if (spi->mode & SPI_NO_CS)
		return 0;
	// 若gpio有效,设置为输出模式
	if (gpio_is_valid(spi->cs_gpio))
		gpio_direction_output(spi->cs_gpio,
				      spi->mode & SPI_CS_HIGH ? 0 : 1);
	// 详见下
	spi_imx_chipselect(spi, BITBANG_CS_INACTIVE);

	return 0;
}
spi_imx_chipselect()函数

drivers/spi/spi-imx.c

static void spi_imx_chipselect(struct spi_device *spi, int is_active)
{
	int active = is_active != BITBANG_CS_INACTIVE;
	// 判断spi的片选信号是否低有效
	int dev_is_lowactive = !(spi->mode & SPI_CS_HIGH);
	
	if (spi->mode & SPI_NO_CS)
		return;

	if (!gpio_is_valid(spi->cs_gpio))
		return;
	// ^是异或运算符,相同为0相异为1,低电平有效则设置为低电平
	gpio_set_value(spi->cs_gpio, dev_is_lowactive ^ active);
}

3、spi_message_init()函数

include/linux/spi/spi.h
初始化一个spi信息

static inline void spi_message_init(struct spi_message *m)
{
	memset(m, 0, sizeof *m);
	// 初始化m中的两个链表节点成员
	spi_message_init_no_memset(m);
}

spi_message结构体

include/linux/spi/spi.h

struct spi_message {
	// 
	struct list_head	transfers;
	// 表示此spi消息属于哪一个spi设备
	struct spi_device	*spi;
	...
	// 当此spi消息传输完成回调使用的
	void			(*complete)(void *context);
	void			*context;
	unsigned		frame_length;
	unsigned		actual_length;
	int			status;
	...
	// 配合内核线程进行数据的异步传输
	struct list_head	queue;
	void			*state;

	/* list of spi_res reources when the spi message is processed */
	// 记录spi消息相关的资源
	struct list_head        resources;
};
spi_message_init_no_memset()函数

初始化两个链表节点

static inline void spi_message_init_no_memset(struct spi_message *m)
{
	INIT_LIST_HEAD(&m->transfers);
	INIT_LIST_HEAD(&m->resources);
}

4、spi_message_add_tail()函数

include/linux/spi/spi.h
把一个一个spi具体的消息存放到spi_message来保存

spi_message_add_tail(struct spi_transfer *t, struct spi_message *m)
{
	// 把参数1链表节点加入到参数2的末尾
	list_add_tail(&t->transfer_list, &m->transfers);
}
spi_transfer结构体

include/linux/spi/spi.h
此结构体是spi传输数据的最基本的单位,多个spi_transfer结构体可以组成一个spi_message结构体

struct spi_transfer {
	// 指向想要发送的spi消息的buf
	const void	*tx_buf;
	// 指向用来接收spi消息的buf
	void		*rx_buf;
	unsigned	len;
	...
	u32		speed_hz;
	struct list_head transfer_list;
};

5、spi_sync()函数

drivers/spi/spi.c

同步传输数据,阻塞当前线程
详见下一讲

int spi_sync(struct spi_device *spi, struct spi_message *message)

6、spi_async()函数

drivers/spi/spi.c

异步传输数据,不会阻塞当前线程
详见下一讲

int spi_async(struct spi_device *spi, struct spi_message *message)
SPI (四) -- spi_sync和spi_async的调用流程 内核版本:4.9.88前面我们分析了总线驱动模型,同时分析了如何编写设备驱动。只从上层使用角度去分析。因为内核的spi代码里已经提供好了相应的函数框架供我们使用,这里看一下最核心的两个函数spi_sync和spi_async。 阅读详情

相关推荐

Linux SPI子系统(2):SPI核心层

上次简单介绍了下Linux SPI子系统的系统结构,主要有3部分组成,分别是SPI核心、SPI总线驱动(控制器驱动)以及SPI设备驱动。SPI核心层代码位于drivers/spi/spi.c,头文件位于include/linux/spi/spi.h,SPI核心提供了SPI总线驱动和设备驱动的注册、注销方法,并提供一些需要控制器驱动实现的回调函数。本文主要介绍SPI核心层,包括重要的数据结构和API。

MisakiMe1的博客 2613

Linux设备驱动剖析之SPI(二)

957至962行,一个SPI控制器用一个master来描述。这里使用SPI核心的spi_alloc_master函数请求分配master。它在drivers/spi/spi.c文件中定义: 00000471 struct spi_master *spi_alloc_master(struct device *dev, unsigned size) 00000472 { 00000473 ...

weixin_33950035的博客 476

2.66英寸电子纸模块开发全攻略:从SPI驱动到低功耗显示优化

电子纸(e-Paper)是一种基于电泳显示技术的反射式显示屏,其核心原理是通过电场控制带电颜料颗粒的移动来实现图像显示。与需要持续供电的LCD或OLED不同,电子纸仅在刷新时耗电,显示静态内容时功耗极低,这一特性使其在低功耗物联网和便携式设备中具有独特的技术价值。在嵌入式系统开发中,SPI(串行外设接口)是连接微控制器与外围显示模块的主流通信协议,因其引脚少、速率高,非常适合资源受限的MCU场景。结合电源管理优化和高效的图像处理策略,电子纸模块可广泛应用于智能家居状态屏、电子价签、传感器数据显示终端等需要长

weixin_30591551的博客 303

Linux系统SPI驱动总结

平台:rk3288 系统:Android7.1 kernel4.4.143 linuxspi驱动分为三部分: SPI外设驱动:我们写。oled,spiflash等 linuxspi核心层:drivers/spi/spi.c 芯片的SPI控制器驱动:drivers/spi/spi-rockchip.c Linux SPI 框架理解 1、首先看dts:arch/arm/boot/dts/rk3288.dtsi spi0: spi@ff110000 { compatible =...

开发界里的一股清流 3009

ESP32 IDF环境下2.6寸双色墨水屏移植实战:从微雪例程到完整项目

本文详细介绍了在ESP32 IDF开发环境中,将微雪2.6寸双色墨水屏驱动从Arduino例程移植到完整项目的实战过程。内容涵盖驱动代码提取、硬件抽象层重写、组件化工程配置以及主程序集成调试,重点解决了SPI通信、引脚配置和功耗管理等关键问题,为开发低功耗户外显示设备提供了完整解决方案。

496

【信息科学与工程学】【安全领域】第一百四十一篇 SDN+安全服务链场景0001 算法01

编号类型领域子领域问题(要解决什么)问题的数学分析及数值分析及优化分析参数列表及参数的边界范围及极限及常量/数值/数字关联知识和法律法规A1(五元组→匹配树/TCAM映射)转发面 / 接入-边缘SC分流点(MCR/CR/BRAS)引流:按IP五元组+VLAN/QinQ+SRv6隧道信息区分租户/业务,决定送入哪个SRv6 TE Policy/BSID给定海量微流,如何把"租户T+业务B+(sa/da/SP/DP/proto)"快速映射为一条。

weixin_49199313的博客 598

DRV8818PWPR+STM32L152RE双极步进电机工业控制方案

双极步进电机是工业自动化中开环定位的核心执行器件,其控制本质在于高精度相电流合成与实时动态响应。DRV8818PWPR作为TI工业级驱动IC,凭借256微步、内置检流、宽压热稳等特性,解决了传统驱动芯片在EMI干扰、温漂失步、电流不均等场景下的可靠性短板;STM32L152RE则以硬件死区、四路同步PWM、超低功耗STOP模式,精准匹配步进控制对时序确定性与能效比的双重需求。该组合广泛应用于AGV转向、协作机器人关节、3D打印Z轴及视觉引导工装平台等中精度、高鲁棒性场景,为成本敏感型工业设备提供‘稳准狠’的

weixin_34220179的博客 450

【信息科学与工程学】【运营科学】第二篇 C4信息与通信网络运营 (C4) ——数据中心网络运营04

典型值:λ1​∈[−0.02,−0.01], λ2​∈[−0.01,0], η1​,η3​∈[0.1,0.3], η2​,η4​∈[0.05,0.15]参数:δ1​∈[−0.8,−0.3], δ2​∈[−0.5,−0.2], δ3​∈[−0.4,−0.1], δ4​∈[−0.6,−0.2]参数:φ1​∈[0.1,0.3], φ2​∈[−0.2,−0.05], φ3​∈[−0.1,0.1], φ4​∈[−0.3,−0.1]参数:α∈[0.3,0.6], β∈[0.2,0.4], γ∈[0.01,0.03]

weixin_49199313的博客 1207

软件SPI vs 硬件SPI 性能实测:STM32F4平台4种模式延迟对比分析

本文基于STM32F4平台对硬件SPI与软件模拟SPI进行性能实测,对比分析4种工作模式下的延迟差异。测试结果显示硬件SPI在传输速率、波形质量和CPU占用率方面显著优于软件SPI,最高可达21倍性能提升,为嵌入式开发中的SPI实现选型提供数据支持。

weixin_34062469的博客 365

基于STM32 HAL库的全速硬件SPI驱动AD7606实战开发

htmltable {th, td {th {pre {简介:本文介绍如何使用STM32的HAL库实现全速硬件SPI通信,驱动高精度16位模数转换器AD7606,广泛应用于工业控制、数据采集和物联网设备中。通过配置SPI接口参数、利用DMA提升传输效率,并完成AD7606的初始化与数据读写操作,构建高效稳定的高速数据采集系统。项目涵盖从外设配置到通信优化的完整流程,适用于嵌入式开发者深入掌握STM32 SPI驱动开发核心技术。

weixin_42168902的博客 1420

基于DDS技术的多波形信号发生器:从原理到FPGA/STM32实现

直接数字频率合成(DDS)是一种通过数字方式生成高精度、高稳定度模拟信号的技术。其核心原理基于相位累加和波形查找表,通过改变频率调谐字(FTW)实现频率的快速、精细调节。这项技术的核心价值在于其极高的频率分辨率、快速的频率切换能力以及相位连续可调的特性,使其在通信系统、测试测量和仪器仪表等领域具有广泛应用。例如,在需要高精度信号源的场景中,DDS能够替代传统的模拟振荡器,提供更稳定、更灵活的信号输出。本文聚焦于DDS信号发生器的工程实现,详细解析了基于FPGA和STM32的两种核心架构,涵盖了从相位累加器、

weixin_33908217的博客 326

UART/SPI/I2C/CAN 协议选型指南:5个嵌入式项目场景实测对比

本文深入对比了UART、SPI、I2C和CAN四种通讯协议在五个典型嵌入式项目场景中的实际表现,包括智慧农业监测、车载控制单元、工业HMI交互、电池管理系统和智能家居中控。通过实测数据和案例分析,揭示了各协议在成本、性能、抗干扰能力等方面的优劣,为工程师提供了实用的选型建议和优化技巧。

weixin_33834910的博客 476

双目视觉实战:用Bouguet算法实现极线校正的完整代码解析

本文详细解析了Bouguet算法在双目视觉极线校正中的完整实现流程与性能调优技巧。通过旋转平分策略和基线对齐,Bouguet方法显著降低图像畸变并提升匹配精度,相比传统Hartley校正法平均重投影误差降低53%。文章涵盖从相机标定到OpenCV实战的全过程,并分享工业级调参策略,帮助开发者实现高精度立体视觉系统。

f9g0h的博客 267

工业传感器控制系统:AD74115H与ADP1034实战解析

传感器控制系统是工业自动化的核心基础架构,其工作原理涉及信号采集、电源管理和逻辑控制三大技术模块。通过隔离式电源管理和软件可配置I/O器件,系统能够有效抑制工业现场的电磁干扰,实现多种传感器类型的自适应接入。AD74115H作为关键信号调理芯片,支持电压/电流/数字信号的灵活切换,配合ADP1034的隔离电源方案,可构建稳定可靠的工业级传感网络。这种组合特别适用于智能制造、环境监测等场景,实测显示其纹波控制在50mV以内,ESD防护达到±8kV。

weixin_29189987的博客 323

利用VBA宏实现LightTools仿真数据自动化导出至Excel

本文详细介绍了如何利用VBA宏实现LightTools仿真数据自动化导出至Excel的完整流程。通过调用LTAPI接口,工程师可以自动执行仿真、抓取照度与光强等数值数据、捕获并粘贴仿真图像,从而将重复性工作自动化,显著提升光学设计工作的效率和准确性。

weixin_28314575的博客 501

mos管结电容等效模型_MOS管的防冲击防反接电路

MOS管的反接和抑制冲击一:原理分析MOS管由于生产工艺等因素,会产生相应的寄生电容,体二极管等。Mos管的寄生电容如图1所示,可以看到其具有三个寄生电容:G和S的电容Cgs;G和D的电容:Cgd,也称为反向传输电容、米勒电容、Crss;D和S的电容Cds。D和S之间的体二极管D1.图 1:MOS管等效模型寄生电容的数值可以从元器件的datasheet中得到,如图2,图3:Ciss(输入电容)=C...

weixin_29179583的博客 1858

STM32F767ZG与AD7490的高精度ADC系统设计与优化

模数转换器(ADC)作为连接模拟世界与数字系统的关键接口,其精度和稳定性直接影响测量系统的性能。SAR型ADC通过逐次逼近原理实现高精度转换,AD7490作为16位1MSPS的典型代表,配合STM32F767ZG的硬件SPI接口和DMA传输,可构建高效的工业级数据采集系统。在工业自动化、仪器仪表等场景中,合理的基准电压选择、PCB布局规范和校准算法能显著提升系统信噪比。通过SPI协议配置、定时器触发采样和移动平均滤波等工程实践,该系统可实现153μV级分辨率,满足温度监测、压力测量等高精度应用需求。

weixin_33461476的博客 316

计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)

这次实验利用logisim进行设计,进行了以下这四个实验,其中分为汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码,实验报告分为四个部分,在这四个部分中依次对四个实验的方案设计,设计思路进行了介绍

zhang2gongzi的博客 6万+

【小冯Sir】基于STM32的出租车计价器系统设计与实现

本文详细介绍了基于STM32的出租车计价器系统设计与实现,包括硬件选型、软件架构和核心算法。项目使用STM32F103VET6控制器,结合霍尔传感器和LCD显示屏,实现了精准的里程计算、费用核算和数据存储功能,为嵌入式系统学习者提供了实用参考。

n7o8p的博客 135

小米汽车车载多摄像头视频链路深度解析 | MAX96792/MAX96724/MAX96781 实战分享

通过合理的输入输出规划 + 虚拟通道管理 + 加串行策略,可以在成本和性能之间取得最佳平衡,这就是多摄像头系统设计的核心精髓。

weixin_43199439的博客 1547

Simulink开发项1000例实战专栏--实例52:基于Simulink开发一个超导磁储能控制系统,实现对SMES系统的精确控制和优化

需求分析超导磁储能系统(Superconducting Magnetic Energy Storage, SMES)是一种利用超导线圈储存和释放电能的高效储能技术。SMES系统具有响应速度快、能量密度高、循环寿命长等优点,广泛应用于电力系统的调峰填谷、频率调节、电压稳定以及紧急备用电源等领域。本项目将基于Simulink平台,开发一个完整的超导磁储能控制系统,实现对SMES系统的精确控制和优化。我们将详细讲解如何设计和实现该系统,并结合实际应用案例进行说明。

xiaoheshang_123的博客 236

嵌入式音频开发实战:TI Codec寄存器配置精解与音质优化

在嵌入式系统开发中,寄存器配置是连接软件与硬件的关键桥梁,它直接决定了底层外设的工作状态与性能表现。其原理在于通过特定的总线协议,向硬件映射的存储单元写入控制位,从而精确操控芯片内部的模拟前端、数据转换器及信号处理单元。掌握寄存器配置技术,对于实现系统稳定、优化功耗与提升信号质量具有核心价值,尤其在音频、电机控制、传感器接口等对实时性与精度要求高的场景中至关重要。本文以**TI音频编解码器**为例,深入剖析其**寄存器配置**的完整框架与实战要点,涵盖从电源管理、模拟通路路由到DSP滤波器加载的全流程,旨在

weixin_33981932的博客 482

EUV光源技术路线深度解析

EUV光刻技术的关键瓶颈在于13.5纳米光源的稳定高效获取。主流技术路线从DPP放电等离子体发展为LPP激光等离子体方案,后者通过激光轰击锡液滴实现更高功率输出。新出现的LDP技术综合激光预热与放电优势,虽功率扩展性有限,但为光源技术提供了有益补充。目前LPP仍是唯一通过量产验证的方案,而LDP可能作为过渡技术应用于特定场景。EUV光源的发展实质是能量转化效率与系统可靠性的持续优化过程,各种技术路线的探索共同推动着这一核心工艺的进步。

硬核科技 556

基于MA12070与STM32F407的高保真音频系统设计

D类音频放大器通过脉冲宽度调制(PWM)技术实现高效电能转换,其核心优势在于高达90%以上的能量转换效率。MA12070作为英飞凌新一代多级开关D类放大器,采用动态电平切换技术,在4-26V宽电压范围内保持0.004%的超低失真度,完美解决了传统方案在低功率输出时效率骤降的痛点。结合STM32F407的硬件浮点运算和192MHz主频处理能力,可构建支持80W×2声道输出的高保真系统。这类方案在智能音箱、车载音响等需要兼顾音质与功率的场景中具有显著优势,特别是MA12070的91%峰值效率和集成保护机制,为工

weixin_28292761的博客 263

UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计

本文提出一种结合注意力机制的改进UNet网络,通过引入残差注意力模块(ResidualAttentionBlock)增强医学图像分割性能。该网络在传统UNet的U型结构基础上,创新性地将轻量级注意力机制与残差连接相结合,在编码器-解码器各层级实现特征重标定。改进后的网络具有三方面优势:通过注意力机制自适应聚焦关键特征区域,利用残差连接缓解梯度消失问题,采用模块化设计灵活配置注意力位置。

2501_91516851的博客 780

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PCM5252音频DAC芯片:集成DirectPath™与miniDSP的高保真音频系统设计指南

数模转换器(DAC)是数字音频系统中的核心器件,负责将数字信号精确还原为模拟波形。其性能直接决定了音频系统的信噪比、动态范围和总谐波失真等关键指标。在工程实践中,高性能DAC常面临外围电路复杂、电源噪声抑制和时钟抖动管理等挑战。德州仪器(TI)推出的PCM5252芯片,通过集成可编程miniDSP内核和独特的DirectPath™输出技术,为紧凑型高端音频设备提供了高集成度解决方案。DirectPath™技术摒弃了传统输出隔直电容,避免了相位失真和低频衰减,而内置的miniDSP则支持参量均衡、动态范围控制

weixin_30500473的博客 568

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 151 SPI驱动框架简介
下一篇: 153 SPI数据传输剖析:同步、异步
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值