Mapping massimo pin minnowBoard
Nota
Per confrontare questo mapping dei pin alle versioni più recenti di Minnowboard, visitare la documentazione qui.
Panoramica
Le interfacce hardware per MinnowBoard Max vengono esposte tramite l'intestazione JP1 a 26 pin sulla scheda. Le funzionalità includono:
- 10x - Pin GPIO
- 2x - UART seriali
- 1x - Bus SPI
- 1x - Bus I2C
- 1x - Pin di alimentazione da 5 V
- 1x - Pin di alimentazione da 3,3 V
- 2x - Pin da terra
MinnowBoard Max usa livelli di logica 3.3V su tutti i pin di I/O. Inoltre, tutti i pin sono memorizzati nel buffer da TXS0104E turnatori di livello, ad eccezione dell'alimentazione e dei pin da terra. Questi turni di livello vengono visualizzati come output dell'agente di raccolta aperti con un pull-up resistivo di 10KTP e il pull-up è presente indipendentemente dal fatto che l'I/O sia impostato su input o output.
La natura dell'agente di raccolta aperto dei turnatori di livello significa che i pin possono restituire un '0' fortemente, ma solo un output debole di '1'. Questo aspetto è importante da tenere presente quando si collegano dispositivi che disegnano corrente dai pin (ad esempio un LED). Vedere l'esempio Blinky per il modo corretto per interfacciare un LED per MinnowBoard Max.
Pin GPIO
I pin GPIO seguenti sono accessibili tramite le API:
GPIO# Pin intestazione 0 21 1 23 2 25 3 14 4 16 5 18 6 20 7 22 8 24 9 26
Nota: GPIO 4 e GPIO 5 vengono usati da MinnowBoard Max come pin di configurazione bootstrap per il BIOS. Assicurarsi che i dispositivi collegati non supportino questi GPIO bassi durante l'avvio, in quanto ciò potrebbe impedire l'avvio di MBM. Dopo l'avvio di MBM oltre il BIOS, questi GPIO possono essere usati normalmente.
Esempio GPIO
Ad esempio, il codice seguente apre GPIO 5 come output e scrive un '1' digitale sul pin:
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 seriale
Sono disponibili due UART Serial UARTS in MBM: UART1 e UART2
UART1 ha le linee UART1 TX e UART1 RX standard, insieme ai segnali di controllo del flusso UART1 CTS e UART1 RTS.
- Pin 6 - UART1 TX
- Pin 8 - UART1 RX
- Pin 10 - UART1 CTS
- Pin 12 - UART1 RTS
UART1 non funziona a partire dalla build 10240. Usare UART2 o un convertitore usb-seriale.
UART2 include solo le linee UART2 TX e UART2 RX .
- Pin 17 - UART2 TX
- Pin 19 - UART2 RX
UART2 non supporta il controllo del flusso, pertanto l'accesso alle proprietà seguenti di SerialDevice può comportare la generazione di un'eccezione:
- BreakSignalState
- IsDataTerminalReadyEnabled
- IsRequestToSendEnabled
- Handshake: è supportato solo SerialHandshake.None
L'esempio seguente inizializza UART2 ed esegue una scrittura seguita da una lettura:
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);
}
Tieni presente che devi aggiungere la funzionalità seguente al file Package.appxmanifest nel progetto UWP per eseguire il codice UART seriale:
Visual Studio 2017 presenta un bug noto in Progettazione manifesto (l'editor visivo per i file appxmanifest) che influisce sulla funzionalità serialcommunication. Se appxmanifest aggiunge la funzionalità serialcommunication, la modifica dell'appxmanifest con la finestra di progettazione danneggia l'appxmanifest (l'elemento figlio xml del dispositivo andrà perso). È possibile risolvere questo problema modificando a mano l'appxmanifest facendo clic con il pulsante destro del mouse sull'appxmanifest e scegliendo Visualizza codice dal menu di scelta rapida.
<Capabilities>
<DeviceCapability Name="serialcommunication">
<Device Id="any">
<Function Type="name:serialPort" />
</Device>
</DeviceCapability>
</Capabilities>
Bus I2C
Esaminiamo il bus I2C disponibile in questo dispositivo.
Panoramica di I2C
Esiste un controller I2C I2C5 esposto nell'intestazione del pin con due righe SDA e SCL. I resistori interni di pull-up di 10KHM sono già presenti su queste linee.
- Pin 15 - I2C5 SDA
- Pin 13 - I2C5 SCL
Esempio I2C
L'esempio seguente inizializza I2C5 e scrive i dati in un dispositivo I2C con indirizzo 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);
}
}
Problemi di I2C
MinnowBoard Max presenta un problema noto con il bus I2C, che causa problemi di comunicazione con determinati dispositivi I2C. In genere, un dispositivo I2C riconoscerà il suo indirizzo durante una richiesta del bus. Tuttavia, in determinate condizioni questo riconoscimento non riesce a propagarsi attraverso i turnatori di livello al MBM e, di conseguenza, la CPU ritiene che il dispositivo non abbia risposto e annulla la transazione del bus. Il problema sembra essere correlato ai turnatori di livello TXS0104E sui pin di I/O, che possono attivare prematuramente a causa di picchi di tensione sulla linea. La soluzione alternativa corrente consiste nell'inserire un resistore da 100 ohm in serie con la linea SCK I2C, che consente di eliminare i picchi. Non tutti i dispositivi sono interessati, quindi questa soluzione alternativa è necessaria solo se si verificano problemi a ricevere una risposta del bus. Un dispositivo noto per richiedere questa soluzione alternativa è HTU21D.
Bus SPI
Esaminiamo il bus SPI disponibile in questo dispositivo.
Cenni preliminari su SPI
In MBM è disponibile uno SPI controller SPI0 :
- Pin 9 - SPI0 MOSI
- Pin 7 - SPI0 MISO
- Pin 11 - SPI0 SCLK
- Pin 5 - SPI0 CS0
Esempio SPI
Di seguito è riportato un esempio su come eseguire una scrittura SPI sul bus 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);
}
}