MinnowBoard 최대 핀 매핑

참고

이 핀 매핑을 최신 버전의 Minnowboard와 비교하려면 여기 설명서를 참조하세요.

개요

MinnowBoard 최대 핀 헤더

MinnowBoard Max의 하드웨어 인터페이스는 보드의 26핀 헤더 JP1 을 통해 노출됩니다. 기능은 다음과 같습니다.

  • 10x - GPIO 핀
  • 2x - 직렬 UART
  • 1x - SPI 버스
  • 1x - I2C 버스
  • 1x - 5V 전원 핀
  • 1x - 3.3V 전원 핀
  • 2x - 접지 핀

MinnowBoard Max는 모든 IO 핀에서 3.3V 논리 수준을 사용합니다. 또한 모든 핀은 전원 및 접지 핀을 제외하고 TXS0104E 수준 시프터에 의해 버퍼링됩니다. 이러한 수준 시프터는 10KΜM 저항 풀업이 있는 열린 수집기 출력으로 표시되며 IO가 입력 또는 출력으로 설정되어 있는지 여부에 관계없이 풀업이 존재합니다.

레벨 시프터의 오픈 수집기 특성은 핀이 '0'을 강하게 출력할 수 있지만 '1'만 약하게 출력한다는 것을 의미합니다. 이는 핀에서 전류를 그리는 디바이스(예: LED)를 연결할 때 유의해야 합니다. LED를 MinnowBoard Max에 인터페이스하는 올바른 방법은 Blinky 샘플을 참조하세요.

GPIO 핀

다음 GPIO 핀은 API를 통해 액세스할 수 있습니다.

Gpio # 머리글 핀
0 21
1 23
2 25
3 14
4 16
5 18
6 20
7 22
8 24
9 26

참고:GPIO 4GPIO 5 는 MinnowBoard Max에서 BIOS에 대한 부트스트랩 구성 핀으로 사용됩니다. 연결된 디바이스가 부팅 중에 이러한 GPIO를 낮게 구동하지 않는지 확인합니다. 이로 인해 MBM이 부팅되지 않도록 할 수 있습니다. BIOS를 지나 MBM이 부팅되면 이러한 GPIO를 정상적으로 사용할 수 있습니다.

GPIO 샘플

예를 들어 다음 코드는 GPIO 5 를 출력으로 열고 핀에 디지털 '1'을 씁니다.

using Windows.Devices.Gpio;

public void GPIO()
{
    GpioController Controller = GpioController.GetDefault(); /* Get the default GPIO controller on the system */

    GpioPin Pin = Controller.OpenPin(5);        /* Open GPIO 5                      */
    Pin.SetDriveMode(GpioPinDriveMode.Output);  /* Set the IO direction as output   */
    Pin.Write(GpioPinValue.High);               /* Output a digital '1'             */
}

직렬 UART

MBM에는 UART1 및 UART2의 두 가지 직렬 UART가 있습니다.

UART1 에는 UART1 CTS 및 UART1 RTS와 함께 표준 UART1 TX 및 UART1 RX 라인이 있습니다.

  • 핀 6 - UART1 TX
  • 핀 8 - UART1 RX
  • 핀 10 - UART1 CTS
  • 핀 12 - UART1 RTS

UART1은 빌드 10240을 기준으로 작동하지 않습니다. UART2 또는 USB-Serial 변환기를 사용하세요.

UART2 에는 UART2 TXUART2 RX 줄만 포함됩니다.

  • 핀 17 - UART2 TX
  • 핀 19 - UART2 RX

UART2는 흐름 제어를 지원하지 않으므로 SerialDevice의 다음 속성에 액세스하면 예외가 throw될 수 있습니다.

  • BreakSignalState
  • IsDataTerminalReadyEnabled
  • IsRequestToSendEnabled
  • 핸드셰이크 - SerialHandshake.None만 지원됩니다.

아래 예제에서는 UART2 를 초기화하고 쓰기를 수행한 다음 읽기를 수행합니다.

using Windows.Storage.Streams;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;

public async void Serial()
{
    string aqs = SerialDevice.GetDeviceSelector("UART2");                   /* Find the selector string for the serial device   */
    var dis = await DeviceInformation.FindAllAsync(aqs);                    /* Find the serial device with our selector string  */
    SerialDevice SerialPort = await SerialDevice.FromIdAsync(dis[0].Id);    /* Create an serial device with our selected device */

    /* Configure serial settings */
    SerialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
    SerialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
    SerialPort.BaudRate = 9600;
    SerialPort.Parity = SerialParity.None;         
    SerialPort.StopBits = SerialStopBitCount.One;
    SerialPort.DataBits = 8;

    /* Write a string out over serial */
    string txBuffer = "Hello Serial";
    DataWriter dataWriter = new DataWriter();
    dataWriter.WriteString(txBuffer);
    uint bytesWritten = await SerialPort.OutputStream.WriteAsync(dataWriter.DetachBuffer());

    /* Read data in from the serial port */
    const uint maxReadLength = 1024;
    DataReader dataReader = new DataReader(SerialPort.InputStream);
    uint bytesToRead = await dataReader.LoadAsync(maxReadLength);
    string rxBuffer = dataReader.ReadString(bytesToRead);
}

