为SAMD板添加更多的SERCOM端口

贡献者: M短路
受欢迎的 最喜欢的 0

介绍

SERCOM(串行通信)是SAMD21上使用的多路复用串行配置,SAMD51和其他板。它允许您为大多数管脚选择各种串行功能。例如,在一对引脚上有UART (RX/TX)的ATmega328,我2C (SDA/SCL)另一组,和SPI(MOSI)味噌,在另一组上。SAMD21有5个不同的内部端口,您可以将它们配置为使用UART的任何组合,我2C和SPI。SAMD21和SAMD51板越来越受欢迎,部分原因是由于这个特性。但你是怎么做到的?

所需材料

为了跟随本教程,你需要以下材料。你可能并不需要所有的东西,这取决于你拥有什么。把它加入你的购物车,通读指南,并根据需要调整推车。

基于ARM的微控制器

在本教程中,我们将使用RedBoard Turbo,但是您应该能够很好地使用下面的任何SAMD21板(或者下面没有列出的任何板)。

必威娱乐登录平台SparkFun SAMD21迷你突破

必威娱乐登录平台SparkFun SAMD21迷你突破

DEV-13664
20.95美元
十五
必威娱乐登录平台SparkFun RedBoard Turbo - SAMD21开发板

必威娱乐登录平台SparkFun RedBoard Turbo - SAMD21开发板

DEV-14812
24.95美元
必威娱乐登录平台Sparkfun Pro射频-洛拉,915 mhz(SAMD21)

必威娱乐登录平台Sparkfun Pro射频-洛拉,915 mhz(SAMD21)

WRL 14916
29.95美元
必威娱乐登录平台SparkFun SAMD21开发突破

必威娱乐登录平台SparkFun SAMD21开发突破

DEV-13672
25.95美元
6

串行设备和原型硬件

您还需要一个串行设备。我们还将使用16x2系列液晶显示屏对于我们的示例,因为它将通过UART接受命令,SPI或I2C。您还需要一种方法将板连接到屏幕,但这是唯一需要遵循的组件。

分离收割台-直

分离收割台-直

PRT-0116
1.50美元
二十
USB micro-B电缆- 6英尺

USB micro-B电缆- 6英尺

CAB-10215
4.95美元
12
女头

女头

PRT-0115
1.50美元
必威娱乐登录平台sparkfun 16x2 serlcd-黑色,RGB 3.3V

必威娱乐登录平台sparkfun 16x2 serlcd-黑色,RGB 3.3V

lcd - 14072
19.95美元
跳线高级6

跳线保费6"米/米包10

PRT-08431
3.95美元
2
面包板-迷你模块化(红色)

面包板-迷你模块化(红色)

PRT-120
3.95美元

工具

根据您的设置,你可能需要一个烙铁,焊接,一般焊接配件对于无头板。

烙铁- 60W(温度可调)

烙铁- 60W(温度可调)

托尔- 14456
12.95美元
无铅焊锡-15克管

无铅焊锡-15克管

TL—09163
3.50美元
2

建议阅读

如果您不熟悉以下概念,我们建议在继续之前查看这些教程。

SAMD21 mini/dev分接头连接指南

介绍Atmel ATSAMD21G18微处理器和我们的Mini和Pro R3分接板。使用强大的ARM Cortex M0+处理器提升你的arduino技能。

基于avr的串行支持lcd连接指南

基于avr的支持串行的lcd是一个简单且成本有效的解决方案,可以包含在您的项目中。必威娱乐登录平台这些屏幕基于HD44780控制器,并包括与Arduino兼容的引导加载程序的ATmega328P。它们通过串行接收控制命令,I2C和SPI。在本教程中,我们将展示一个简单设置的示例,并介绍每个通信选项。

红板涡轮连接指南

Redboard Turbo简介。使用强大的SAMD21 Arm Cortex M0+处理器提升您的Arduino技能!

A看黑板上的涡轮

每当一个新的板被添加到Arduino IDE,它都带有几个变体文件(变体H变量CPP)这些文件定义了用于什么的管脚。它们定义了D0映射到哪里,在哪里建筑学硕士去,哪些pin被分配给UART,我2C等。几乎任何你遇到的SAMD21或SAMD51板都应该至少有1个UART,我2C和SPI端口定义在他们的变种文件。通常使用它们是最简单的。但偶尔您会希望添加另一个端口。例如,你有一个加速度计,你想用它来测量两个不同平台上的振动。但是加速度计只有一个可用的I2C地址。你可以用一个i2C多路复用器,你也可以加上一秒我2C端口连接到板。

