Arduino 串行外设接口(SPI)

时间有限有其他项目工作在忙,感觉作者写的不错,就先记录下来了。

这几天用SPI——Arduino 在供应商的电子原件上游离游走,重要的是可以读写了, 下面是在查资料看到的一篇不错的文章关于用Arduino 自带的SPI方式通信的,(虽然没用这种方法但感觉不错有时间可以学学。。。。 这几天我都是用什么SPI最底层的编程bit移位,什么汇编语言似的,惨! 所以说在学校的时候一定要好好学啊,别像我现学现用。。。。新项目又来了,继续奋斗。。。。)

参考:https://www.w3cschool.cn/arduino/arduino_serial_peripheral_interface.html

Arduino 串行外设接口

由 drbear 创建,youj 最后一次修改 2016-12-26

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

板的SPI引脚

SPI使用以下四条线:

  • SCK   - 这是由主机驱动的串行时钟。
  • MOSI   - 这是由主机驱动的主输出/从输入。
  • MISO   - 这是由主机驱动的主输入/从输出。
  • SS   - 这是从机选择线。

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

  • SPI.begin()  - 通过将SCK,MOSI和SS设置为输出来初始化SPI总线,将SCK和MOSI拉低,将SS拉高。
  • SPI.setClockDivider(分频器)  - 相对于系统时钟设置SPI时钟分频器。在基于AVR的板上,可用的分频器为2,4,8,16,32,64或128。默认设置为SPI_CLOCK_DIV4,它将SPI时钟设置为系统时钟的四分之一(对于20 MHz的电路板为5 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传输基于同时发送和接收:接收的数据在receivedVal中返回。
  • SPI.beginTransaction(SPISettings(speedMaximum,dataOrder,dataMode))  -  speedMaximum是时钟,dataOrder(MSBFIRST或LSBFIRST),dataMode(SPI_MODE0,SPI_MODE1,SPI_MODE2或SPI_MODE3)。

SPI中有四种操作模式,如下所示:

  • 模式0(默认值) - 时钟通常为低电平(CPOL = 0),数据在从低电平到高电平(前沿)(CPHA = 0)的转换时采样。
  • 模式1   - 时钟通常为低电平(CPOL = 0),数据在从高电平到低电平(后沿)(CPHA = 1)的转换时采样。
  • 模式2   - 时钟通常为高电平(CPOL = 1),数据在从高电平到低电平(前沿)(CPHA = 0)的转换时采样。
  • 模式3   - 时钟通常为高电平(CPOL = 1),数据在从低电平到高电平(后沿)(CPHA = 1)的转换时采样。
  • SPI.attachInterrupt(handler)  - 当从设备从主设备接收数据时调用的函数。

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

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

接地是常见的。以下是两个电路板之间的连接的图示:

让我们看看SPI作为主机和SPI作为从机的例子。

SPI为主机

例子

#include <SPI.h>

void setup (void) {
   Serial.begin(115200); //set baud rate to 115200 for usart
   digitalWrite(SS, HIGH); // disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW); // enable Slave Select
   // send test string
   for (const char * p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH); // disable Slave Select
   delay(2000);
}

SPI为从机

例子

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

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); // have to send on master in so it set as output
   SPCR |= _BV(SPE); // turn on SPI in slave mode
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine {
   byte c = SPDR; // read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == ‘\r‘) //check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false; //reset the process
      Serial.println (buff); //print the array on serial monitor
      indx= 0; //reset button to zero
   }
}

原文地址:https://www.cnblogs.com/MCSFX/p/10820784.html

时间: 2024-11-05 22:48:23

Arduino 串行外设接口(SPI)的相关文章

Arduino 串行外设接口——W3Cschool