직렬 UART 코드를 실행하려면 UWP 프로젝트의 Package.appxmanifest 파일에 다음 기능을 추가해야 합니다.

Visual Studio 2017에는 serialcommunication 기능에 영향을 주는 매니페스트 디자이너(appxmanifest 파일의 시각적 편집기)에 알려진 버그가 있습니다. appxmanifest가 serialcommunication 기능을 추가하는 경우 디자이너를 사용하여 appxmanifest를 수정하면 appxmanifest가 손상됩니다(디바이스 xml 자식이 손실됨). appxmanifest를 마우스 오른쪽 단추로 클릭하고 상황에 맞는 메뉴에서 코드 보기를 선택하여 appxmanifest를 직접 편집하여 이 문제를 해결할 수 있습니다.

  <Capabilities>
    <DeviceCapability Name="serialcommunication">
      <Device Id="any">
        <Function Type="name:serialPort" />
      </Device>
    </DeviceCapability>
  </Capabilities>

I2C Bus

이 장치에서 사용할 수 있는 I2C 버스를 살펴보겠습니다.

I2C 개요

두 줄 SDASCL을 사용하여 핀 헤더에 노출되는 하나의 I2C 컨트롤러 I2C5가 있습니다. 10KΜS 내부 풀업 저항기는 이미 이러한 라인에 존재합니다.

  • 핀 15 - I2C5 SDA
  • 핀 13 - I2C5 SCL

I2C 샘플

아래 예제에서는 I2C5 를 초기화하고 주소 0x40 있는 I2C 디바이스에 데이터를 씁니다.

using Windows.Devices.Enumeration;
using Windows.Devices.I2c;

public async void I2C()
{
    // 0x40 is the I2C device address
    var settings = new I2cConnectionSettings(0x40);

    // FastMode = 400KHz
    settings.BusSpeed = I2cBusSpeed.FastMode;

    // Create an I2cDevice with the specified I2C settings
    var controller = await I2cController.GetDefaultAsync();

    using (I2cDevice device = controller.GetDevice(settings))
    {
        byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
        device.Write(writeBuf);
    }

}

I2C 문제

MinnowBoard Max에는 I2C 버스에 알려진 문제가 있어 특정 I2C 디바이스와 통신 문제가 발생합니다. 일반적으로 I2C 디바이스는 버스 요청 중에 해당 주소를 승인합니다. 그러나 특정 조건에서 이 승인은 수준 시프터를 통해 MBM으로 다시 전파되지 않으며, 그 결과 CPU는 디바이스가 응답하지 않았다고 생각하고 버스 트랜잭션을 취소합니다. 이 문제는 IO 핀의 TXS0104E 레벨 시프터와 관련이 있는 것으로 보이며, 이는 라인의 전압 스파이크로 인해 조기에 트리거될 수 있습니다. 현재 해결 방법은 100옴 저항기를 I2C SCK 라인과 연렬하여 스파이크를 억제하도록 하는 것입니다. 모든 디바이스가 영향을 받는 것은 아니므로 버스 응답을 받는 데 문제가 있는 경우에만 이 해결 방법이 필요합니다. 이 해결 방법이 필요한 것으로 알려진 디바이스 중 하나는 HTU21D입니다.

SPI Bus

이 디바이스에서 사용할 수 있는 SPI 버스를 살펴보겠습니다.

SPI 개요

MBM에서 사용할 수 있는 하나의 SPI 컨트롤러 SPI0 이 있습니다.

  • 핀 9 - SPI0 MOSI
  • 핀 7 - SPI0 MISO
  • 핀 11 - SPI0 SCLK
  • 핀 5 - SPI0 CS0

SPI 샘플

버스 SPI0 에서 SPI 쓰기를 수행하는 방법에 대한 예제는 다음과 같습니다.

using Windows.Devices.Enumeration;
using Windows.Devices.Spi;

public async void SPI()
{
    // Use chip select line CS0
    var settings = new SpiConnectionSettings(0);
    // Set clock to 10MHz
    settings.ClockFrequency = 10000000;

    // Create an SpiDevice with the specified Spi settings
    var controller = await SpiController.GetDefaultAsync();

    using (SpiDevice device = controller.GetDevice(settings))
    {
        byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
        device.Write(writeBuf);
    }
}