前言
在嵌入式系统的开发中,Serial Peripheral Interface (SPI) 是一种常用的通信协议。将其应用于Node.js 开发中,可以实现快速、可靠的数据传输,从而大大简化硬件程序的开发。本文将介绍如何使用 npm 包 spi-device 来管理 SPI 设备,并对其进行配置和数据传输。
硬件
在本次编写的应用中使用的硬件为 Raspberry Pi 3 Model B,上面连接了一个 ADC 模块 (ADS1115),详见ADS1115 Datasheet。
准备工作
使用 spi-device 需要硬件上的 SPI 设备连接好,并准备好相关的驱动程序。在 Raspberry Pi 系统中,SPI 通常已经被配置为良好的预设值。要确保 SPI 设备功能正常运行,可以使用以下指令:
sudo modprobe spi_bcm2835
安装 SPI 设备库
我们将使用 npm 包 spi-device 来编写 JavaScript 程序。安装该库可以使用以下指令:
npm install spi-device --save
构建示例
我们将构建一个简单的模块,其中将从 ADS1115 设备读取单个模拟输入通道。
-- -------------------- ---- ------- ----- --- - ---------------------- ----- ------ - -- ------- ----------------- ----- -- -------------------- ----- ----------- ------- -- - ------- ----------------- ----- -- -------------------- ----- ----------- ------- --- ----- ----------- - ----- -------- ------------------- -------- --- - ----- ------- - -- ----------- ------------------------ - -------- ----- ------- -------------- ---------------- ----------- -- -------- ----- --- ------------------------ ----- -------- -- - -- ----- - -------- - ---- - ----- -------- - ----------------------------- -- -- - ---------------------------- -- -- -------- ---------- - --- - ------------------- ----- ------- -- - -- ----- - ----------------- ------- - ------------------- -- ----- ------ -- - ------------------- --------------- --- ---
代码解读
模块依赖
首先,加载了 spi-device 模块。这个模块封装了从 SPI 设备读、写、传输数据的底层API。
const spi = require('spi-device');
设备配置
使用 spi-device 读、写设备之前,首先需要将 SPI 设备进行配置,如设备文件、模式、芯片选择等参数。
-- -------------------- ---- ------- ----- ------ - -- ------- ----------------- ----- -- -------------------- ----- ----------- ------- -- - ------- ----------------- ----- -- -------------------- ----- ----------- ------- ---
这里我们同时配置了两个设备来展示多个设备如何配置。在这个示例中,我们将 SPI 设备文件/dev/spidev0.0、/dev/spidev0.1 分别绑定到这两个配置对象中。
mode
参数设置 SPI 模式。SPI 具有四种不同的模式,通常为数字 0 到 3。
chipSelectActiveLow
参数设置芯片选择信号的极性。它应该是一个布尔值,表示接口极性的引脚是否具有低电位有效特性,此处设置为 true 表示设置起于低电位上。
maxSpeedHz
是 SPI 接口传输的最大速度,最大值为2000000000,本例中设置为 1000000Hz。
这就是我们可选配置中的一些例子,每个 SPI 设备可能有不同的配置,更多信息详见 spi-device API 文档。
读取通道值
本示例主要是读取从 ADS1115 模块的 0 通到读取数字信号。
在运行时,会使用以下代码将配置应用于我们想要打开的设备:
-- -------------------- ---- ------- ------------------- ----- ------- -- - -- ----- - ----------------- ------- - ------------------- -- ----- ------ -- - ------------------- --------------- --- ---
该代码打开了第一个配置对象中的设备(/dev/spidev0.0),并将它传递到readChannel()
方法进行读取。
function readChannel(device, channel, cb) {
device
参数是读取通道值将要打开的设备对象,channel
参数是要读取的通道号,cb
回调函数是当读取完成后将要执行的函数。
应用发送三个字节的数据包给 ADS1115 设备,将读取的通道编号(PWM 紧随其后),而这些字节的第一位被用于启动单次的 ADC 转换(0x80 字节):
const message = [{ sendBuffer: Buffer.from([ADC_COMMAND | channel, 0x00, 0x00]), receiveBuffer: Buffer.alloc(3), byteLength: 3, speedHz: 20000 }];
在读写轮流执行的传输完成后,回调函数传递包含一个标志读取值的 Buffer 而不是数据本身。
device.transfer(message, (err, message) => { if (err) { cb(err); } else { const rawValue = ((message[0].receiveBuffer[0] << 8) | message[0].receiveBuffer[1]) >> 4; cb(null, rawValue); } });
总结
本文主要介绍了在 Raspberry Pi 中如何使用 spi-device 包来读取 SPI 设备中的数据。必要的步骤包括安装 spi-device 包,设置设备配置,并使用 API 函数进行读写操作。我们编写了一个简单的代码示例来演示如何实现这些步骤,让你可以通过它了解 spi-device 在实践中用法。祝你好运。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/146846