让我们来看看Redboard Turbo。正如你所看到的,有一个I2C端口在右上角断开。下面是一个SPI端口。虽然它没有被标记,但是变体文件确实将这些定义为SPI引脚,这些引脚在Arduino板上的这个位置很常见(这是原始板放置SPI端口的位置)。在底部,你也会看到UART被打破,而大头针被标记为TX和RX。最后,您将看到通常称为遗留ISP头的内容。原来,这个SPI端口被绑定到板的一侧(atmega板只有1个SPI端口),并被用来将引导装载程序编程到板上。因为很多防护罩都使用这个作为主SPI端口,所以这个也被破坏了,但在Redboard Turbo上,SPI端口与侧面的SPI端口不同。

Redboard涡轮与所有串行引脚突出显示

现在让我们仔细看看SAMD21,并开始定义一些术语。

  • 系列--串行通信意味着一次发送一个项目或一个位。这与并行方式不同,即在不同的行上同时发送多个项目。UARTSPI而我2C是所有类型的串行通信。
  • UART(通用异步收发机)--这就是通常所说的串行,即使它只是一种类型的串行。对于TX(传输)和RX(接收)线路,此通信协议没有时钟线路。还要记住一个设备发送的是另一个设备接收的所以你要连接你的TX到RX RX到TX。
    • RX——接收UART通信线路。
    • 德克萨斯州--UART通信的传输线。
  • 串行外围接口——该串行总线具有主数据发送行和从数据接收行(MOSI),一个供奴隶发送,一个供主人接收(味噌),一个时钟(SCK)。CS线用于选择要与哪个板通信。换言之,公共汽车将有3 +N电线。当选择从机的CS线时,它知道主人想和它说话。因为这只是一个选择行,它可能包含在硬件串行接口中,也可能不包含在硬件串行接口中。
    • 莫西人--大师出局了,SPI总线中的从属设备。
    • 味噌--大师在,从SPI总线的出线。
    • SCK--SPI总线的时钟线。
    • 反恐精英--SPI总线的电缆选择线。也,称为从选择(SS)。
  • 2C(I2C实现的,内部集成电路)--这是一个2线串行接口,使用时钟和数据线传递信息。总线上的每个设备都有一个不同的地址,主机将在通信期间指定该地址。我2C总线要求上拉电阻器在这两条线上。最耀眼的我必威娱乐登录平台2C板内置了上拉电阻和一个焊锡跨接器来禁用它们。
    • SDA这是I的数据线2C总线。
    • SCL--这是一个I的时钟线2C总线。
  • SERCOM(串行通信)--这是SAMD21板上串行通信端口的名称。因为SAMD21的管脚多路复用,芯片上的每个管脚都有多种功能。因此,每个SERCOM端口可以使用不同的引脚。
  • 端口
    • 塞尔科姆港——SAMD21有6个串行通信模块,可以通过多种方式配置。端口或模块指其中一个。这给了我们6种不同的交流方式。大多数SAMD21板使用其中的4-5个为您提供1个SPI,UART而我2C总线,通常使用1或2个以上的第二次SPI,和/或连接到板上的另一个芯片,如板载闪存或WiFi模块。
    • --每个SERCOM端口将有4个PAD(0-4)。为了确定如何使用SERCOM端口,我们需要弄清楚哪个销在端口的哪个焊盘上。有很多种写法,例如,SERCOM 1上的PAD 0可以写为SERCOM1/PAD[0],SERCOM1.0,甚至,1:0。
    • SAMD21端口--虽然Arduino给所有可用的管脚命名(通常基于它们的配置),但芯片制造商并没有以这种方式分配管脚编号。相反,每个管脚都有一个端口名。对于SAMD21,端口名将有一个字母(A或B)和一个数字,如下所示:porta10,波特08。通常是为了腾出空间,端口将被缩写为字母“P”名称将像这样:PB08,等。
  • **宏**--这是代码中的预定义值。通常由#定义命令。在查看董事会定义时,您将看到许多在其他地方定义了定义的宏。定义并没有那么重要,理解宏所填充的内容。例如,宏皮尼韦雷斯达用于定义在导线上用于sda的管脚(i2C)接口。
  • 多路复用(简称mux)--这是将许多冲突属性分配给一个项目并能够选择所需属性的实践。在这种情况下,SAMD21芯片上的每个管脚都由模拟输入分配了许多功能,数字输入,计时器,到各种Sercom端口。当我们设置SERCOM端口时,我们需要花一些时间在我们的MUX中选择正确的功能。
  • Qwiic-qwiic是spar必威娱乐登录平台kfun的i2C接口。了解了,量子阱国际集成电路!这个端口连接到板I2C端口以及提供电源(3.3V)。你会在相当多的板上看到它,包括红板涡轮。这是硬连接到板的sda和scl引脚,所以您不能更改它。

