🦠

XIAO ESP32C3で始めるnanoFramework ~SPI~

2023/05/20に公開

Seeed Studio XIAO ESP32C3で.NET nanoFrameworkを動かす記事というか雑記。

今回は、SPI。A/DコンバータMCP3002で電圧を取得して表示します。

ハードウェア

MCP3002をXIAO ESP32C3に繋ぎます。
結線が多いのでブレッドボードで。

  • XIAO ESP32C3 GND - MCP3002 Pin4(Vss)
  • XIAO ESP32C3 3V3 - MCP3002 Pin8(Vdd)
  • XIAO ESP32C3 D7 - MCP3002 Pin1(CS#)
  • XIAO ESP32C3 D8(SCK) - MCP3002 Pin7(CLK)
  • XIAO ESP32C3 D9(MISO) - MCP3002 Pin6(Dout)
  • XIAO ESP32C3 D10(MOSI) - MCP3002 Pin5(Din)
  • 可変抵抗からのアナログ電圧 - MCP3002 Pin2(CH0)

NuGetパッケージ

SPIするためのnanoFramework.System.Device.Spiを追加します。依存しているnanoFramework.Runtime.EventsとnanoFramework.System.Device.Gpioも追加されます。
また、ESP32C3のピン機能の設定が必須なので、nanoFramework.Hardware.Esp32も追加します。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="nanoFramework.CoreLibrary" version="1.14.2" targetFramework="netnano1.0" />
  <package id="nanoFramework.Hardware.Esp32" version="1.6.3" targetFramework="netnano1.0" />
  <package id="nanoFramework.Runtime.Events" version="1.11.6" targetFramework="netnano1.0" />
  <package id="nanoFramework.System.Device.Gpio" version="1.1.28" targetFramework="netnano1.0" />
  <package id="nanoFramework.System.Device.Spi" version="1.3.37" targetFramework="netnano1.0" />
</packages>

C#コード

1秒周期にMCP3002で電圧をA/Dコンバートして取得、出力ウィンドウに表示します。
Configuration.SetPinFunction()でピンの機能を設定しておき、SpiDevice.Create()でSPIインターフェースを取得します。
試し始めは全然動かず、試行錯誤しましたが、、、バグでしたw
いまはきちんと動きます。ご安心ください。

using nanoFramework.Hardware.Esp32;
using System.Device.Spi;
using System.Diagnostics;
using System.Threading;

Configuration.SetPinFunction(8, DeviceFunction.SPI1_CLOCK); // SCK  ... GPIO8
Configuration.SetPinFunction(9, DeviceFunction.SPI1_MISO);  // MISO ... GPIO9
Configuration.SetPinFunction(10, DeviceFunction.SPI1_MOSI); // MOSI ... GPIO10

var settings = new SpiConnectionSettings(1, 20);            // SS   ... GPIO20
settings.ClockFrequency = 1_000_000;
settings.Mode = SpiMode.Mode0;
settings.DataFlow = DataFlow.MsbFirst;
settings.DataBitLength = 8;

using var device = SpiDevice.Create(settings);

while (true)
{
    var readBytes = new byte[2];
    device.TransferFullDuplex(new byte[] { 0b01101000, 0 }, readBytes);
    var volt = ((readBytes[0] & 0x03) * 256 + readBytes[1]) * 3.3 / 1023;
    Debug.WriteLine($"{volt}");

    Thread.Sleep(1000);
}

device.TransferFullDuplexの波形

波形はOK。
CSのLOW期間が長いのが気になりますね。

Discussion