☰
AT7456E无人机图传OSD字符叠加:SPI驱动与避坑指南
2026/9/28 1:10:56 网站建设 项目流程

1. 无人机图传里的字符叠加到底在解决什么问题

飞过无人机的人都清楚,图传画面里如果只有光秃秃的视频,飞手其实是很被动的。你不知道当前飞行高度、电池电压、飞行速度、GPS星数,甚至不知道图传发射功率还剩多少余量。早期很多自制穿越机或者行业无人机,图传画面就是纯视频流,飞手只能靠地面站或者遥控器上的小屏幕看数据,眼睛要在两个屏幕之间来回切换,体验非常割裂。

字符叠加芯片要干的事情,就是把飞控里的这些遥测数据,实时“烧”进视频信号里,让飞手在眼镜或者监视器上直接看到叠加好的画面。AT7456E 就是这类场景里非常经典的一颗芯片,它本质上是一颗 NTSC/PAL 视频字符叠加发生器,内部带 OSD 字库,支持 SPI 配置,能同时叠加多行字符和图形。相比用 FPGA 或者纯软件方案做 OSD,AT7456E 的优势是成本低、外围简单、字库现成、延迟极低,特别适合对重量和功耗敏感的无人机图传系统。

我最早接触这颗芯片是在一个自研图传模块的项目里,当时的需求是:在 PAL 制式摄像头视频流上叠加 16 行 × 30 列的字符信息,包括电压、高度、速度、飞行模式、报警提示等,刷新率要求不低于 10Hz,而且不能对原始视频造成明显干扰。选型阶段对比过 MAX7456、AT7456E 和几款国产替代,最终选 AT7456E 的核心原因是它在 SPI 时序上更宽容,寄存器映射和 MAX7456 基本兼容,但价格和供货更稳定,对于批量产品来说这一点比参数表上的几个 dB 信噪比重要得多。

这篇文章适合谁看?如果你正在做无人机图传、FPV 飞控 OSD、模拟视频叠加、或者任何需要在复合视频上打字符的项目,并且打算用 SPI 去驱动 AT7456E,那这篇内容基本能覆盖你从硬件连接到寄存器配置再到避坑的完整链路。即使你之前没碰过视频叠加,只要懂基本的 SPI 通信和 STM32 开发,跟着走也能跑通。

2. 方案选型与整体设计思路拆解

2.1 为什么是 AT7456E 而不是软件 OSD

做视频字符叠加,摆在面前的路其实有三条。第一条是纯软件方案,用 MCU 或者 SoC 在视频缓冲区里直接画字符,再合成输出。第二条是 FPGA 方案,自己写时序做叠加。第三条就是专用 OSD 芯片,AT7456E、MAX7456 都属于这一类。

纯软件方案的问题在于,模拟视频的时序非常严格,PAL 每行 64 微秒,消隐区、同步头这些时间窗口卡得很死,MCU 要在像素级别介入,CPU 占用率会非常高,而且一旦视频制式切换或者摄像头抖动,软件方案很容易出现字符撕裂。FPGA 方案性能最好,但开发周期长,对团队的数字逻辑能力要求高,小批量项目根本不划算。

AT7456E 这类芯片的思路是把视频同步、字库存储、像素混合全部硬件化。你只需要通过 SPI 把要显示的字符写进它的显示内存,它自己会在下一场视频里把字符混进去。对主控来说,SPI 写几个字节的事情,CPU 负担几乎为零。这就是为什么在无人机图传这种对实时性和功耗都敏感的场景里,专用 OSD 芯片一直是主流选择。

2.2 SPI 配置方式的选择:硬件片选还是软件片选

AT7456E 支持 SPI 接口,但它的 SPI 和标准 SPI Flash 那种“读 ID、读数据”的流程不太一样。它更像是一个寄存器设备:你先发一个地址字节,再发数据字节,地址会自动递增。片选信号 CS 在整个传输过程中必须保持低电平,传输结束后拉高,芯片才会真正把数据锁存进去。

