首页 > 其他分享 >无涯教程-Arduino - 外围串口

无涯教程-Arduino - 外围串口

时间:2023-10-19 19:31:51浏览次数:47  
标签:process CLOCK SS void Arduino 无涯 SPI 串口 时钟

串行外围设备接口(SPI)总线是用于串行通信的系统,它最多使用四根导线,通常为三根,一根导线用于数据接收,一根导线用于数据发送,一根导线用于同步,另一根导线用于选择要与之通信的设备,这是全双工连接,这意味着将同时发送和接收数据,最大波特率高于I2C通信系统中的波特率。

Board SPI Pins

SPI使用以下四线-

  • SCK     -   这是主机驱动的串行时钟。

  • MOSI   -   这是由主机驱动的主机输出/从机输入。

  • MISO   -   这是由主机驱动的主机输入/从机输出。

  • SS         -   这是从属选择线。

使用以下函数,您必须包括SPI.h。

  • SPI.begin()                                    -  通过将SCK,MOSI和SS设置为输出,将SCK和MOSI拉低,并将SS拉高来初始化SPI总线。

  • SPI.setClockDivider(divider)    -  相对于系统时钟设置SPI时钟分频器,在基于AVR的板上,可用的分频器为2、4、8、16、32、64或128。默认设置为SPI_CLOCK_DIV4,它将SPI时钟设置为系统时钟频率的四分之一(对于5Mhz,板以20 MHz的频率)。

  • Divider                                           -  可能是(SPI_CLOCK_DIV2,SPI_CLOCK_DIV4,SPI_CLOCK_DIV8,SPI_CLOCK_DIV16,SPI_CLOCK_DIV32,SPI_CLOCK_DIV64,SPI_CLOCK_DIV128)

  • SPI.transfer(val)                          -  SPI传输基于同时发送和接收:接收到的数据在receiveVal中返回。

  • SPI.beginTransaction(SPISettings(speedMaximum,dataOrder,dataMode))    -  speedMaximum是时钟,dataOrder(MSBFIRST或LSBFIRST),dataMode(SPI_MODE0,SPI_MODE1,SPI_MODE2或SPI_MODE3)

我们在SPI中有以下四种操作模式-

  • Mode 0(默认)    -  时钟通常为低电平(CPOL=0),并且在从低到高的跃迁(前沿)(CPHA=0)上采样数据)。

  • Mode 1                -  时钟通常为低(CPOL=0),并且在从高到低(后沿)(CPHA=1)的过渡上对数据进行采样。

  • Mode 2                -  时钟通常为高(CPOL=1),并且在从高到低的跃迁(前沿)(CPHA=0)上采样数据。

  • Mode 3                -  时钟通常为高电平(CPOL=1),并且在从低到高的过渡(后沿)(CPHA=1)上采样数据。

  • SPI.attachInterrupt(handler)    -   从设备从主机接收数据时调用的函数。

现在,我们将两个Arduino UNO板连接在一起,一个作为主设备,另一个作为从设备。

  • (SS)       : pin 10
  • (MOSI) : pin 11
  • (MISO) : pin 12
  • (SCK)   : pin 13

以下是两块板之间连接的示意图-

Connection of Boards

让我们看一下SPI作为主设备和SPI作为从设备的示例。

SPI as MASTER

#include <SPI.h>

void setup (void) {
   Serial.begin(115200); //将 usart 的波特率设置为 115200
   digitalWrite(SS, HIGH); //禁用从选择
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//将时钟除以 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW); //启用从机选择
   //发送测试字符串
   for (const char * p="Hello, Learnfk!\r" ; c=*p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH); //禁用从选择
   delay(2000);
}

SPI as SLAVE

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); //必须发送到主控,所以它设置为输出
   SPCR |= _BV(SPE); //在从模式下打开 SPI
   indx=0; //缓冲区空
   process=false;
   SPI.attachInterrupt(); //开启中断
}
ISR (SPI_STC_vect) //SPI中断程序
   byte c=SPDR; //从 SPI 数据寄存器读取字节
   if (indx < sizeof buff) {
      buff [indx++]=c; //将数据保存在数组缓冲区的下一个索引中
      if (c == '\r') //检查单词的结尾
      process=true;
   }
}

