c - 如何用C发送差分UART信号

标签 c verilog

我正在开发一个项目,希望使用在 FPGA 上运行的 C 应用程序将 UART 信号发送到相机。以前我一直使用系统调用 write() 发送 UART 命令。然而,虽然这适用于我使用 minicom 创建的模拟串行端口,但我不确定这是否适用于使用 CameraLink 标准的相机,因为规范规定 UART 信号是跨两个引脚的 LVDS(一个引脚是 UART_P,另一个是UART_N)。

我的问题是如何创建串行连接以用 C 语言将 UART 命令发送到该硬件。我可以使用 termios 打开两个 I/O channel 并将命令写入 UART_P 并将命令的补充版本写入 UART_N 吗?或者我应该将其写入我的verilog模块,该模块又可以将字节写入正引脚并将补码字节写入负引脚?或者有更好的方法吗?

编辑:显然,这个问题太宽泛,但我不知道如何在我要问的内容中添加更多内容。我觉得这是一个简单的问题:如何用 C 发送差分 UART 命令?

是否有某种方法可以使两个端口:一个对应正极引脚,另一个对应负极引脚,执行以下操作:

int fdp, fdn;
fdp = open(uart_p);
fdn = open(uart_n);

uint16_t cmd_p = [some value];
uint16_t cmd_n = ~[some value];

write(fdp, cmd_p, sizeof(cmd_p));
write(fdn, cmd_n, sizeof(cmd_n));

close(fdp);
close(fdn);

或者,我在 fpga 上有一个 verilog 模块,它可以从 C 程序中获取字节,将它们转换为 LVDS 信号,然后将它们发送到 UART 引脚。有人以前使用过相机链接或做过类似的事情吗?我不确定发送差分 uart 命令的最佳方法是什么。

最佳答案

你的问题相当“开放”,所以我无法给出确切的答案,但我想我至少可以引导你走向正确的方向。

如果您的相机 UART 是 LVDS(无论如何都很不寻常!),那么您应该使 UART 输出 channel 兼容 LVDS。大多数 FPGA,尤其是较大的 FPGA,都有特殊的 LVDS I/O 单元。

通常您必须从 FPGA I/O 库实例化此类 LVDS 单元。每个 FPGA 供应商都有一个 I/O 库,您应该查找 FPGA I/O 应用笔记。

无论如何:您不更改软件。 LVDS I/O 单元有一个输入和两个互补输出。反转是在硬件中完成的。还要注意您需要的电压水平。有许多具有不同电压摆幅的 LVDS 标准。检查您的相机数据表。

最后但并非最不重要的一点:检查 UART 接收 channel 需要什么。您可能还需要一个 LVDS 接收器。

关于c - 如何用C发送差分UART信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57417122/

相关文章:

c - 基本 C 问题。 fprintf 和 fgets 失败

c - 帕斯卡字符串在内存中是如何表示的?

Verilog:如何实例化模块

hardware - 将模块名称作为参数传递

c - 有界数值积分

c - 如何触发SIGUSR1和SIGUSR2?

ascii - VHDL:是否有一种方便的方法将ascii值分配给std_logic_vector?

verilog - FPGA大输入数据

c - C 中的字符串输入/输出

verilog - 如何在Verilog中的组合模块中为输出分配“无关”值