Сопоставления макс. пин-кодов MinnowBoard
Примечание.
Чтобы сравнить это сопоставление контактов с более новыми версиями Minnowboard, ознакомьтесь с документацией здесь.
Обзор
Аппаратные интерфейсы для MinnowBoard Max предоставляются через 26-пин-заголовок JP1 на плате. Он поддерживает следующие функции:
- 10x — пин-коды GPIO
- 2x — последовательные UART
- 1x — шина SPI
- 1x —Шина I2C
- 1x - 5V power pin
- 1x - 3.3V power pin
- 2x — заземления
MinnowBoard Max использует уровни логики 3.3V для всех закреплений ввода-вывода. Кроме того, все закрепления буферизуются TXS0104E сдвигами уровня, за исключением питания и заземления. Эти сдвиги уровня отображаются как открытые выходные данные сборщика с резитивным вытягиванием 10KC, и вытягивание присутствует независимо от того, установлен ли ввод или вывод ввода-вывода.
Характер смены уровня открытого сборщика означает, что пин-коды могут выводить "0" строго, но только слабо выводить "1". Это важно учитывать при присоединении устройств, которые извлекает текущий из закрепления (например, светодиодный индикатор). См. пример blinky для правильного интерфейса светодиодных индикаторов с minnowBoard Max.
Штырьки 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 4 и GPIO 5 используются MinnowBoard Max в качестве загрузочных закреплений конфигурации для BIOS. Убедитесь, что подключенные устройства не управляют этими GPIO низкими во время загрузки, так как это может предотвратить загрузку MBM. После загрузки MBM в BIOS эти 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' */
}
Последовательное УАПП
В MBM доступно два серийных UARTS: UART1 и UART2
UART1 имеет стандартные линии UART1 TX и UART1 RX, а также сигналы управления потоками UART1 CTS и UART1 RTS.
- Закрепление 6 — TX UART1
- Закрепление 8 — UART1 RX
- Закрепление 10 — UART1 CTS
- Закрепление 12 — UART1 RTS
UART1 не работает с сборкой 10240. Используйте UART2 или преобразователь USB-serial.
UART2 включает только линии UART2 TX и UART2 RX .
- Закрепление 17 — UART2 TX
- Закрепление 19 — UART2 RX
UART2 не поддерживает управление потоками, поэтому доступ к следующим свойствам SerialDevice может привести к возникновению исключения:
- 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);
}
Обратите внимание, что для запуска кода последовательного УАПП необходимо добавить следующую возможность в файл Package.appxmanifest в проекте UWP:
У Visual Studio 2017 в конструкторе манифестов (визуальный редактор для файлов appxmanifest) есть известная ошибка, влияющая на возможность сериализации. Если приложение appxmanifest добавляет функцию сериализованной коммуникации, изменение appxmanifest с помощью конструктора повредит appxmanifest (дочерний xml-файл устройства будет потерян). Эту проблему можно обойти, вручную изменив appxmanifest: для этого щелкните правой кнопкой мыши appxmanifest и выберите в контекстном меню команду "Просмотр кода".
<Capabilities>
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
</Capabilities>
Шина I2C
Давайте рассмотрим шину I2C, доступную на этом устройстве.
Обзор I2C
Существует один контроллер I2C I2C5 , предоставляемый в заголовке пин-кода с двумя строками SDA и SCL. На этих линиях уже присутствуют внутренние резисторы подтягивания 10KC.
- Закрепление 15 — SDA I2C5
- Закрепление 13 — SCL I2C5
Пример I2C
В приведенном ниже примере инициализируется I2C5 и записывает данные на устройство I2C с адресом 0x40:
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, и в результате ЦП думает, что устройство не ответило и отменяет транзакцию шины. Проблема, как представляется, связана с сменами уровня TXS0104E на пин-выводах, которые могут активироваться преждевременно из-за пиков напряжения на линии. Текущее решение заключается в том, чтобы вставить резистор 100-ohm в ряд с линией SCK I2C, которая помогает подавлять пики. Не все устройства затронуты, поэтому это обходное решение необходимо только в том случае, если у вас возникли проблемы с получением ответа на автобус. Одно устройство, которое, как известно, требует этого обходного решения, — это HTU21D.
Шина SPI
Рассмотрим шину SPI, доступную на этом устройстве.
Обзор SPI
В MBM доступен один контроллер SPI0 :
- Закрепление 9 — SPI0 MOSI
- Закрепление 7 — SPI0 MISO
- Закрепление 11 — SPI0 SCLK
- Закрепление 5 — SPI0 CS0
Пример SPI
Ниже показан пример выполнения записи SPI на шине SPI0 :
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);
}
}