这里就涉及一个很实际的选择:用硬件片选还是软件片选。硬件片选是 SPI 外设自动控制 CS 引脚,传输开始拉低,结束拉高,时序由硬件保证。软件片选是自己用 GPIO 控制 CS,在传输前后手动拉低拉高。我实测下来,AT7456E 对 CS 的建立时间和保持时间有一定要求,如果 SPI 时钟跑得比较快(比如 10MHz 以上),软件片选如果 GPIO 操作不够及时,容易出现最后一个字节没锁存或者第一个字节被截断的问题。所以我的建议是:能用硬件片选就用硬件片选,尤其是用 STM32 的 SPI 外设时,直接配置 NSS 为硬件模式,省心很多。

但硬件片选也有个坑:STM32 的 SPI 硬件 NSS 在某些模式下会出现“多主机冲突检测”导致 NSS 被拉高,反而干扰传输。如果你遇到 SPI 传输莫名其妙中断,可以先检查一下 NSS 的管理模式。我一般会在 CubeMX 里把 NSS 设成“Hardware NSS Output”,然后确认 SPI 模式是 Master 全双工,这样基本不会出问题。

2.3 视频制式与同步信号的匹配逻辑

AT7456E 支持 NTSC 和 PAL 两种制式,选择方式是通过寄存器配置,但前提是你的输入视频信号本身要和配置一致。如果你给芯片输入 PAL 视频,但寄存器配成 NTSC,字符会上下滚动或者位置完全错乱。这一点在调试初期特别容易踩坑,因为摄像头模组有时候默认输出 NTSC,而你以为它是 PAL。

判断制式最直接的方法是用示波器看视频信号的场同步频率:PAL 是 50Hz,NTSC 是 60Hz。如果没有示波器,也可以先让 AT7456E 自动检测,它有一个 VM0 寄存器里的视频制式自动检测位,读回来能告诉你当前检测到的是哪种制式。但自动检测不是万能的,如果视频信号质量差或者同步头幅度不够,检测结果可能不准。所以我的做法是:硬件上留一个制式选择跳线或者 GPIO,软件里先读自动检测结果,再根据实际画面微调。

2.4 整体数据流设计

整个系统的数据流其实很清晰:飞控通过串口把遥测数据发给主控 MCU,主控 MCU 解析出电压、高度、速度等字段,然后通过 SPI 把对应的字符编码写入 AT7456E 的显示内存。AT7456E 在每一场视频开始时,从显示内存里读取字符,和输入的视频信号混合,输出叠加后的复合视频。

这里有一个关键设计点:显示内存的更新时机。AT7456E 的显示内存是双缓冲的,你可以在任意时刻写,但芯片只在场消隐期间切换缓冲区。这意味着你不需要严格同步视频场,只要写入速度跟得上,画面就不会撕裂。但如果你写入太频繁,比如每毫秒都写一次,SPI 带宽会被占满,而且芯片内部缓冲区切换也可能出问题。我的经验是:遥测数据刷新率控制在 10Hz 到 20Hz 之间就足够了,人眼对 OSD 数据的刷新感知没有那么敏感,刷太快反而浪费 CPU 和 SPI 带宽。

3. 硬件连接与 SPI 底层配置细节

3.1 引脚连接与电源处理

AT7456E 的封装一般是 28 引脚 QFN 或者 SOP,关键引脚包括:视频输入、视频输出、SPI 的 SCLK、SDI、SDO、CS、复位引脚、以及电源和地。视频输入输出都是模拟复合信号,走线要尽量短,最好用 75 欧姆阻抗匹配,否则画面会出现重影或者亮度不均。

电源方面,AT7456E 核心电压一般是 3.3V,但它的模拟部分对电源噪声比较敏感。我一般会在电源引脚旁边放一个 10uF 钽电容加一个 0.1uF 陶瓷电容,模拟部分和数字部分的地尽量单点连接。如果你发现画面上有横向条纹或者字符边缘有噪点,十有八九是电源没处理好。

