支持音频和全球导航卫星系统的索尼 Spresense Arduino 兼容板及其扩展板于2019年夏天在日本推出。该公司现在已经扩大了市场,并且还在美国和欧洲提供开发板。
他们还委托了一家机构将样品发送给不同的评测人,我也有幸被选中。在这篇评测中,我将从检查硬件开始,简要讨论软件开发选项,并介绍我使用 Spresense SDK 时的体验。
索尼 Spresense 拆箱
我收到了两个盒子。

一个是主板,另一个是扩展板。

主板盒子仅随附 CXD5602PWBMAIN1 板和信息表。板子顶部包括一个复位按钮、四个用户 LED、一个电源 LED、一个启动恢复按钮、摄像头接口、索尼 CXD5247电源管理以及音频模拟接口芯,可以看一下图中的黑色部分,但实际并没有那么黑,是反射导致, CXD5602PWBMAIN1 板支持 GNSS 的 Sony CXD5602 六核 Arm Cortex-M4F 微控制器 – 在封装上显示为 D5602GG,两排 2.54mm 间距 I/O 接头,以及位于电路板最右侧边缘的 GNSS 天线。

板子底部有8MB容量的MXIC MX25U6435F SPI NOR flash,一个100针连接主板和扩展板的连接器,CP2102N USB转TTL芯片,以及一个用于供电和编程的微型USB端口。
重要信息表主要包含法律术语、规范以及Spresense 支持网站的链接和二维码。

扩展板带有类似的信息表,以及用于将主板固定到位的四个塑料柱。

扩展板的最上面带有与 Arduino 兼容的接头、一个连接到主板的 100 针插座、一些跳线、一个 3.5 mm音频插孔和一个微型 SD 卡插槽。

以上介绍的是扩展板的正面。扩展板的另一面主要是另外两个芯片: 电平转换器72040和德州仪器的八通道双向多电压电平转换器LSF0108 ,以及微型的“扩展” USB 端口。

两块板的组装很简单。只需将四个黑色塑料柱插入扩展板的安装孔中,将主板放在上面,然后将其向下推就组装完成了。

两种软件开发环境
如Spresense 软件文档中所述,有两种使用 Spresense 板的方法:
- Spresense Arduino 库– 与许多开发人员熟悉的 Arduino IDE 配合使用。
- Spresense SDK– 索尼 CXD5602 芯片组的原始开发环境,基于NuttX实时操作系统,并利用 GNU Make 工具链。底层的 API 使开发人员能够优化内存使用、降低能耗、多核处理控制等,而这些在 Arduino 库中可能无法实现。
我已经发布了许多针对其他硬件平台的 Arduino IDE 评测,并且其他人已经发布了使用 Spresense 和 Arduino IDE 的项目,所以我认为对于我和我的读者来说,研究一下Spresense SDK会更有趣。