数据表-SAMD21

图形数据表

设置SERCOM端口的部分技巧是确定哪些引脚一起使用。你不能随便给他们分配任务。的必威娱乐登录平台Sparkfun图形数据表做好总结工作。我们将首先查看Redboard Turbo并检查其图形数据表和SAMD21数据表。

红菱涡轮增压器

点击图片查看完整版本。

Spar必威娱乐登录平台kFun图形数据表非常适合为您提供一个快速的单页概述板的功能。上面是Redboard Turbo图形数据表的简化版本。单击它,您将得到一个完整的版本,其中列出了所有SERCOM端口。你可以看到涡轮有1x串口,1X I2C端口(也连接到QWIIC连接器)和2X SPI端口(D10,D11,D12,D13,以及传统的ISCP头)。

SAMD21数据表

看着SAMD21数据表(第21页)在下面I/O多路复用及注意事项,我们可以开始看到每个管脚可以拥有的所有选项。我们可以为每个pin选择任何列。明确地,我们在看C列和D列。也,值得注意的是,Redboard Turbo上的芯片是SAMD21G18。正如您所看到的,还有其他的SAMD21芯片变种有或多或少的管脚。“G我们想要的就是这个版本。正如你所看到的,许多引脚有一个或两个SERCOM端口可用。

SAMD数据表快照

单击“图像”查看完整的数据表。

但是哪个引脚对应于哪里呢?

虽然你可以检查原理图/板文件,看看什么针在芯片上的去向,最好的选择可能是变量CPP为你的董事会归档。让我们看看这个为RedBoard Turbo定义的文件.文件以一个相当大的注释开始。这是一个很好的参考,请记住,人们可能会选择不为他们的董事会更新评论。在评论中,您应该看到管脚描述。在Redboard Turbo上,插脚定义分为几个部分,以便于阅读。第一部分是D0-D13,与作为UART插脚的D0和D1一起启动。您将注意到,第一个参数列出端口和端口上的pin。最后的注释还告诉您正在使用什么SERCOM端口。如果我们滚动找到使用SERCOM管脚的管脚,我们将找到以下内容。

语言:C//0..13-数字管脚///——————————————————————/0/1-sercom/uart(serial1)porta,11日,皮奥塞尔科姆(PIN_ATTR_DIGITAL),No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_11,// RX: SERCOM0/PAD[3]{PORTA,10日,皮奥塞尔科姆(PIN_ATTR_DIGITAL),No_ADC_Channel,NOT_ON_PWM,Nothon定时器,EXTERNAL_INT_10},//tx:sercom0/pad[2]//20..21 I2c插脚(sda/scl和edbg:sda/scl)//----------------------门户,22,皮奥塞尔科姆PIN_ATTR_DIGITAL,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_6,//sda:sercom3/pad[0]门户,23,皮奥塞尔科姆PIN_ATTR_DIGITAL,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,EXTERNAL_INT_7},//scl:sercom3/pad[1]//22..24-SPI管脚(icsp:miso,sck,mosi)/------------------门户,12日,PIO_SERCOM_ALT,PIN_ATTR_DIGITAL,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,EXTERNAL_INT_12},//味噌:SERCOM4/PAD[0]{PORTB,10日,PIO_SERCOM_ALT,PIN_ATTR_DIGITAL,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,EXTERNAL_INT_10},// MOSI: SERCOM4/PAD[2]{PORTB,11日,PIO_SERCOM_ALT,PIN_ATTR_DIGITAL,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_11,// SCK: SERCOM4/PAD[3]// 30..41 - Extra Pins// ----------------------// 30/31 - Extra UART{ PORTB,22,PIO_SERCOM_ALT,PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,// 30/TX: SERCOM5/PAD[2]{PORTB,23,PIO_SERCOM_ALT,PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,// 31/RX: SERCOM5/PAD[3]// 32/33 I2C (SDA/SCL和EDBG:SDA/SCL){PORTA,22,皮奥塞尔科姆PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,//sda:sercom3/pad[0]门户,23,皮奥塞尔科姆PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,// SCL: SERCOM3/PAD[1]// 34..37 - EDBG/SPI{ PORTA,19,皮奥塞尔科姆PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,// D12/MISO: SERCOM1/PAD[3]{PORTA,16日,皮奥塞尔科姆PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,// D11/MOSI: SERCOM1/PAD[0]{PORTA,18,皮奥塞尔科姆PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,//d10/ss:sercom1/pad[2]门户,17,皮奥塞尔科姆PIN_ATTR_NONE,No_ADC_Channel,NOT_ON_PWM,Nothon定时器,外部_int_none,//d13/sck:sercom1/pad[1]

