arduino SPI通信 从机的设置-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3100|回复: 7

[已解决] arduino SPI通信 从机的设置

[复制链接]
发表于 2021-8-2 01:16 | 显示全部楼层 |阅读模式
本帖最后由 yu.chu 于 2021-8-2 09:23 编辑

arduino从机设置的程序为
SPCR |= _BV(SPE); // turn on SPI in slave mode(在从模式下打开SPI
从手册中可以查到,从机设置为控制寄存器的第5位,也就是MSTR位
上面的程序是将0100 0000与SPCR控制寄存器按位相或运算,那么不是只可以保证使能SPI,不能保证MSTR位设置为0
不就没法保证是设置为从机模式吗
希望有大佬可以帮助解答一下
发表于 2021-8-2 08:17 | 显示全部楼层
本帖最后由 frankhan747 于 2021-8-2 08:25 编辑

没错,这一句只是用来启用SPI模块的。真正的主机/从机模式设置是通过其它语句实现的。
  1. SPI.cpp
  2. ...
  3. 第50行:SPCR |= _BV(MSTR);
  4. 第51行:SPCR |= _BV(SPE);
复制代码
把SPI设为主机模式的语句是50行而非51行。如果要设为从机模式则需执行
  1. SPCR &= ~( _BV(MSTR));
复制代码



MSTR是Master(主机)的简写;SPE是SPI enable(启用SPI)的简写
 楼主| 发表于 2021-8-2 09:21 | 显示全部楼层
frankhan747 发表于 2021-8-2 08:17
没错,这一句只是用来启用SPI模块的。真正的主机/从机模式设置是通过其它语句实现的。
把SPI设为主机模式的 ...

好的,非常感谢
 楼主| 发表于 2021-8-2 09:42 | 显示全部楼层
frankhan747 发表于 2021-8-2 08:17
没错,这一句只是用来启用SPI模块的。真正的主机/从机模式设置是通过其它语句实现的。
把SPI设为主机模式的 ...

这是我在网络上找到的一段arduino设置为从机的程序,他只设置了SPE位,而且在多个帖子里面都看到这段代码。就产生了一些怀疑,那这段程序是错误的吗
[code]
 楼主| 发表于 2021-8-2 09:43 | 显示全部楼层
yu.chu 发表于 2021-8-2 09:42
这是我在网络上找到的一段arduino设置为从机的程序,他只设置了SPE位,而且在多个帖子里面都看到这段代码 ...

#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
   }
}
发表于 2021-8-2 10:18 | 显示全部楼层
yu.chu 发表于 2021-8-2 09:42
这是我在网络上找到的一段arduino设置为从机的程序,他只设置了SPE位,而且在多个帖子里面都看到这段代码 ...

我能想到的唯一解释是,
写这段代码的人发现SPCR寄存器的默认值完美契合了SPI从机的功能需求,只需进行启用操作。
于是就不用专门设置Master位了
 楼主| 发表于 2021-8-2 10:24 | 显示全部楼层
本帖最后由 yu.chu 于 2021-8-2 10:29 编辑
frankhan747 发表于 2021-8-2 10:18
我能想到的唯一解释是,
写这段代码的人发现SPCR寄存器的默认值完美契合了SPI从机的功能需求,只需进行启 ...

非常感谢你的耐心解答
还有一个问题就是SPI.h和SPI.c文件在哪里查看啊
我在libraries文件夹里没有找到
但是这个库在我的arduino IDE里是可以添加的
请教有没有其他的途径可以下载到啊
 楼主| 发表于 2021-8-2 15:36 | 显示全部楼层
找到SPI库文件了,在arduino的安装目录下的hardware文件里面
D:\Arduino\hardware\arduino\avr\libraries\SPI\src
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 01:42 , Processed in 0.072380 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表