void loop (void) {
   if (process) {
      process=false; //重置进程
      Serial.println (buff); //在串行监视器上打印阵列
      indx= 0; //将按钮重置为零
   }
}

参考链接

https://www.learnfk.com/arduino/arduino-serial-peripheral-interface.html

标签:process,CLOCK,SS,void,Arduino,无涯,SPI,串口,时钟
From: https://blog.51cto.com/u_14033984/7941942

相关文章

  • 无涯教程-Arduino - 集成电路
    集成电路间(I2C)是用于在微控制器和新一代专用集成电路之间进行串行数据交换的系统,当它们之间的距离很短时使用。通过两个导体创建连接。一个用于数据传输,另一个用于同步(时钟信号)。ArduinoI2C我们有两种模式-主代码和从代码-使用I2C连接两个Arduino板。他们是-主发送器/从......
  • 无涯教程-Arduino - 函数声明
    函数允许按代码段构造程序以执行单独的任务,创建函数的典型情况是当一个程序需要在一个程序中多次执行相同的操作时。Arduinosketch或程序中有两个必需的函数,即setup()和loop(),必须在这两个函数的括号之外创建其他函数。定义函数的最常见语法是-函数声明我们可以用两种不同......
  • 无涯教程-Arduino - 程序结构
    在本章中,我们将深入研究Arduino程序的结构,并学习Arduino世界中使用的更多新术语,Arduino软件是开源的,Java环境的源代码在GPL下发布,而C/C++微控制器库在LGPL下。Structure结构Arduino程序可分为三个主要部分:结构,值(变量和常量)和函数,在本教程中,我们将了解Arduino软件程序,以及......
  • 无涯教程-Arduino - 主板描述
    在本章中,我们将学习Arduino板上的不同组件,我们将研究ArduinoUNO板,因为它是Arduino板家族中最受欢迎的板,此外,它是入门电子和编码的最佳板,有些开发板看起来与下面给出的开发板有些不同,但是大多数Arduino在这些组件中大多数都是相同的。电源USBArduino板可使用计算机的USB电缆......
  • 无涯教程-Arduino - 简介
    Arduino是基于易于使用的硬件和软件的开源平台。它由一块可进行编程的电路板(称为微控制器)和一个称为ArduinoIDE(集成开发环境)的现成软件组成,该软件用于将计算机代码编写并上传到物理板上。关键特征是-Arduino板能够读取来自不同传感器的模拟或数字输入信号,并将其转换为输......
  • 修改串口节点名称
    需求:3368的老主板更换为3568的新主板,为了app兼容两款主板,要求串口号一致。有个ttyS0的口,需要对应改为ttySWK0跟踪驱动代码:dw8250_probe(drivers\tty\serial\8250\8250_dw.c)-->serial8250_register_8250_port(drivers\tty\serial\8250\8250_core.c)-......
  • 无涯教程-NumPy - decode()函数
    此函数调用numpy.char.decode()解码给定的字符串。importnumpyasnpa=np.char.encode('hello','cp500')printaprintnp.char.decode(a,'cp500')其输出如下-�����hello参考链接https://www.learnfk.com/numpy/numpy-char-decode.html......
  • 无涯教程-NumPy - join()函数
    此方法返回一个字符串,其中各个字符由指定的分隔符字符连接在一起。importnumpyasnpprintnp.char.join(':','dmy')printnp.char.join([':','-'],['dmy','ymd'])其输出如下-d:m:y['d:m:y''y-m-d']参考链接https://ww......
  • FPGA, arduino, STM32, RaspBerry 树莓派 简介
    https://www.cnblogs.com/zhenghb31/p/15046496.html 市面上控制器这么多,似乎每一个都很厉害…为什么有的控制器编写起来那么难,功能很少,有的简单易学,功能强大呢?各种控制器又有什么区别呢?经过我的思考,我个人把控制器分为三类!第一类:基于逻辑电路的控制器(FPGA)FPGA(FieldPr......
  • 无涯教程-NumPy - center()函数
    此函数返回所需宽度的数组,以使输入字符串居中并在左侧和右侧使用fillchar进行填充。importnumpyasnp#np.char.center(arr,width,fillchar)printnp.char.center('hello',20,fillchar='*')这是它的输出-*******hello********参考链接https://www.learnfk.com/nu......