SPI 引脚连接就按标准来:SCLK 接 MCU 的 SPI 时钟,SDI 接 MOSI,SDO 接 MISO,CS 接硬件片选或者 GPIO。注意 AT7456E 的 SDO 在写寄存器时其实用不到,但读寄存器时必须接,所以不要省这根线。复位引脚我建议接一个 GPIO,方便软件复位,比上电复位可靠得多。

3.2 STM32 SPI 外设配置要点

用 STM32F103 驱动 AT7456E,CubeMX 里 SPI 配置有几个关键参数。首先是时钟极性 CPOL 和时钟相位 CPHA:AT7456E 支持 SPI 模式 0 和模式 3,我一般用模式 0,也就是 CPOL=0、CPHA=0,空闲时时钟低电平,第一个边沿采样。这个模式和大多数 SPI 设备兼容,调试起来也方便。

时钟频率方面,AT7456E 的 SPI 最高支持到 20MHz 左右,但实际用的时候不建议跑满。我一般设成 9MHz 或者 4.5MHz,原因是 SPI 时钟太快时,如果 PCB 走线不好,容易出现数据位错误,而且 AT7456E 内部寄存器写入需要一定时间,太快反而可能丢数据。9MHz 下写一屏字符大概几百微秒,完全够用。

数据宽度设成 8 位,MSB First,这个没什么争议。NSS 设成 Hardware NSS Output,如果 CubeMX 里找不到这个选项,可以先设成 Disable,然后在代码里手动控制 GPIO。DMA 方面,如果你只是写几十个字节的 OSD 数据,其实用不用 DMA 差别不大,但如果你要频繁更新整屏字符,用 DMA 可以解放 CPU。我试过用 DMA 循环模式写显示内存,效果很稳,但要注意 DMA 传输完成中断里不要做太多事情,否则会影响下一帧的时序。

3.3 复位与初始化时序

AT7456E 上电后需要一段稳定的时间才能接受 SPI 配置,具体时间看数据手册,一般是 1ms 左右。我一般会在初始化代码里先拉低复位引脚至少 10us,然后拉高,再延时 10ms,确保芯片内部状态机复位完成。

初始化寄存器序列里,最关键的是 VM0 寄存器,它控制视频制式、复位、以及一些使能位。我一般会先写 VM0 做软复位,然后配置 DMM 寄存器设置显示内存的读写模式,再配置 OSD 的显示位置和字符属性。这里有个细节:AT7456E 的显示内存是按行和列组织的,每行 30 个字符,共 16 行,每个字符占两个字节,一个是字符编码,一个是属性字节。属性字节控制闪烁、反色、背景等。如果你只写字符编码不写属性,显示出来的字符可能是默认属性,不一定符合你的预期。

3.4 视频输入输出的硬件保护

视频输入引脚前面最好加一个隔直电容,一般是 0.1uF,防止摄像头输出的直流偏置影响芯片内部同步分离电路。视频输出引脚一般要加一个 75 欧姆的负载电阻到地,再通过电容耦合到输出接口。如果你发现输出画面亮度不对或者同步丢失,先检查这两个元件。

另外,如果摄像头和 AT7456E 之间距离比较远,建议用屏蔽线,并且屏蔽层单点接地。我遇到过因为视频线太长导致同步头被干扰,字符叠加位置随机跳动的情况,后来换了屏蔽线并缩短走线就解决了。

4. 寄存器配置与字符叠加实操流程

4.1 关键寄存器速查与配置逻辑

AT7456E 的寄存器不算多,但有几个是必须搞清楚的。VM0 是视频模式寄存器,控制制式选择、软复位、以及 OSD 使能。VM1 控制显示内存的读写模式,比如是 8 位模式还是 16 位模式。DMM 是显示内存模式寄存器,控制自动递增和清除行为。DMAL 和 DMAH 是显示内存地址低字节和高字节。DMDI 是显示内存数据输入寄存器,你写字符就是往这个寄存器里写。

