本站搬迁,新网址https://via-dean.com即将涵盖更多内容,敬请访问

在Arduino中使用SPI(串行外设接口)

 二维码 22
发表时间:2018-12-25 05:43


在Arduino中使用SPI(串行外设接口)

在Arduino中使用SPI(串行外设接口)

在Arduino中使用SPI学习。 SPI(串行外设接口),建立多个外围设备或微控制器之间的通信。 SPI接口总线在微控制器和小型外设(如移位寄存器,传感器和SD卡)之间交换数据。它使用不同的时钟和数据线以及选择线来选择与哪个设备通信。


通常,有三种不同的数据线,MISO(主输入,从输出)和MOSI(主输出,从输入)。对于器件选择,我们使用SCK作为时钟线和第四个SS(从器件选择)。连接多个设备时,SS引脚将切换设备。现在让我们看看Arduino中的SPI通信是如何工作的。


SPI在Arduino中的不同库函数

SPI.begin()

调用此函数将初始化SCK,MOSI和MISO引脚。对于SS引脚,配置是手动完成的。

SPI.usingInterrupt(中断)

如果程序在中断内执行SPI事务,该函数将使用SPI库注册中断号或名称。这允许beginTransaction()来防止使用冲突。

SPI.beginTransaction(SPISettings(时钟速度,MSBFIRST,SPI_MODE0))

此函数启动SPI总线。 SPI配置为使用时钟,数据顺序和数据模式。

数据顺序可以来自MSBFIRST(最高有效位优先)或LSBFIRST(最低有效位优先)。

数据模式的范围为0到3,它将使用SPI_MODEx(x = 0,1,2,3)进行设置。

时钟速度决定了SPI从设备可以接受的最大速度。

digitalWrite(SSpin,level)

大多数SPI设备定义多个字节的传输。

您需要在传输开始之前写入SS引脚(大多数芯片在传输期间使用LOW)并在最后一个字节后再次写入,以结束传输。请参阅下面的更多SS引脚详细信息

SPI.transfer(data)

调用此函数将从主器件向从器件发送数据字节,同时从从器件到主器件接收一个字节。

在SPI中,传输和接收将同时发生,但通常忽略接收字节。如果需要接收,则发送字节0到255.

SPI.endTransaction()

此函数停止使用SPI总线。

我们将在取消断言芯片选择后调用此函数,并允许其他库使用SPI总线。


电路时间

这是Arduino中SPI通信的电路图。

首先,连接两个Arduino的引脚13(SCK引脚)。

现在,连接两个Arduino的引脚12(MISO引脚)。

然后,连接两个Arduino的引脚11(MOSI引脚)。

另外,连接两个Arduino的引脚10(SS引脚)。

最后,将Arduino板连接到公共地。

代码时间

用于SPI通信的

Master Arduino代码

#include <SPI.h>

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

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


Slave Arduino代码

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

void setup() {
 Serial.begin (115200);
 pinMode(MISO, OUTPUT); // have to sendon master in so it set as output
 SPCR |= _BV(SPE); // turn on SPI inslave mode
 indx = 0; // buffer empty
 process = false;
 SPI.attachInterrupt(); // turn oninterrupt
}

ISR (SPI_STC_vect) {// SPI interrupt routine
 byte c = SPDR; // read byte from SPIData Register
 if (indx < sizeof buff) {
   buff [indx++] = c; // save data inthe next index in the array buff
   if (c == '\r') //check for the end ofthe word
   process = true;
 }
}

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

代码上传到Arduino

现在您可以将上面给出的代码上传到两个Arduino板,它将使用SPI通信传输“Hello World!”。






文章分类: Arduino
分享到:
联系电话:18112932078
微信号:Via_Dean
邮箱:kiyo84001@163.com
会员登录
登录
我的资料
留言
回到顶部