Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
Zephyr 2.1.0-rc1
microSDモジュール: CK-40 (サンハヤト)
ロジック確認: Analog Discovery 2 (AD2)
概要
- microSDをSPIモードで接続する
- FAT形式のファイルとディレクトリを表示する
- サンプルのプロジェクトを実行
接続
参考: Default Zephyr Peripheral Mapping:
SPI1を使う。
- [CK-40]<-->[STM32L476], (ケーブル色)
- DAT/D0 <--> PA6(MISO), 青
- VSS <--> GND, 緑
- CLK <--> PB3(SCK), 黄
- VDD <--> 3V3, 赤
- CMD/DI <--> PA7(MOSI), オレンジ
- CS <-- 100k --> PA4(NSS), 白
CSは100kでプルアップしたが、プルアップ抵抗値は一例を参考にしただけ。
プロジェクトファイル
下記のプロジェクトファイルに変更をして使用した。
zephyr/samples/subsys/fs/fat_fs
prj.conf
CONFIG_SPI_1を使用するようになっている。
そのまま使用した。
CONFIG_SPI=y
CONFIG_SPI_1=y
CONFIG_DISK_ACCESS=y
CONFIG_DISK_ACCESS_SDHC=y
CONFIG_DISK_ACCESS_SPI_SDHC=y
CONFIG_LOG=y
CONFIG_FILE_SYSTEM=y
CONFIG_FAT_FILESYSTEM_ELM=y
CONFIG_PRINTK=y
オーバレイファイル: nucleo_l476rg.overlay
<BOARD>.overlay
ファイルを作成した。
nrf52840_blip.overlayの内容をコピーした上でPC7をcs-gpiosに設定している。
実際にはCSはPA4に接続しているため、この作業は間違っているのかもしれない。
/*
2019-12-15 yasokada
branched from [nrf52840_blip.overlay]
*/
/*
* Copyright (c) 2019 Tavish Naruka <tavishnaruka@gmail.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
&spi1 {
status = "okay";
cs-gpios = <&gpioc 7 0>;
sdhc0: sdhc@0 {
compatible = "zephyr,mmc-spi-slot";
reg = <0>;
status = "okay";
label = "SDHC0";
spi-max-frequency = <24000000>;
};
};
microSDの準備
Windows 10 professionalのPCにて下記のようなディレクトリとファイルを作成した。
- SomeDir/
- hogehoge.txt
- fugafuga.txt
実行
$ west build -p auto -b nucleo_l476rg samples/subsys/fs/fat_fs/
$ west flash
$ west flash
west flashは一回だけの場合にエラーになることがある。
二回実施すると失敗しない。
$ west debug
(gdb) break main.c:69
c
main.cの69行目は
if (res == FR_OK) {
ここでres=0だとFATマウントが成功していて、あとのリスト表示が実行される。
失敗時にはres=-5となっていた。
出力の確認
別のターミナルにて
$ sudo screen /dev/ttyACM0 115200
上記のwest debug以降の実行で下記のような結果になる。
***** Booting Zephyr OS build v2.1.0-rc1-252-g68729ad3f88e *****
[00:00:00.005,000] <inf> spi_ll_stm32: CS control inhibited (no GPIO device)
Sector size 512
Memory Size(MB) 1876
Disk mounted.
Listing dir /SD: ...
[DIR ] SYSTEM~1
[DIR ] SOMEDIR
[FILE] HOGEHOGE.TXT (size = 0)
[FILE] FUGAFUGA.TXT (size = 0)
[00:00:00.030,000] <inf> sdhc_spi: Found a ~1876 MiB SDHC card.
[00:00:00.031,000] <inf> sdhc_spi: Manufacturer ID=27 OEM='SM' Name='00000' Revision=0x10 Serial=0x928d5504
[00:00:00.031,000] <inf> main: Block count 3842048
SomeDir/とhogehoge.txt, fugafuga.txtが見えた。
成功。
screenはCtrl+a,kで終了
はまった
最初はSTM32F769I-Discoveryで試そうとしていた。
次にSTM32L476に変更したが、Arduino connector使用で同じピン使用と思っていたら全然違った。
Analog Discovery 2にてロジックを確認して気づいた。
Analog Discovery 2に今回も助けられた。
関連情報
overlay
cs-gpios = <&gpioc 7 0>;
上記を下記のようにしたが、処理は成功した。
cs-gpios = <&gpioc 17 0>;
<BOARD>.overlay
ファイルを別名にすると失敗した。
<BOARD>.overlay
ファイル自体は必要だが、cs-gpiosの定義はSPI1のChipSelectに関係ないような気はする。