我一般会封装几个函数:AT7456E_WriteReg(addr, data)写单个寄存器,AT7456E_ReadReg(addr)读单个寄存器,AT7456E_WriteDMA(addr, buf, len)连续写显示内存。连续写的时候,先写 DMAL 和 DMAH 设置起始地址,然后连续往 DMDI 写数据,地址会自动递增。这里要注意,自动递增是芯片内部行为,你不需要手动改地址,但前提是 DMM 寄存器里的自动递增位要打开。

4.2 字符编码与字库映射

AT7456E 内部字库是固定的,包含数字、字母、常用符号和一些特殊图形。每个字符对应一个 8 位编码,比如数字 0 到 9 的编码是 0x00 到 0x09,大写字母 A 到 Z 的编码是 0x0A 到 0x23。如果你要显示中文或者自定义图形,那就需要用到它的自定义字符功能,把自定义点阵写进扩展字库区域。

实际项目里,我一般只用到数字和几个符号,所以直接用内置字库就够了。但要注意,内置字库的字符编码和 ASCII 码不是一回事,你不能直接把 ASCII 码写进去。比如 ASCII 的 '0' 是 0x30,但 AT7456E 里数字 0 的编码是 0x00。这个映射关系一定要在代码里做好转换,否则显示出来全是乱码。

4.3 显示内存写入的完整流程

写一屏字符的流程大概是这样的:先确定要显示的行和列,计算出对应的显示内存地址。AT7456E 的显示内存地址是线性的,第一行第一个字符地址是 0x0000,第一行第二个是 0x0002,因为每个字符占两个字节。第二行第一个是 0x003C,因为每行 30 个字符,每个字符 2 字节,所以一行占 60 字节,也就是 0x3C。

计算好地址后,先写 DMAL 和 DMAH,然后连续写 DMDI。每个字符写两个字节:第一个是字符编码,第二个是属性字节。属性字节我一般设成 0x00,表示正常显示,不闪烁、不反色、无背景。如果你想让某个字符闪烁报警,可以把属性字节设成 0x01 或者 0x02,具体看数据手册里的属性位定义。

写完之后,不需要手动触发切换,芯片会在下一场消隐期自动把新数据切到显示缓冲区。但如果你写的是整屏数据,建议在写之前先关闭 OSD 显示,写完再打开,避免出现半屏新半屏旧的撕裂感。这个技巧在刷新率要求高的场景里特别有用。

4.4 遥测数据到 OSD 字符的转换

飞控发过来的遥测数据一般是二进制或者文本格式。如果是文本格式,比如“12.6V”,那你需要把每个字符转成 AT7456E 的编码。如果是二进制,比如电压是 126,表示 12.6V,那你需要先做数值到字符串的转换,再转编码。

我一般会在 MCU 里维护一个 OSD 缓冲区,大小是 16 行 × 30 列 × 2 字节,也就是 960 字节。每次遥测数据更新时,只更新缓冲区里对应的字段,然后整屏或者按行写入 AT7456E。整屏写入的好处是逻辑简单,坏处是 SPI 数据量大。按行写入更高效,但需要计算行地址。我实测下来,整屏写入在 9MHz SPI 下大概 1ms 左右,对 10Hz 刷新率来说完全不是问题,所以后来我都用整屏写入,代码简单不容易出错。

5. 常见问题与避坑指南实录

5.1 字符显示乱码或者位置错乱

这是最常见的问题,原因通常有三个。第一个是视频制式不匹配,PAL 配成了 NTSC,或者反过来。第二个是显示内存地址计算错误,比如行地址算错了,字符写到了错误的位置。第三个是字符编码转换错误,把 ASCII 码直接写进去了。