根据代码,我们似乎在使用sercom 0,1,3.4,和5。我们使用的任何额外端口都必须使用尚未使用的SERCOM端口或重用一个已使用的端口。也,请记住,通常未使用的端口不会被删除。例如,此文件将d30和d31列为额外的串行UART端口。但是,该板没有突破D30和D31(但SAMD21开发板做了),所以SERCOM5实际上也是免费的。

添加SERCOM端口的步骤

注:这个示例假设您在桌面上使用最新版本的Arduino IDE。如果这是你第一次使用Arduino,请回顾我们的教程 安装Arduino IDE。如果您以前没有安装过Arduino库,请查看我们的 安装指南。

对于我们要添加的每种类型的端口,我们基本上都要遵循4个步骤。所有类型的步骤都是一样的,但是它们的实现方式有点不同。因为图表和数据表用于每种类型,它们列在文档的结尾.确保有一个额外的窗口打开时,引用引脚。

1.) Figure out which pins to use.
2.)添加代码。
3.) Update the pin definitions based on the pin mux.
4.)把它们放在一起。

添加UART

1.)找出要使用的销。

我们先来看看谢尔康文件在Arduino的samd21核心文件中。明确地,我们在看第73-86行。您应该看到下面列出的代码。但这意味着什么?有两部分,第一部分定义了可以为RX pad使用哪些pad。看起来你可以用护垫0,,2,和这是所有的。下一步,它定义了可以为TX使用哪些pad。看起来你只能用垫子02.所以,当我们选择管脚时,我们需要记住这一点。

语言:ctypedef enum_sercom_rx_pad_0=0,SERCOM_RX_PAD_1,SERCOM_RX_PAD_2,类型定义枚举{UART_TX_PAD_0 = 0x0ul,//仅适用于UART UART U TX U PAD U 2=0x1升,//仅对于UART UART_TX_RTS_CTS_PAD_0_2_3 = 0x2ul,//只适用于在PAD0上有TX的UART,PAD2上的RTS和PAD3 SERCOMUARTXPAD上的CTS;

因为我遇到的所有板子都没有用SERCOM 2,我们将用它来做例子。让我们从Tx开始,因为与Rx相比,这些管脚是有限的。我们需要找到2:0或2:2上的针。看看我们的图表,你可以看到这些大头针被标记为味噌,D4,D2,和D1/TX。由于味噌和D1/TX已经在使用,这意味着我们可以使用d2或d4。我们用D2,看看能不能把新的串口放在原来的串口旁边。这意味着RX应该在D3上。看起来D3在2:1上,所以可以。

2.) Add Your Code.

下一步,我们来看看需要什么代码。让我们看看变量CPP文件再一次。靠近底部,您将看到以下几行。这就是我们试图在代码中复制的内容。的变体H文件定义了所有的宏,但是他们的名字给了我们一个很好的主意应该去那里。

