SamdSercom

Bu eğitimde, SAMD tabanlı kartınıza nasıl daha fazla seri arayüz ekleyeceğinizi açıklıyoruz; Bu arayüzler donanım tabanlı ve I2Cs, UARTs veya SPIS türleri olabilir. SAMD mikro denetleyicisinin ayrı ayrı yapılandırılabilen altı dahili seri modülü olması ve bunlardan sadece dördü zaten yapılandırılmış olması nedeniyle bu mümkündür; diğer ikisi belirli pimlerle eşleştirmek için kullanılabilir ve bu öğreticide bunu nasıl yapacağınızı açıklıyoruz.

Gerekli Donanım

Devre

Bu örnek için yalnızca Arduino veya Genuino Board'unuza ihtiyaç vardır.

Pim işlevleri

Arduino platformunun avantajlarından biri, her mikrodenetleyici pimine olası birçok işlevden birini atayarak hadwarein basitleştirilmesidir. Her bir pime atanan çeşitli işlevleri, her kartın variant.cpp dosyasında bulabilirsiniz. Örneğin, MKR1000 modelini görelim .

Dikkatimizi SERCOM ile ilgili pime odaklayarak aşağıdaki bilgileri çıkarabiliriz:

/*
 +------------+------------------+---------+---------+----------+
 | Pin number |  MKR  Board pin  | Perip.C | Perip.D | Periph.G |
 |            |                  | SERCOMx | SERCOMx |    COM   |
 |            |                  | (x/PAD) | (x/PAD) |          |
 +------------+------------------+---------+---------+----------+
 | 00         | D0               |   3/00  |   5/00  |          |
 | 01         | D1               |   3/01  |   5/01  | USB/SOF  |
 | 02         | D2               |   0/02  |   2/02  | I2S/SCK0 |
 | 03         | D3               |   0/03  |   2/03  | I2S/FS0  |
 | 04         | D4               |         |   4/02  | I2S/MCK1 |
 | 05         | D5               |         |   4/03  | I2S/SCK1 |
 | 06         | D6               |   5/02  |   3/02  | I2S/SCK0 |
 | 07         | D7               |   5/03  |   3/03  | I2S/FS0  |
 +------------+------------------+---------+---------+----------+
 |            |       SPI        |         |         |          |
 | 08         | MOSI             |  *1/00  |   3/00  |          |
 | 09         | SCK              |  *1/01  |   3/01  |          |
 | 10         | MISO             |  *1/03  |   3/03  | I2S/SD0  |
 +------------+------------------+---------+---------+----------+
 |            |       Wire       |         |         |          |
 | 11         | SDA              |  *0/00  |   2/00  | I2S/SD1  |
 | 12         | SCL              |  *0/01  |   2/01  | I2S/MCK0 |
 +------------+------------------+---------+---------+----------+
 |            |      Serial1     |         |         |          |
 | 13         | RX               |         |  *5/03  |          |
 | 14         | TX               |         |  *5/02  |          |
 +------------+------------------+---------+---------+----------+
 | 16         | A1               |         |   5/00  |          |
 | 17         | A2               |         |   5/01  |          |
 | 18         | A3               |         |   0/00  |          |
 | 19         | A4               |         |   0/01  |          |
 | 20         | A5               |         |   0/02  |          |
 | 21         | A6               |         |   0/03  | I2S/SD0  |
 +------------+------------------+---------+---------+----------+
 |            | ATWINC1501B SPI  |         |         |          |
 | 26         | WINC MOSI        |  *2/00  |   4/00  |          |
 | 27         | WINC SCK         |  *2/01  |   4/01  |          |
 | 28         | WINC SSN         |   2/02  |   4/02  |          |
 | 29         | WINC MISO        |  *2/03  |   4/03  |          |
 +------------+------------------+---------+---------+----------+
 |            | ATWINC1501B PINS |         |         |          |
 | 32         | WINC WAKE        |         |   4/00  |          |
 | 33         | WINC IRQN        |         |   4/01  |          |
 +------------+------------------+---------+---------+----------+
 */
[Kodu Al]

Gördüğünüz gibi, SERCOM'lar hemen hemen her yere yönlendirilebilir ve birden fazla pin üzerinde birden fazla SERCOM yönlendirilebilir.

Varsayılan olarak atanan SERCOM'lar