Spresense SDK 入门
索尼已提供 SDK 入门指南。因此,让我们尝试在运行 Ubuntu 18.04 的笔记本电脑上开始吧。
安装 Spresense SDK
- 首先,我们需要在终端窗口中安装一些依赖项:
1 |
sudo apt install git gperf libncurses5-dev flex bison gcc-arm-none-eabi genromfs pkg-config autoconf automake cmake |
- 下一步 ,从nuttx-tools安装 kconfig-frontends 包:
1 2 3 4 5 |
git clone https://bitbucket.org/nuttx/tools.git cd tools/kconfig-frontends/ ./configure --disable-shared make -j8 sudo make install |
- 并查看 SDK 源代码:
1 2 3 |
cd ../.. git clone --recursive https://github.com/sonydevworld/spresense.git git submodule foreach git checkout master |
USB连接
将当前用户添加到拨出组,然后注销以确保你可以访问串口:
1 |
sudo usermod -a -G dialout $USER |
现在是时候通过 USB 将主板连接到你的计算机了。这是内核日志的输出:
1 2 3 4 5 6 7 8 |
[99898.675476] usb 3-2: new full-speed USB device number 3 using xhci_hcd [99898.849262] usb 3-2: New USB device found, idVendor=10c4, idProduct=ea60 [99898.849267] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [99898.849270] usb 3-2: Product: CP2102N USB to UART Bridge Controller [99898.849272] usb 3-2: Manufacturer: Silicon Labs [99898.849275] usb 3-2: SerialNumber: 1601ea6abb61e811841264b55bfef139 [99898.851295] cp210x 3-2:1.0: cp210x converter detected [99898.864393] usb 3-2: cp210x converter now attached to ttyUSB0 |
该板被正确检测为具有 10c4 VID 和 ea60 PID 的 CP210x 转换器。
Spresense SDK 设置
- 首先设置初始 NuttX 内核配置:
1 2 |
cd spresense/sdk tools/config.py --kernel release |
- 然后设置初始SDK配置:
1 |
tools/config.py examples/hello |
输出:
1 2 3 4 5 6 7 |
WARNING: New loader v1.1.0 is required, please download and install. Download URL : https://developer.sony.com/file/download/download-spresense-firmware-v1-1-000 Install command: 1. Extract loader archive into host PC. ./tools/flash.sh -e <download zip file> 2. Flash loader into Board. ./tools/flash.sh -l /home/jaufranc/edev/spresense/spresense/firmware/spresense -c <port> |
我们被要求…
- 安装一个新的bootloader
下载 URL 要求你接受 EULA,即用户许可协议,否则无法从命令行的命令下载。下载后,我可以使用以下命令轻松将其烧录到开发板上:
1 2 3 4 |
cd tools mv ~/Downloads/spresense-binaries-v1.1.0.zip . ./flash.sh -e spresense-binaries-v1.1.0.zip sudo ./flash.sh -l ../../firmware/spresense/ -c /dev/ttyUSB0 |
最后命令输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> Install files ... install -b 115200 Install ../../firmware/spresense/loader.espk Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel. ....................................................................................................................115856 bytes loaded. Package validation is OK. Saving package to "loader" updater# install -b 115200 Install ../../firmware/spresense/gnssfw.espk Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel. ..........................................................................................................................................................................................................................................................................................................................................................................................................................................................450336 bytes loaded. Package validation is OK. Saving package to "gnssfw" updater# sync updater# Restarting the board ... reboot |
- 构建示例固件:
1 2 3 |
cd .. make buildkernel -j8 make -j8 |
你可以在当前目录中得到 nuttx.spk 固件:
1 2 |
ls nuttx.spk -l -rw-r--r-- 1 jaufranc jaufranc 153776 ม.ค. 5 16:11 nuttx.spk |
刷入并运行固件
此时,我们被要求刷写bootloader,但我们已经在上面完成了,所以我们可以直接刷写 nuttx.spk固件:
1 |
sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk |
命令的输出:
1 2 3 4 5 6 7 8 9 10 |
>>> Install files ... install -b 115200 Install nuttx.spk Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel. .........................................................................................................................................................153776 bytes loaded. Package validation is OK. Saving package to "nuttx" updater# sync updater# Restarting the board ... reboot |
要运行 hello world 程序,我们需要使用 minicom 或其他工具连接带有 115200 8N1 参数的串口:
1 |
minicom -D /dev/ttyUSB0 -b 115200 -s |
在串口设置中禁用硬件流控制,然后按 Esc 并选择Exit 退出。我们现在应该可以访问 NuttX 的 NuttShell (NSH) shell了。