语言:cUart Serial1(&sercom0PixSerial1Rx,PixSerial1Tx,PADYSerial1RX,Uart串行(&sercom5,PIN_SERIAL_RX,PixSerialTx,帕德西亚尔void SERCOM5_Handler(){Serial.IrqHandler();} void SERCOM5_Handler(){Serial.IrqHandler();

让我们从定义开始。我们选一个名字。”我的系列听起来不错。我们也知道我们将使用Sercom 2,RX将在D3上,在D2上,而d3使用了pad 1,D2用的是pad 2。所以我们将在代码中添加以下内容。

语言:cuart myserial(&sercom2,3.2,SERCOM_RX_PAD_1,UART_TX_PAD_2);空白SERCOM2_Handler(){ mySerial.IrqHandler();}

3.)根据管脚MUX更新管脚定义。

下一步,我们需要设置mux。现在,d2和d3被定义为通用I/O引脚。我们希望它们充当SERCOM管脚。我们需要做的第一件事是添加pin外围库。然后我们使用品周设置pin定义的命令。

语言:c包括“wiring_private.h”//pinperipheral()函数pinperipheral(2,PIO_SERCOM);针尖(3,pio-sercom-alt);

你会注意到有人使用了这个论点PIO_SERCOM而另一个PIO_SERCOM_ALT.如果你看数据表,您会注意到,管脚可以在sercom或sercom-alt下列出一个sercom端口。对于D2,我们正在SERCOM列中使用SERCOM端口。对于D3,我们正在SERCOM- alt列中使用SERCOM端口。

4.)把它们放在一起。

步骤4是运行代码,测试,和故障排除。对于这个示例,我们将抓取一个串行LCD屏幕并将其连接到我们的新串行UART端口。确保你有焊接如果尚未打开,则显示液晶屏的标题。

SAMD21 SERCOM UART到SerLCD的电路图

下一步是使用下面列出的代码测试UART端口。这段代码非常简单,它向您展示了所有新代码的去向。复制并粘贴代码到您的Arduino IDE中。选择你的棋盘,com端口,然后点击上传。

language:c/********************************************************************* * Sample code for setting up additional Serial ports on a SamD21 board * In this example the Redboard Turbo is used with the 16x2 SerLCD display * For more information on the SerLCD code check out the github repo * https://github.com/必威娱乐登录平台sparkfun/OpenLCD * //www.psybik.com/products/14812 * //www.psybik.com/products/14072 * By: Michelle Shorter - SparkFun Electronics * License: This code is public domain but you buy me a burger * if you use this and we meet someday (Beefware license).*********************************************************************/#include "wiring_private.h" // pinPeripheral() function//D2-TX,D3-RXUart mySerial (&sercom23.2,SERCOM_RX_PAD_1,uart_tx_pad_2);void sercom2_handler()myserial.irqhandler();int i=0;void setup()//将设置代码放在此处,运行一次:myserial.begin(9600);针尖(2,PIO_SERCOM);针尖(3,pio-sercom-alt);mySerial.write('|');//Setting character  mySerial.write('-');//Clear display  mySerial.write('|');//Put LCD into setting mode  mySerial.write(158 + 0);//Set green backlight amount to 0%  mySerial.write('|');//Put LCD into setting mode  mySerial.write(188 + 0);//Set blue backlight amount to 0%  mySerial.write('|');//Put LCD into setting mode  mySerial.write(128 + 29);//将白/红背光量设置为51%(100%=+29)myserial.print(“welcome”);delay(1000);void loop()//将主代码放在这里,重复运行:myserial.write(“”);//设置字符myserial.write(“-”);//清除显示myserial.print(“counting”);myserial.print(一);I++;延迟(1000);

添加一个SPI

1.)找出要使用的销。

我们先来看看谢尔康文件在Arduino的samd21核心文件中。具体来说,我们看第73-79行(是,我们在添加UART)和102-108行时查看了这些。您应该看到下面列出的代码。但这意味着什么?有两部分,第一部分定义了可以为RX (MISO) pad使用哪些pad。看起来你可以用护垫0,,2,和这是所有的。下一步,它定义了可用于Tx的焊盘(mosi,和SCK)以及在什么配置中。所以,当我们选择管脚时,我们需要记住这一点。

语言:ctypedef enum_sercom_rx_pad_0=0,SERCOM_RX_PAD_1,SERCOM_RX_PAD_2,sercom_rx_pad_3 sercom rx pad;/…typedef enum_spi_pad_0_sck_1=0,SPI_PAD_2_SCK_3,SPI_PAD_3_SCK_1,SPI-PAD U 0 U SCK U 3 Sercomspitxpad;