Başlıktaki MKR1000 kartlarında aşağıdaki gibi konumlandırılmış bir SPI, I2C ve UART arayüzü bulabilirsiniz:

  • SPI / SERCOM 1 :
    • Pim 8'de MOSI;
    • Pim 9'da SCK;
    • Pin 10'da MISO;
  • I2C / SERKOM 0 :
    • Pim 11 üzerinde SDA;
    • Pim 12 üzerinde SCL;
  • UART / SERCOM 5 :
    • Pim 13'te RX;
    • Pim 14 üzerinde TX;

Ayrıca WINC1500 modülüne dahili olarak bağlı başka bir SPI arayüzü aşağıdaki gibi kablolanmıştır:

  • WINC1500 SPI / SERCOM 2 :
    • 26 numaralı pimde MOSI;
    • 27 numaralı pimde SCK;
    • Pin 29'da MISO;

Bu yüzden, önceden var olan arayüzleri tablodan çıkarmak, amacımız önceden tanımlanmış olanı değiştirmek yerine yeni arayüzler eklemek olduğundan, aşağıdakileri elde ederiz:

/ *
+ ------------ + ------------------ + --------- + ------- - + ---------- +
| Pim numarası | MKR Kurulu pimi | Perip.C | Perip.D | Periph.G |
| | | SERCOMx | SERCOMx | COM |
| | | (x / PAD) | (x / PAD) | |
+ ------------ + ------------------ + --------- + ------- - + ---------- +
| 00 | D0 | 3/00 | 5/00 | |
| 01 | D1 | 3/01 | 5/01 | USB / SOF |
| 02 | D2 | 0/02 | 2/02 | I2S / SCK0 |
| 03 | D3 | 0/03 | 2/03 | I2S / FS0 |
| 04 | D4 | | 4/02 | I2S / MCK1 |
| 05 | D5 | | 4/03 | I2S / SCK1 |
| 06 | D6 | 5/02 | 3/02 | I2S / SCK0 |
| 07 | D7 | 5/03 | 3/03 | I2S / FS0 |
+ ------------ + ------------------ + --------- + ------- - + ---------- +
| 16 | A1 | | 5/00 | |
| 17 | A2 | | 5/01 | |
| 18 | A3 | | 0/00 | |
| 19 | A4 | | 0/01 | |
| 20 | A5 | | 0/02 | |
| 21 | A6 | | 0/03 | I2S / SD0 |
+ ------------ + ------------------ + --------- + ------- - + ---------- +
* /

Yeni bir iletişim arayüzü ekleme

Şimdi MKR1000 kartımıza yeni bir arayüz eklemek için yukarıdaki tabloyu kullanmaya çalışalım .

Yeni bir Wire örneği oluşturma

Gördüğümüz gibi pim 0 ve pim 1 iki SERCOM tarafından tahrik edilebilir . Özellikle SERCOM3 ve SERCOM5 tarafından. SAMD21 veri sayfasına bakıldığında, SERCOM PAD0'ın SDA ve SERCOM PAD1'in SCL olarak kullanılabileceğini anlayabiliriz , böylece aşağıdaki örneği kullanarak bunu yapabiliriz.

/ * MKR1000 üzerindeki 0 ve 1 pinlerinde Tel Bağımlı Verici

Wire kütüphanesinin kullanımını ve başka bir Wire öğesinin nasıl oluşturulacağını gösterir
Verileri I2C / TWI bağımlı cihaz olarak gönderir
Bununla kullanım için "Wire Master Reader" örneğine bakınız.

20 Haz 2016 tarihinde oluşturuldu
tarafından
Arturo Guadalupi <a.guadalupi@arduino.cc>
Sandeep Mistry <s.mistry@arduino.cc>
* /


#include <Wire.h>
#include "wiring_private.h"

TwoWire myWire ( & sercom3 , 0 , 1 ) ; // 0 ve 1 pinlerine atayan yeni tel örneğini oluşturun

geçersiz kurulum ( )
{
myWire. başlar ( 2 ) ; // 2 numaralı i2c veriyoluna katılın

pinPeripheral ( 0 , PIO_SERCOM ) ; // 0 pinine SDA işlevi atayın
pinPeripheral ( 1 , PIO_SERCOM ) ; // PIN 1'e SCL işlevi atayın

myWire. onRequest ( requestEvent ) ; // olayı kaydet
}