排查方法:先用示波器确认视频制式,然后读 VM0 寄存器确认芯片检测到的制式。如果制式对,再检查地址计算,可以先用固定地址写一个已知字符,看显示位置对不对。如果位置对但字符不对,那就是编码问题,检查你的字符映射表。

5.2 SPI 写入不生效或者只生效一次

这个问题我踩过好几次。现象是第一次写寄存器有效,后面再写就没反应了。原因通常是 CS 信号没有正确拉高,芯片认为传输还在继续,后续数据被当成同一个传输的延续。用硬件片选时,检查 SPI 的 NSS 管理配置;用软件片选时,检查 GPIO 操作是否在每次传输后都拉高了。

还有一个可能是 SPI 时钟太快,导致芯片内部状态机没来得及处理。可以先把 SPI 时钟降到 1MHz 试试,如果降速后正常,那就是时序问题,需要调整 PCB 走线或者加匹配电阻。

5.3 画面上出现横向条纹或者字符边缘噪点

这通常是电源噪声或者视频信号完整性有问题。先检查 AT7456E 的电源引脚滤波电容是否足够,模拟地和数字地是否单点连接。然后检查视频输入输出走线是否尽量短,是否有 75 欧姆匹配。如果条纹是固定频率的,可能是 SPI 时钟串扰到了视频信号,可以尝试降低 SPI 时钟或者拉开 SPI 走线和视频走线的距离。

5.4 字符刷新时画面闪烁

如果每次更新 OSD 数据时画面都会闪一下,说明你在写显示内存时没有处理好缓冲区切换。解决方法是在写之前先关闭 OSD 显示,写完再打开,这样芯片会在场消隐期统一切换,不会出现半屏更新。另外,刷新率不要太高,10Hz 到 20Hz 足够了,刷太快反而容易出问题。

5.5 常见问题速查表

问题现象可能原因排查方法解决措施
字符乱码编码映射错误检查字符编码转换表按数据手册重新映射
字符位置错乱制式不匹配或地址错误读 VM0 确认制式,检查地址计算修正制式配置和地址算法
SPI 写入不生效CS 时序问题或时钟太快示波器看 CS 和 SCLK改用硬件片选,降低 SPI 时钟
画面横向条纹电源噪声或信号串扰检查滤波电容和走线加电容,拉开 SPI 与视频走线
刷新时闪烁缓冲区切换不同步观察闪烁是否只在更新时出现写前关 OSD,写后开 OSD
字符亮度不均视频输出负载不匹配检查 75 欧姆负载电阻补上或调整负载电阻

5.6 独家避坑经验

第一个经验:AT7456E 的显示内存写入不需要严格同步视频场,但如果你在视频场同步期间写,偶尔会出现字符错位。我一般会在写之前读一下状态寄存器,确认当前不在场消隐期,或者干脆用定时器把写入操作安排在帧间隔里。

第二个经验:如果你用 DMA 写显示内存,DMA 传输完成中断里不要做任何耗时操作,否则下一帧的 SPI 传输可能被延迟,导致 OSD 刷新不同步。我一般只在中断里置一个标志位,主循环里再处理。

第三个经验:AT7456E 的自定义字符功能很强大,但写入自定义字库需要先关闭 OSD 显示,写完再打开,否则自定义字符可能不生效。而且自定义字库的地址和内置字库是分开的,不要搞混。

第四个经验:如果你发现 SPI 读寄存器总是返回 0xFF 或者 0x00,先检查 SDO 引脚是否接好,然后检查 SPI 模式是否支持读操作。AT7456E 的读操作需要先发地址,然后发一个 dummy 字节,再读数据,时序和写操作不一样,代码里要单独处理。

6. 调试工具与实测验证方法

6.1 逻辑分析仪抓 SPI 波形

