本文介绍SPI-串行外设接口支持函数的参数说明及示例。
硬件平台
产品型号 | 是否支持 | 硬件类型 | 固件版本号 |
HaaS600Kit | 是 | 开发板 | 4.0.1 |
HaaS510 | 否 | DTU | 4.0.1 |
HaaS520 | 否 | DTU | 4.0.1 |
HaaS530 | 是 | DTU | 4.0.1 |
HaaS531 | 是 | DTU | 4.0.1 |
HaaS632-LT32V | 是 | 模组 | 4.0.1 |
HaaS600-EC600S | 是 | 模组 | 4.0.1 |
HaaS600-EC600N | 是 | 模组 | 4.0.1 |
HaaS600-EC600U | 是 | 模组 | 4.0.1 |
HaaS600-N715 | 否 | 模组 | 4.0.1 |
open(Object options)
打开SPI,创建SPI实例。
入参
属性 | 类型 | 是否必填 | 描述 |
id | String | 是 | 指定要打开的SPI端口。 |
返回
SPI实例。
write(Uint8Array data)
通过SPI发送数据,要发送数据时CS引脚自动拉低,待发送完成后CS引脚自动拉高。该函数为阻塞函数,SPI发送完成后才会返回。
入参
属性 | 类型 | 是否必填 | 描述 |
data | Uint8Array | 是 | 需要发送的数据。 |
返回
无。
read(Number bytes)
读取指定bytes的SPI数据,要接收数据时CS引脚自动拉低,待接收完成后CS引脚自动拉高。该函数为阻塞函数,读取到指定bytes的数据后才会返回。
入参
属性 | 类型 | 是否必填 | 描述 |
bytes | Number | 是 | 指定需要读取的字节个数。 |
返回
ArrayBuffer类型,读取到的SPI数据。
readWrite(Uint8Array data,Number bytes)
发送数据的同时读取指定bytes的SPI数据,发送和接收数据期间CS引脚自动保持拉低,完成后CS引脚自动拉高。该接口适合Flash或Sensor的数据读取操作。
读取的数据长度bytes小于等于发送数据的长度data.length时,等同于仅使用发送功能。
读取的数据长度bytes大于发送数据的长度data.length时,读取到的有效数据为ArrayBuffer的后面
(bytes - data.length)
长度数据。
入参
属性 | 类型 | 是否必填 | 描述 |
data | Uint8Array | 是 | 需要发送的数据。 |
bytes | Number | 是 | 指定需要读取的字节个数。 |
返回
ArrayBuffer类型,读取到的SPI数据。
返回的ArrayBuffer
需要根据实际应用场景提取有效数据。
close()
关闭SPI实例。
入参
无。
返回
无。
示例代码
板级配置
板级详细配置说明,请参见app.json-全局配置文件。
{
"version": "1.0.0",
"io": {
"FLASH": {
"type": "SPI",
"port": 1,
"mode": 0,
"freq": 812500
}
},
"debugLevel": "DEBUG",
"repl":"disable"
}
应用脚本
import *as spi from 'spi';
var W25Q = spi.open({
id: "FLASH",
});
/**
* 读取flash w25q128 的JEDEC ID值
*
* @returns {objct} 返回 JEDEC 值值
*/
function getJEDEC() {
/* 根据w25q数据手册,读取JEDEC ID要先发送命令 [0x90, 0, 0, 0] */
var cmd = [0x90, 0, 0, 0];
/* 根据w25q数据手册,要读取的ID长度为2,因此定义长度为2的 Unit8Array,元素值可以是任意值 */
var val = [0xff, 0xff];
/* 拼接数组 为 [0x90, 0, 0, 0, 0xff, 0xff] */
var buf = cmd.concat(val);
/* 发送长度为6 Byte的数据,同时读取6 Byte的数据 */
val = W25Q.readWrite(buf, buf.length);
var res = {};
/* 提取制造商ID val[4] */
res.manufacturerId = "0x" + val[4].toString(16).toLocaleUpperCase();
/* 提取设备ID val[5] */
res.deviceId = "0x" + val[5].toString(16).toLocaleUpperCase();
return res;
}
/**
* 忙等待
*/
function waitReady() {
/* 根据w25q数据手册,读取状态要先发送命令 0x05 */
var cmd = [0x05];
/* 根据w25q数据手册,要读取的数据长度为1,因此定义长度为1的 Unit8Array, 元素值可以是任意值 */
var val = [0];
/* 拼接数组为 [0x05, 0] */
var buf = cmd.concat(val);
while (1) {
val = W25Q.readWrite(buf, buf.length);
if ((val[1] & 0x01) == 0x01) continue;
else break;
}
}
/**
* 擦整个flash
*/
function eraseChip() {
/* 写使能命令为 0x06 */
W25Q.write([0x06]);
/* 芯片擦除命令为 0xc7 */
W25Q.write([0xc7]);
/* 等待擦除完成 */
waitReady();
}
var jedec = getJEDEC();
/* 正确ID为 0xEF */
console.log('ManufacturerID:', jedec.manufacturerId);
/* 正确ID为 0x17 */
console.log('DeviceID:', jedec.deviceId);
eraseChip();