课程表

Arduino 基础

Arduino 函数库

Arduino 进阶

Arduino 项目

Arduino 传感器

Arduino 电机控制

Arduino 声音

工具箱
速查手册

Arduino 串行外设接口

当前位置:免费教程 » 程序设计 » Arduino

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

板的SPI引脚

SPI使用以下四根导线 -

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

  • MOSI - 这是主器件驱动的主输出/从器件输入。

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

  • SS - 这是从机选择线。

使用以下功能。 必须包括SPI.h.

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

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

  • 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) : pin 10
  • (MOSI) : pin 11
  • (MISO) : pin 12
  • (SCK) : pin 13

地面是常见的。 以下是两个电路板之间的连接的图解表示 -

 

 

两个电路板之间的连接

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

SPI为主

例子

  1. #include <SPI.h>
  2.  
  3. void setup (void) {
  4. Serial.begin(115200); //set baud rate to 115200 for usart
  5. digitalWrite(SS, HIGH); // disable Slave Select
  6. SPI.begin ();
  7. SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
  8. }
  9.  
  10. void loop (void) {
  11. char c;
  12. digitalWrite(SS, LOW); // enable Slave Select
  13. // send test string
  14. for (const char * p = "Hello, world!\r" ; c = *p; p++) {
  15. SPI.transfer (c);
  16. Serial.print(c);
  17. }
  18. digitalWrite(SS, HIGH); // disable Slave Select
  19. delay(2000);
  20. }

SPI为SLAVE

例子

  1. #include <SPI.h>
  2. char buff [50];
  3. volatile byte indx;
  4. volatile boolean process;
  5.  
  6. void setup (void) {
  7. Serial.begin (115200);
  8. pinMode(MISO, OUTPUT); // have to send on master in so it set as output
  9. SPCR |= _BV(SPE); // turn on SPI in slave mode
  10. indx = 0; // buffer empty
  11. process = false;
  12. SPI.attachInterrupt(); // turn on interrupt
  13. }
  14. ISR (SPI_STC_vect) // SPI interrupt routine {
  15. byte c = SPDR; // read byte from SPI Data Register
  16. if (indx < sizeof buff) {
  17. buff [indx++] = c; // save data in the next index in the array buff
  18. if (c == '\r') //check for the end of the word
  19. process = true;
  20. }
  21. }
  22.  
  23. void loop (void) {
  24. if (process) {
  25. process = false; //reset the process
  26. Serial.println (buff); //print the array on serial monitor
  27. indx= 0; //reset button to zero
  28. }
  29. }
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号