如何在 C 中发送差分 UART 信号

How to send Differential UART signals in C

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

我的问题是如何在 C 中创建串行连接以将 UART 命令发送到此硬件。我可以使用 termios 打开两个 I/O 通道并将我的命令写入 UART_P 和一个补充我的命令版本 UART_N?或者我是否应该将它写入我的 verilog 模块,该模块可以依次将字节写入正引脚并将补充字节写入负引脚?或者有更好的方法吗?

编辑:显然,这个问题太宽泛了,但我不知道如何添加更多内容。我觉得这是一个简单的问题:How do I send a differential UART command in C?

有没有什么方法可以制作两个端口:一个对应正极引脚,另一个对应负极引脚:

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 引脚。有没有人以前使用过相机 link 或做过类似的事情?我不确定发送差分 uart 命令的最佳方法是什么。

你的问题相当"open"所以我不能给出准确的答案,但我想我至少可以引导你朝着正确的方向前进。

如果您的相机 UART 是 LVDS(无论如何非常不寻常!),那么您应该使 UART 输出通道兼容 LVDS。大多数 FPGA,当然是更大的 FPGA,都有特殊的 LVDS I/O 单元。

通常您必须从 FPGA I/O 库中实例化这样一个 LVDS 单元。每个 FPGA 供应商都有一个 I/O 库,您应该查找 FPGA I/O 应用说明。

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

最后但同样重要的是:检查 UART 接收通道需要什么。您可能还需要一个 LVDS 接收器。