接下来输入 hello 运行演示程序:
1 2 3 4 |
NuttShell (NSH) NuttX-7.22 nsh> hello Hello, World!! nsh> |
成功。hello world 程序的源代码可以在 examples/hello/hello_main.c 中找到,并且大部分是典型的 C hello world 程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
**************************************************************************** * Included Files ****************************************************************************/ #include <sdk/config.h> #include <stdio.h> /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * hello_main ****************************************************************************/ #ifdef CONFIG_BUILD_KERNEL int main(int argc, FAR char *argv[]) #else int hello_main(int argc, char *argv[]) #endif { printf("Hello, World!!\n"); return 0; } |
作为参考,NuttX shell 有一些与 busybox 类似的命令:
1 2 3 4 5 6 7 8 9 10 11 12 |
nsh> help help usage: help [-v] [<cmd>] [ date help mksmartfs rm uname ? dd hexdump mh rmdir umount basename df kill mount set unset break echo ls mv sh usleep cat printf mb mw shutdown xd cd exec mkdir poweroff sleep cp exit mkfatfs ps test cmp false mkfifo pwd time dirname free mkrd reboot true |
Spresense 示例程序
Hello word 很好入门,但 Spresense SDK 中还有其他更有趣的示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
ls examples/ accel camera gyro press adc colorsensor hello prime alarm decimator helloxx proximity Application.mk dnnrt_lenet Kconfig pwm asmp fft libexamples.a README.md audio_player fwupdate LibTarget.mk sixaxis audio_player_objif geofence light tilt audio_recorder gnss lte_http_get voice_call audio_through gnss_atcmd mag voice_command bluetooth_le_peripheral gnss_factory Make.defs watchdog bluetooth_spp gnss_pvtlog Makefile |
每个示例在Spresense NuttX 开发人员指南中都有描述。不知道为什么,没有blinky 的示例。
一些示例需要额外的硬件,例如摄像头附加板、蓝牙 LE附加板 、传感器附加板等。你可以在开发者网站的主页向下滚动并找到一个列表。
由于音频和 GNSS 是该板的一些主要功能,我将尝试分别用 C++ 和 C 编程语言编写的 audio_player 和 gnss 示例。
Spresense 音频播放器
构建和烧录过程与 hello world 程序相同,在 sdk 目录中执行以下命令:
1 2 3 |
./tools/config.py examples/audio_player make -j8 sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk |
程序已加载到开发板,但我们需要把一些额外的文件存储在 micro SD 卡中,其中包含音乐、播放列表和“worker”二进制文件,如 audio_player 示例目录中的 README.txt 文件所述:
之后,您可以在目录 sdk/modules/audio/dsp 中看到 worker 二进制文件“MP3DEC”、“WAVDEC”。
将 worker 二进制文件、播放列表和播放内容存储在选项指定的路径中。
– 默认路径
worker二进制:/mnt/sd0/BIN
播放列表:/mnt/sd0/PLAYLIST
内容:/mnt/sd0/AUDIO
作为播放列表的示例,PLAYLIST 文件夹中有 TRACK_DB.CSV。此外,作为内容示例,AUDIO 文件夹中有 Sound.mp3。Sound.mp3是一个采样频率48000,位长16,编解码的MP3文件。
一开始我对指令的措辞感到困惑,但幸好最终理解了指令,并将文件复制到了 FAT32 格式的 4GB micro SD 卡中:
1 2 3 4 5 6 |
cp ../examples/audio_player/AUDIO <sd_card_mount_point> -R cp ../examples/audio_player/PLAYLIST/ <sd_card_mount_point> -R mkdir <sd_card_mount_point>/BIN pushd modules/audio/dsp cp MP3DEC WAVDEC <sd_card_mount_point>/BIN/ popd |
现在将 microSD 卡插入 Spresense 板,并连接一些扬声器,然后在 NuttShell 中启动应用程序。
1 2 3 4 5 |
NuttShell (NSH) NuttX-7.22 nsh> player Start AudioPlayer example Running time is 10 sec Running time is 10 sec |
一切似乎都在按预期工作,除了我听不到任何音频……我检查了音频插孔连接,以防接触不良,我还检查了扬声器的功率和音量水平,但仍然没有声音。然后我想可能是Spresense主板和扩展板接触不良,所以我按下了板子的顶部……成功了!!!我终于可以从 Sound.mp3 文件中听到哔哔声了。有趣的是,micro SD 卡确实有效,但音频却无效。
全球导航卫星系统示例
让我们继续看 GNSS 的示例:
1 2 3 |
./tools/config.py examples/gnss make -j8 sudo tools/flash.sh -c /dev/ttyUSB0 nuttx.spk |
顺便说一句,请记住在运行 flash.sh 之前始终需要退出 minicom,否则最终会出现以下错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Traceback (most recent call last): File "serial/serialposix.py", line 495, in read serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "flash_writer.py", line 504, in <module> File "flash_writer.py", line 446, in main File "flash_writer.py", line 316, in cancel_autoboot File "flash_writer.py", line 263, in readline File "serial/serialposix.py", line 505, in read serial.serialutil.SerialException: read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?) [8067] Failed to execute script flash_writer |
另一个说明是,你可以使用将 menuconfig 带入设置选项的选项来运行 config.py:
1 |
./tools/config.py -m examples/gnss |
回到 GPS 测试。我试着把板子放在靠近窗户的地方,但建筑设计不太适合得到正确的 GPS 信号,1 小时 30 分后,我才得到UTC 时间。所以我搬到了户外,重新启动了电路板,一切都运行良好。仅 24 秒后我就得到了 UTC 时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
NuttShell (NSH) NuttX-7.22 nsh> nsh> nsh> gnss Hello, GNSS(USE_SIGNAL) SAMPLE!! start GNSS OK >Hour:0, minute:0, sec:3, usec:497 >No Positioning Data >Hour:0, minute:0, sec:4, usec:512 >No Positioning Data >Hour:0, minute:0, sec:5, usec:15289 ... >No Positioning Data >Hour:0, minute:0, sec:23, usec:507 >No Positioning Data >Hour:0, minute:0, sec:24, usec:522 >No Positioning Data >Hour:6, minute:59, sec:32, usec:554 >No Positioning Data >Hour:6, minute:59, sec:33, usec:561 >No Positioning Data |
1分 40 秒后就得到了定位数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>Hour:7, minute:0, sec:47, usec:559 >No Positioning Data >Hour:7, minute:0, sec:48, usec:533 >No Positioning Data >Hour:7, minute:0, sec:49, usec:533 >No Positioning Data >Hour:7, minute:0, sec:49, usec:769162 >LAT 37.02.1428 >LNG 95.36.5893 >Hour:7, minute:0, sec:50, usec:578 >LAT 37.02.1428 >LNG 95.36.5893 >Hour:7, minute:0, sec:51, usec:574 |
不,我才不是住在科菲维尔 :),然而定位数据暴露了我的位置。
示例代码太长,无法在本评测中详细介绍,但你可以在示例目录中找到源代码,而且Spresense SDK 文档看起来结构清晰,非常详细和全面。
结束语
最近,我在硬件评测方面遇到了麻烦,有时总是会出错,但我必须承认 Spresense 板的一切测试都进行得相当顺利,示例正常工作,开发人员文档看起来很棒。
对于大多数项目,你可能需要附加板,因为在没有任何类型的无线或有线连接的情况下,必然没有太多需要 GNSS 和音频的应用程序。
索尼 Spresense 主板在 Framos US 上的售价为 65 美元,你还可以在那里找到售价 45 美元的扩展板。如果你在欧洲,也可以从RS Components或Vido购买。Spresense相机的售价为29欧元,但这个价格不含增值税。传感器和蓝牙附加板由 ROHM 制造,可单独购买。希望他们能找到一种更简单的订购方法,也许在不久的将来会提供完整的开发套件。

文章翻译者:Taylor Lee,瑞科慧联(RAK)高级嵌入式开发工程师,有丰富的物联网和开源软硬件经验,熟悉行业主流软硬件框架,对行业发展动向有着敏锐的感知力和捕捉能力。