0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Zephyr + STM32L476 > microSD(SPIモード接続) + FAT

Last updated at Posted at 2019-12-17
動作環境 
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
Zephyr 2.1.0-rc1
microSDモジュール: CK-40 (サンハヤト)
ロジック確認: Analog Discovery 2 (AD2)

概要

接続

参考: 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を使用するようになっている。
そのまま使用した。

prj.cconf
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に接続しているため、この作業は間違っているのかもしれない。

nucleo_l476rg.overlay
/*
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に関係ないような気はする。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?