因为我遇到的所有板子都没有使用SERCOM 2来做任何事情我们将在我们的例子中使用它。让我们从输出开始,因为这些引脚与味噌引脚相比是有限的。看来SCK只能在PAD上,Mosi可以在0,2,或取决于配置。所以,看着我们的桌子,让我们从移除那些没有在我们的电路板上断开或已经在使用的插脚开始。除去了味噌,D38D1/TX,和D0/RX,保留使用D4,D3,D2,和D5。任何一个看起来都是不错的选择,让我们用D3来表示味噌,D5 SCK,和D4的莫西。再一次,我们需要深入研究我们的花哨图表,找出在哪里。

2.) Add Your Code.

接下来,我们来看看需要什么代码。让我们看看SPI.cpp再次归档。在第261行的底部附近,您将看到下面一行。这就是我们试图在代码中复制的内容。的变体H文件定义了所有的宏,但是他们的名字给了我们一个很好的主意应该去那里。

语言:C SPICLASS SPI(&periph_SPI,PIN_SPI_MISO,松针PIN_SPI_MOSI,蒲公英PAD_SPI_RX);

让我们从定义开始。我们选一个名字。”SPI2听起来不错。我们也知道我们将使用Sercom 2,我们用D3表示味噌,D5 SCK,和D4的莫西。所以,我们将在代码中添加以下内容。

语言:cSPIClass SPI2 (&sercom23.5,4,SPI-PAD-0-SCK-3,Sercom_rx_pad_1);

3.)根据管脚MUX更新管脚定义。

下一步,我们需要设置mux。现在,管脚定义为通用I/O管脚。我们希望它们充当SERCOM管脚。我们需要做的第一件事是添加pin外围库。然后我们使用品周命令来设置pin定义。

语言:c include“wiring_private.h”//pinperipheral()函数pi2.begin();pinperipheral(3,pio-sercom-alt);精确定位(4,精确的(5,PIO_SERCOM);

你会注意到有人使用了这个论点皮奥塞罗姆以及其他PIO_SERCOM_ALT.如果你看数据表,您会注意到,管脚可以在sercom或sercom-alt下列出一个sercom端口。D5、我们正在SERCOM列中使用SERCOM端口。对于D3和D4,我们正在SERCOM- alt列中使用SERCOM端口。

4.)把它们放在一起。

步骤4是运行代码,测试,和故障排除。对于这个示例,我们将抓取一个串行LCD屏幕,并将其连接到我们的新SPI端口。确保你有焊接如果尚未打开,则显示液晶屏的标题。

SAMD21 SERCOM SPI至SERCLCD电路图

下一步是使用下面列出的代码测试SPI端口。这段代码非常简单,它向您展示了所有新代码的去向。该代码还包括一个pin定义CSPIN.复制并粘贴代码到您的Arduino IDE中。选择你的棋盘,com端口,然后点击上传。

