文档

SPI-串行外设接口

更新时间:
一键部署

本文介绍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引脚自动拉高。该接口适合FlashSensor的数据读取操作。

  • 读取的数据长度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();
  • 本页导读 (0)
文档反馈