调试 SPI 设备,逻辑分析仪是最实用的工具。我一般用 8 通道的逻辑分析仪,接 SCLK、MOSI、MISO、CS 四根线,采样率设到 24MHz 以上。抓到的波形可以直观看到 CS 是否在传输期间保持低电平,SCLK 的极性和相位是否和配置一致,数据位是否在正确的边沿被采样。

如果你看到 CS 在传输中间跳高,那肯定是片选管理有问题。如果看到数据位在错误的边沿变化,那就是 CPOL 或 CPHA 配错了。逻辑分析仪还能帮你确认写入的地址和数据是否符合预期,特别是调试显示内存写入时,能看到地址是否自动递增。

6.2 视频信号示波器观测

视频信号的质量直接决定 OSD 叠加效果。我一般会用示波器看视频输入和输出信号的同步头幅度、消隐区电平、以及字符叠加区域的信号变化。PAL 视频的同步头幅度大概是 300mV,如果输入信号同步头幅度不够,AT7456E 可能无法正确分离同步,导致字符位置漂移。

输出信号方面,重点看叠加区域的亮度变化。如果字符边缘有振铃或者过冲,说明输出匹配有问题,需要调整负载电阻或者加滤波电容。我遇到过因为输出电容太大导致字符边缘模糊的情况,后来换成 0.1uF 就清晰了。

6.3 实测数据与性能评估

在我自己的项目里,AT7456E 在 9MHz SPI 下,整屏 16×30 字符写入耗时约 1.2ms,刷新率可以轻松做到 20Hz 以上。视频延迟方面,从 SPI 写入到画面更新,实测延迟小于一场视频时间,也就是 PAL 制式下小于 20ms,NTSC 下小于 16.7ms。这个延迟对无人机图传来说完全可接受,飞手基本感觉不到。

功耗方面,AT7456E 在 3.3V 供电下,典型工作电流约 50mA,加上外围电路整体功耗不到 200mW。对于电池供电的无人机图传模块来说,这个功耗水平很友好。

6.4 长期运行稳定性观察

我做过一个连续运行 72 小时的测试,每 100ms 更新一次 OSD 数据,观察是否出现字符丢失、位置漂移或者 SPI 通信中断。实测下来,只要电源稳定、SPI 时序正确,AT7456E 的长期稳定性很好,没有出现任何异常。但有一点要注意:如果环境温度变化较大,比如从零下 10 度到 50 度,视频同步可能会偶尔丢失,这时候需要检查晶振或者视频输入耦合电容的温度特性。

7. 后续扩展与个人实操体会

AT7456E 的基本功能跑通之后,其实还有很多可以扩展的方向。比如你可以把自定义字符功能用起来,画一些简单的图标,比如电池符号、卫星符号、箭头指示等,让 OSD 画面更直观。自定义字符的写入稍微麻烦一点,需要先把点阵数据转成芯片要求的格式,但一旦调通,效果比纯文字好很多。

另一个扩展方向是多级告警显示。比如电压低于阈值时,让对应的字符闪烁或者反色显示。AT7456E 的属性字节支持闪烁和反色,你只需要在更新 OSD 缓冲区时根据告警状态修改属性字节就行,不需要额外的硬件。

我个人在实际操作中的体会是:AT7456E 这颗芯片本身不复杂,难点主要在视频信号的完整性和 SPI 时序的稳定性上。很多新手一上来就盯着寄存器配置,结果忽略了电源滤波和走线匹配,最后画面出问题怎么调寄存器都没用。我的建议是,硬件阶段就把视频走线和电源处理好,软件阶段先用低速 SPI 跑通基本显示,再逐步提高刷新率和时钟频率。这样排查问题的时候变量少,效率高得多。

最后再分享一个小技巧:如果你手头没有逻辑分析仪,可以用 MCU 的一个 GPIO 在 SPI 传输前后翻转,然后用示波器看这个 GPIO 和 SCLK 的关系,也能大致判断 CS 时序是否正确。虽然不如逻辑分析仪直观,但应急足够用了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询