语言:C/****************************************************************************在SAMD21板上设置附加串行端口的示例代码在本示例中,Redboard turbo与16x2 serlcd显示器一起使用。有关serlcd代码的详细信息,请参阅github repo https://github.com/sparkfun/openlcd https://www.spa。RKfun.com/products/14812 //www.psybik.com/products/14072 by:Michelle Shorter-Spar必威娱乐登录平台kfun Electronics许可证:此代码是公共域,但如果您使用此代码,我们会在某一天见面(Beefware许可证),那么您会给我买一个汉堡。
           
            #包括“wiring_private.h”//pinperipheral()函数define cspin 6 define time 25//d3-miso,D4-MOSId5 sckspiclass spi2(&sercom2,3.5,4,SPI-PAD-0-SCK-3,Sercom_rx_pad_1);int i=0;void setup()//将设置代码放在此处,运行一次://get all pins and spi ports setup spi2.begin();针尖(3,pio-sercom-alt);pinPeripheral (4pio-sercom-alt);pinPeripheral(5PIO_SERCOM);输入模式输出);数字写入(cspin,高);//确保启动spi2.setClockDivider(spi_clock_div128)的高度;//放慢主机速度//复位屏幕,设置背光,等。数字写入(cspin,low);//发送spi2.transfer(“”);//设置字符spi2.transfer(“-”);//清除显示spi2.transfer(“”);//将LCD置于设置模式spi2.transfer(158+0);//Set green backlight amount to 0%  SPI2.transfer('|');//Put LCD into setting mode  SPI2.transfer(188 + 10);//将蓝色背光量设置为0%spi2.transfer(“”);//将LCD置于设置模式spi2.transfer(128+5);//设置白/红背光达(15=51% 100%=+29)延时(时间);数字写入(cspin,//发送延迟(1000)后取消选择屏幕;//每次设置更改打印输出,此延迟允许在尝试继续之前打印它们//发送欢迎文本char tempstring[50];//需要足够大以容纳整个字符串,最多可包含5位数字sprintf(tempstring,“欢迎”;spiSendString(tempString);void loop(){//把你的主代码放在这里,重复运行://清除屏幕,然后发送计数字符串digitalwrite(cspin,//设置字符SPI2.transfer('-');//清除显示延时(时间);数字写入(cspin,高);//发送char tempstring[50]后取消选择屏幕;//需要足够大,以容纳最多5位sprintf(tempString," count: %d ",i);spiSendString(tempString);I++;delay(1000 time);//通过spivoid spisendstring(char*data)digitalwrite(cspin,低);//驱动cs pin low选择openLCD(字节x=0;数据[X]!=‘0’;x++)//发送字符,直到到达字符串spi2.transfer的末尾(data[x]);数字写入(cspin,高);//松开CS销取消选择openLCD
           

添加一个I2C

1.)找出要使用的销。

为I挑选引脚2C比较容易。SDA总是在Pad 0上。SCL总是在Pad 1上。就是这样。在这种情况下,当我们看图表时,我们可以立即排除miso和d38,因为这些别针被使用或没有断开。这意味着d4将是sda,d3将是scl。

2.) Add Your Code.

下一步,我们来看看需要什么代码。让我们看看CPP文件在Arduino的samd21核心文件中。一直靠近底部285行,您将看到下面一行。这就是我们试图在代码中复制的内容。的变体H文件定义了所有的宏,但是他们的名字给了我们一个很好的主意应该去那里。

语言:CTWOWIRE WIRE(&periph_WIRE,PIN_WIRE_SDA,PIN_WIRE_SCL);

让我们从定义开始。我们选一个名字。“MyWire”听起来不错。我们也知道我们将使用Sercom 2,我们用D4表示SDA用D3表示SCL。所以,我们将在代码中添加以下内容。

语言:ctwowire mywire(&sercom2,4,3);

3.)根据管脚MUX更新管脚定义。

下一步,我们需要设置mux。现在,管脚被定义为通用I/O管脚。我们希望它们充当SERCOM管脚。我们需要做的第一件事是添加pin外围库。然后我们使用品周命令来设置pin定义。

语言:c包括“wiring_private.h”//pinperipheral()函数mywire.begin();pinperipheral(4,pio_sercom_alt);pinperipheral(3,pio_sercom_alt);

您会注意到代码使用了参数PIO_SERCOM_ALT.如果你看数据表,您会注意到,管脚可以在sercom或sercom-alt下列出一个sercom端口。在这种情况下,两个引脚都在SERCOM_ALT列下,但是如果你在SERCOM列下使用一个PIN,使用参数“皮奥塞罗姆”。

4.)把它们放在一起。

步骤4是运行代码,测试,和故障排除。对于这个示例,我们将抓起一个串行液晶显示屏,并将其连接到我们的新i2C端口。确保你有焊接如果尚未打开,则显示液晶屏的标题。

电路图SAMD21 SERCOM I2C至SERCLCD

下一步是用下面列出的代码测试I2c端口。这段代码非常简单,它向您展示了所有新代码的去向。复制并粘贴代码到您的Arduino IDE中。选择你的棋盘,com端口,然后点击上传。

语言:C/****************************************************************************在SAMD21板上设置附加串行端口的示例代码在本示例中,Redboard turbo与16x2 serlcd显示器一起使用。有关serlcd代码的详细信息,请参阅github repo https://github.com/sparkfun/openlcd https://www.spa。RKfun.com/products/14812 //www.psybik.com/products/14072 by:Michelle Shorter-Spar必威娱乐登录平台kfun Electronics许可证:此代码是公共域,但如果您使用此代码,我们会在某一天见面(Beefware许可证),那么您会给我买一个汉堡。
           
            #include "wiring_private.h" // pinPeripheral() function//D4 SDA,D3 SCLTOWIRE MYWIRE(&SERCOM2,4,3);define display_address1 0x72//这是openlcdint i=0;void setup()//将设置代码放在此处,运行一次://get all pins and i2c ports setup mywire.begin();针尖(3,pio-sercom-alt);pinPeripheral (4pio-sercom-alt);/ /重置屏幕,设置背光,等。mywire.beginTransmission(显示地址1);mywire.write(“”);//设置字符mywire.write(“-”);//清除显示mywire.write(“”);//将LCD置于设置模式mywire.write(158+0);//Set green backlight amount to 0%    myWire.write('|');//Put LCD into setting mode  myWire.write(188 + 15);//Set blue backlight amount to 0%  myWire.write('|');//Put LCD into setting mode  myWire.write(128 + 0);//Set white/red backlight amount to (15=51% 100%=+29)  //Send Welcome Text  myWire.print("Welcome ");mywire.endTransmission();void loop(){//把你的主代码放在这里,重复运行://清除屏幕,然后发送计数字符串mywire.beginTransmission(显示地址1);myWire.write('|');//Setting character  myWire.write('-');//Clear display  myWire.print("Counting: ");myWire.print(我);mywire.endTransmission();I++;延迟(1000);
           

有用的图表

我答应给你一些图表。

  • 让我们从SAM21开始数据表.从第21页开始I/O多路复用及注意事项,您将看到所有的管脚定义,包括mux选项。这就是一切的本源。
  • 下一个是图形数据表.虽然这些都可以在任何有一个板的产品页面上找到,这是一个整洁的小集合。

下面是我制作的一些帮助你的图表……

Arduino针在SAMD21上

塞尔康 端口0 端口0 Alt 端口1 端口1 ALT 端口2 端口2 Alt 端口3 端口3 ALT
0 D4 A3 D3 A4 D1 D8 D0 D9
D11 晶体 D13 晶体 D10 SWCLK D12 SWDIO
2 味噌 D4 D38 D3 D2 D1/TX D5 D0/RX
D20开头/ SDA D11/MoSi D21/SCL D13 / SCK 通用串口总线 D10/SS,
D6
通用串口总线 D12 /味噌,
D7
A1,
味噌
A2
D38
莫西人,
D2
SCK,
D4
D20开头/ SDA、
A5
D21/SCL,
RXLED
D6 USB
EDBGTX
D7 USB
埃德布雷克斯

注意:ISP头不单独命名管脚,因此它被称为ISP或板上使用的实际SPI管脚名称。

注意:逗号表示有2个管脚可以使用该端口。斜线表示同一管脚的两个不同名称。

注意:有些插脚直接系在USB端口或晶体上,不能使用。它们被这样标记。

阿杜诺板

我还想知道在不同的Arduino板上打开哪些sercom端口可能会更好。下表列出了为几个开发板分配给串行协议的SERCOM端口。

塞尔科姆港 0 2
串行1 SPI I2C 网络服务提供商 连续在EDBG
MKR1000 I2C SPI WiC1500(SPI) 串行1
SAMD21发展局 串行1 SPI I2C 网络服务提供商 系列
SAMD21迷你板 串行1 SPI I2C
红极板涡轮增压器 串行1 SPI I2C 网络服务提供商 闪光

资源及进一步发展

有关更多信息,查看以下资源:

下一个项目需要一些灵感吗?必威娱乐登录平台查看以下一些相关教程:

SAMD21 mini/dev分接头连接指南

介绍Atmel ATSAMD21G18微处理器和我们的Mini和Pro R3分接板。使用强大的ARM Cortex M0+处理器提升你的arduino技能。

9DOF剃须刀IMU M0连接导轨

如何使用和重新编程9自由度剃须刀IMU M0,ATSAMD21 ARM Cortex-M0微处理器和MPU-9250 9DOF-In-A-Chip的组合。

无线操纵杆连接指南

Sparkfun无线操纵杆套件的连接指南。必威娱乐登录平台

洛拉万与Prorf和物联网

必威手机登陆了解如何为您的下一个远程物联网项目制作一个LoRaWAN节点,并将其与物联网连接到互联网上!必威娱乐登录平台

红板涡轮连接指南

Redboard Turbo简介。使用强大的SAMD21 Arm Cortex M0+处理器提升您的Arduino技能!