void loop ( )
{
gecikme ( 100 ) ;
}

// veri yöneticisi tarafından her istendiğinde çalışan işlev
// bu işlev bir olay olarak kaydedilir, bkz. setup ()
void requestEvent ( )
{
myWire. yazma ( "merhaba" ) ; // 6 baytlık mesajla yanıt verin
// master tarafından beklendiği gibi
}

// Kesme işleyicisini SERCOM'a takın
extern "C" {
void SERCOM3_Handler ( void ) ;

void SERCOM3_Handler ( void ) {
myWire. onService ( ) ;
}
}

iki talimatta pinleri yeniden pinPeripheral (pinnumber,function) dahili fonksiyon pinPeripheral (pinnumber,function)

pinPeripheral ( 0 , PIO_SERCOM ) ; // 0 pinine SDA işlevi atayın
pinPeripheral ( 1 , PIO_SERCOM ) ; // PIN 1'e SCL işlevi atayın

koyulmalıdır setup() bu kartı için standart Arduino pim ataması (dijital I / O) geçersiz kılmak için ve SERCOM onları götürmek izin vermek için.

Geri arama

void SERCOM3_Handler ( void ) {
myWire. onService ( ) ;
}

bunun yerine Tel kütüphanesi kesintilere dayandığından gerçek I2C iletişimine izin vermek için kullanılır.

Yeni bir Seri örneği oluşturma

/ *
0 ve 1 pinlerine yerleştirilen UART'ta AnalogReadSerial
A0 pimindeki bir analog girişi okur, sonucu seri monitöre yazdırır.
Grafik gösterimi seri plotter kullanılarak kullanılabilir (Araçlar> Seri Plotter menüsü)
Bir potansiyometrenin orta pimini A0 pimine, dış pimleri + 3.3V ve toprağa takın.
Tel atlama teli ile pim 0 ve pim 1'i kısa devre yapın

20 Haz 2016 tarihinde oluşturuldu
tarafından
Arturo Guadalupi <a.guadalupi@arduino.cc>

Bu örnek kod kamu malıdır.
* /


#include <Arduino.h>
#include "wiring_private.h"

Uart mySerial ( & sercom3 , 0 , 1 , SERCOM_RX_PAD_1 , UART_TX_PAD_0 ) ; // 0 ve 1 pinlerine atayan yeni UART örneğini oluşturun

// sıfırlama düğmesine bastığınızda kurulum yordamı bir kez çalışır:
void setup ( ) {
// seri iletişimi saniyede 9600 bit hızında başlat:
Seri . başlar ( 9600 ) ;
mySerial. başlar ( 9600 ) ;

pinPeripheral ( 0 , PIO_SERCOM ) ; // 0 pinine RX fonksiyonu atayın
pinPeripheral ( 1 , PIO_SERCOM ) ; // Pin 1'e TX fonksiyonu atayın
}

// döngü rutini sonsuza kadar tekrar tekrar çalışır:
void loop ( ) {
// analog pim 0'daki girişi okuyun:
int sensorValue = analogOkuma ( A0 ) ;
// loopback'te mySerial kabloluda okuduğunuz değeri yazdırın:
mySerial. yazma ( sensorValue ) ;
while ( mySerial. available ( ) ) {
Seri . print ( mySerial. read ( ) ) ;
}
Seri . println ( ) ;
gecikme ( 1 ) ; // kararlılık okumaları arasında gecikme
}

// Kesme işleyicisini SERCOM'a takın
geçersiz SERCOM3_Handler ( )
{
mySerial. IrqHandler ( ) ;
}

Wire için yaptığımız gibi, iki talimat

pinPeripheral ( 0 , PIO_SERCOM ) ; // 0 pinine RX fonksiyonu atayın
pinPeripheral ( 1 , PIO_SERCOM ) ; // Pin 1'e TX fonksiyonu atayın

bu anakart için standart Arduino pin atamasını geçersiz kılmak (dijital I / O) ve SERCOM'un bunları sürmesine izin vermek için yerleştirilmelidir.

Geri arama

geçersiz SERCOM3_Handler ( )
{
mySerial. IrqHandler ( ) ;
}

Bunun yerine, Seri kitaplık kesmelere de bağlı olduğundan gerçek Seri iletişime izin vermek için kullanılır.