在现代电子设计中,数据采集和通信是不可或缺的一部分。本文将介绍如何使用National Instruments的USB-6210数据采集设备(DAQ)来实现对一组设备的测量,并利用其数字输出和输入线路来实现测试夹具的命令与控制。
NI USB-6210是一款功能强大的数据采集设备,它拥有4个数字输入和4个数字输出端口。本文的目标是实现一个四线SPI(串行外设接口)总线,其中DAQ作为主设备,同时配置两个从设备选择线。在研究SPI的过程中,发现了一篇非常有用的文章,以及一些源代码示例,这些示例被成功地适配到了一个C#类中,以便在项目中使用。
这个SPI类提供了构造函数的重载,允许指定输出端口(四个输出线路)、输入线路、时钟相位和时钟极性。此外,该类还公开了一些属性和方法。
构造函数提供了多种重载方式,允许用户根据需要指定输出和输入线路,以及时钟脉冲的极性和相位。
类中定义了一些方法,例如Dispose()用于显式清理类使用的非托管资源,Transfer(byte inByte)用于同时向总线写入一个字节并从总线读取一个字节。
类中定义了一些属性,如SCKPhase和SCKPolarity用于获取或设置时钟边缘,SS0和SS1用于获取或设置从设备选择线的状态,Timeout用于获取或设置读写操作的超时时间。
类中定义了ClockPolarity和ClockPhase两个枚举,分别用于指定SCK线在字节传输前后的电平,以及从设备在时钟的哪个边缘上锁存输入数据位和移位输出数据位。
这个类使用了多个NI-DAQmx C API调用。这些调用被封装在一个本地包装类中,包含了PInvoke签名,将其与项目一起提供。
static void Main(string[] args) {
try {
daqSPI spi = new daqSPI(
"Dev1/port1",
"Dev1/port0/line3",
daqSPI.ClockPolarity.ONE, daqSPI.ClockPhase.LOGICAL_ZERO);
byte[] data = ASCIIEncoding.Default.GetBytes(
"It was a dark and stormy night; the rain fell in torrents, except at " +
"occasional intervals, when it was checked by a violent gust of wind " +
"which swept up the streets (for it is in London that our scene lies), " +
"rattling along the house-tops, and fiercely agitating the scanty flame " +
"of the lamps that struggled against the darkness. Through one of the " +
"obscurest quarters of London, and among haunts little loved by the " +
"gentlemen of the police, a man, evidently of the lowest orders, was " +
"wending his solitary way.");
spi.SS0 = true; // Selects SS0 deselects SS1
foreach (byte b in data) {
Console.Write((char) spi.Transfer(b));
}
Console.WriteLine();
} catch (Exception ex) {
Console.WriteLine("DAQmx Error: {0}", ex.ToString());
}
Console.WriteLine("End of program, press Enter key to quit");
Console.Read();
}
尽管从设备0并不理解优美的诗句,但Tektronix TDS 420示波器捕捉到了正在传输的一个字节。
在进行数据传输时,可以通过示波器来观察数据线、时钟线、SS0和SS1的状态。通过这种方式,可以确保数据传输的正确性。
为了测试SPI类,构建了一个演示程序。这个程序展示了如何使用NI USB-6210实现SPI通信。在测试过程中,简单地将MOSI线循环到MISO线上。