来源:https://www.w3cschool.cn/arduino/arduino_serial_peripheral_interface.html Arduino 串行外设接口 由 drbear 创建,youj 最后一次修改 2016-12-26 串行外设接口(SPI)总线是用于串行通信的系统,最多可使用四个导体,通常为三个.一个导体用于数据接收,一个导体用于数据发送,一个导体用于同步,另一个导体用于选择与之通信的设备.它是一个全双工连接,这意味着数据是同时发送和接收的.最大波特率高于I2

FT232RL为接口转换芯片,可以实现USB到串行UART接口的转换

FT232RL为接口转换芯片,可以实现USB到串行UART接口的转换,也可转换到同步.异步Bit-Bang接口模式; FT232RL是深圳市动能世纪科技有限公司从原厂渠道代理经销. 深圳市动能世纪科技有限公司成立于2000年,是一家IC集成电路销售的独立分销商,一直专注于经销世界著名的电子元器件,同时为客户提供被动元器件的配套.公司拥有一支专业且经验丰富的团队,长期关注电子产业的最新动态与价格变化,与全球IC制造原厂.代理商建立了良好的合作关系,与国内著名设计厂商达成合作,授权代理 FT232R

SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可以实现多个SPI设备互相连接.提供SPI串行时钟的SPI

STM32学习笔记——SPI串行通讯(向原子哥学习)

一.SPI  简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在  EEPROM, FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 有 SPI 接口.下面是 SPI 的内部简明图:

串行RapidIO:高性能嵌入式互联技术--【转贴】

串行 RapidIO: 高性能嵌入式互连技术 作者: 德州仪器技术应用工程师 冯华亮/ Brighton Feng/ [email protected] 摘要 串行RapidIO针对高性能嵌入式系统芯片间和板间互连而设计,它将是未来十几年中嵌入式系统互连的最佳选择.本文比较RapidIO和传统互连技术的优点:介绍RapidIO协议架构,包格式,互连拓扑结构以及串行RapidIO物理层规范.介绍串行RapidIO在无线基础设施方面的应用. RapidIO 与传统嵌入互连方式的比较 随着高性能嵌入式

2.RapidIO串行物理层的包与控制符号

转自https://www.cnblogs.com/liujinggang/p/9932150.html 一.RapidIO串行物理层背景介绍 上篇博文提到RapidIO的物理层支持串行物理层与并行物理层两种,由于Xilinx 部分FPGA内部已经集成了串行高速收发器,所以用FPGA实现RapidIO大多都是基于串行物理层的.本文将主要讨论一下RapidIO串行物理层的包格式与控制符号. RapidIO串行物理层,通常称为串行RapidIO,简称为SRIO(Serial-RapidIO). 串行

SPI—读写串行 FLASH

SPI协议简介SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线.它被广泛地使用在 ADC. LCD 等设备与 MCU 间,要求通讯速率较高的场合. ? 标号1处, NSS信号线由高变低,是SPI通讯的起始信号. NSS是每个从机各自独占的信号线,当从机检在自己的NSS线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯.? 在图中的标号6处, NSS信号由低变高,是SPI通讯的停止信号,

?Microchip SPI串行SRAM和NVSRAM器件

Microchip的SRAM和NVSRAM系列(SPI串行SRAM和NVSRAM设备)提供了一种轻松添加外部RAM的方式 特性低功耗CMOS技术:4μA最大待机电流 标准4引脚SPI接口:芯片选择.数据输入.数据输出和时钟 无限写入存储器.零写入时间 提供备用电池(512Kb.1Mb) 32字节页面 高速SDI(2x)和SQI(4x)模式支持,高达80Mb/s 工业温度范围:-40°C至+85°C 小型8引线SOIC.TSSOP和PDIP封装 Microchip的串行SRAM系列提供了一种几乎能

COM口,串行通讯端口,RS-232接口 基础知识

COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连接外置式MODEM进行数据通讯)等.但目前主流的主板一般都只带1个串口,甚至不带,慢慢会被USB 取代. 以前用于连接老式的COM口鼠标键盘,还有链接路由器,外置调制解调器等.现在很少使用. 什么是串口,串行通讯端口?-----------------------------------------