通过底层AVR方法实现SPI数据传输

主机端:

 1 /*********************************
 2 代码功能:通过底层AVR方法实现SPI数据传输(主机端)
 3 创作时间:2016*10*17
 4 使用资源:
 5     更低阶的 aTmega(AVR) 库
 6     SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器)
 7         SPCR(SPI Control Register暂存寄存器)
 8             7bit    SPIE    片选使能,SPIE = 1;片选无效,SPIE = 0片选有效(主机无需片选)(单机通信也无需片选)
 9             6bit    SPE
10             5bit    DORD
11             4bit    MSTR
12             3bit    CPOL    时钟极性,CPOL = 0(时钟空闲为低电平);CPOL = 1(时钟空闲为高电平)
13             2bit    CPHA    相位极性,CPHA = 0(表示第一个边沿);CPHA = 1(表示第二个边沿);都是表示数据采样,数据有效的时刻。
14             1bit    SPR1
15             0bit    SPR0
16
17
18
19
20         SPCR(SPI Status Register 暂存寄存器)
21         SPDR(SPI Control Register数据的暂存器)
22
23 作者邮箱:[email protected]
24 ********************************/
25 #define SCK_PIN 13            //宏定义时钟端口
26 #define MISO_PIN 12            //宏定义主机输出线
27 #define MOSI_PIN 11            //宏定义从机输出线
28 #define SS_PIN 10            //片选
29 boolean SlaveDataFlag;        //数据标志位
30
31 void MasterInit(void)        //初始化SPI引脚设置
32 {
33   pinMode(SCK_PIN,OUTPUT);    //SCK_PIN为输出模式,(主机模式)
34   pinMode(MOSI_PIN,OUTPUT);    //初始化主机输出总线
35   pinMode(MISO_PIN,INPUT);    //初始化从机输出总线
36   pinMode(SS_PIN,OUTPUT);    //初始化片选引脚(主机高电平,从机低电平)
37   //启动SPI
38   SPCR = B00000000;
39   SPCR = (1<<SPE)|(1<<MSTR);
40 }
41
42 byte ReadByte(void)
43 {
44   while(!(SPSR&(1<<SPIF)));
45   return SPDR;
46 }
47
48 void WriteByte(byte value)
49 {
50   SPDR = value;
51   while(!(SPSR&(1<<SPIF)));
52   return ;
53 }
54
55 void setup()
56 {
57   Serial.begin(115200);
58   MasterInit();
59   Serial.println("[email protected]");
60   digitalWrite(SS_PIN,HIGH);
61
62   SlaveDataFlag = true;
63 }
64
65 void loop()
66 {
67   byte rxData;
68   while(true)
69   {
70     if(SlaveDataFlag)
71     {
72       digitalWrite(SS_PIN,LOW);
73       WriteByte(17);
74       Serial.println("Done writing data...");
75       Serial.println("Reading data from slave ...");
76       rxData = ReadByte();
77       digitalWrite(SS_PIN,HIGH);
78       Serial.println("Dome Reading data ...");
79       Serial.print("From Slave :");
80       Serial.println(rxData,DEC);
81       SlaveDataFlag = false;
82     }
83   }
84 }

从机端:

 1 /*********************************
 2 代码功能:通过底层AVR方法实现SPI数据传输(主机端)
 3 创作时间:2016*10*17
 4 使用资源:
 5     更低阶的 aTmega(AVR) 库
 6 作者邮箱:[email protected]
 7 ********************************/
 8 #define SCK_PIN 13
 9 #define MISO_PIN 12
10 #define MOSI_PIN 11
11 #define SS_PIN 10
12
13 void SlaveInit(void)
14 {
15   pinMode(SCK_PIN,INPUT);
16   pinMode(MISO_PIN,INPUT);
17   pinMode(MISO_PIN,OUTPUT);
18   pinMode(SS_PIN,INPUT);
19
20   SPCR = B00000000;
21   SPCR = (1<<SPE);
22 }
23
24 byte ReadByte(void)
25 {
26   while(!(SPSR&(1<<SPIF)));
27   return SPDR;
28 }
29
30 void writeByte(byte value)
31 {
32   SPDR = value;
33   while(!(SPSR&(1<<SPIF)));
34   return ;
35 }
36
37 void setup()
38 {
39   Serial.begin(115200);
40   SlaveInit();
41 }
42
43 void loop()
44 {
45   if(digitalRead(SS_PIN) == LOW)
46   {
47     writeByte(19);
48     byte rxData;
49     rxData = ReadByte();
50     Serial.print("Command :");
51     Serial.println(rxData);
52   }
53 }
时间: 2025-01-03 17:28:32

通过底层AVR方法实现SPI数据传输的相关文章

进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输

主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTmega(AVR) 库 SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器) SPCR(SPI Control Register暂存寄存器) 7bit SPIE 片选使能,SPIE = 1;片选无效,SPIE = 0片选有效(主机无需片选)(单机通信也无需片选) 6b

进阶之路(基础篇) - 008 SPI数据传输(库函数方法)

主机端: 1 /********************************* 2 代码功能:SPI数据传输(主机端) 3 引脚说明: 4 SS/CS:片选(高电平屏蔽,低电平启用) 5 MOSI :主机送出信号 6 MISO :主机结收信号 7 CLK :时钟脉冲 8 SPI成员: 9 begin(); 10 功能 :初始化SPI,设置CLK,MISO和SS为输出,将SCK和MOSI拉低,将SS拉高. 11 形式 :SPI.begin(); 12 返回值:none 13 setBitOrd

EF 底层基础方法

1 using System; 2 using System.Data; 3 using System.Collections.Generic; 4 using System.Data.Entity; 5 using System.Linq; 6 using System.Linq.Expressions; 7 using System.Text; 8 using System.Threading.Tasks; 9 using SchoolDAL.Context; 10 using School

Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返回.而异步方式则正好相反,数据传输的发起者无需等待传输的结束,数据传输期间还可以做其它事情,用代码来解释就是,调用传输的函数后,函数会立刻返回而不用等待数据传输完成,我们只需设置一个回调函数,传输完成后,该回调函数会被调用以通知发起者数据传送已经完成.同步方式简单易用,很适合处理那些少量数据的单次传

jQuery晦涩的底层工具方法们

这里整理的是jQuery源码中一些比较晦涩难懂的.内部的.最底层的工具方法,它们多为jQuery的上层api方法服务,目前包括: jQuery.access jQuery.access: function( elems, fn, key, value, chainable, emptyGet, pass ) 在jQuery的众多api方法中,许多方法都有一个非常重要和常见的特征:重载,简单来讲即参数的不同决定了方法的功能不同 例如我们最常使用的几个:jQuery.fn.val().jQuery.

asp.net底层公共方法

DBHeper: using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace NewsDAL { public static  class DBHeper { private static SqlConnection connection; /// <s

SylixOS NUC970平台SPI总线数据传输

概述 本文档是对NUC970平台上的SylixOS SPI总线数据传输的详细分析. SPI总线数据传输流程 NUC970平台上SPI总线数据传输流程如图 21所示. 当一个消息准备传输时,第一步判断发送和接收缓存区是否为空,若为空,就没有要接收或发送的数据,直接返回. 第二步,判断消息长度是否大于指定的值(可以改变,但要大于16个字节),若大于,以16字节为单位传输数据,否则以单字节为单位传输数据. 图21 SPI数据传输流程图 SPI总线的消息类型 在SylixOS中,SPI总线的消息类型,如

Linux下spi驱动开发

转载至:http://www.embedu.org/Column/Column367.htm 作者:刘洪涛,华清远见嵌入式学院讲师. 一.概述 基于子系统去开发驱动程序已经是linux内核中普遍的做法了.前面写过基于I2C子系 统的驱动开发.本文介绍另外一种常用总线SPI的开发方法.SPI子系统的开发和I2C有很多的相似性,大家可以对比学习.本主题分为两个部分叙述,第一 部分介绍基于SPI子系统开发的理论框架:第二部分以华清远见教学平台FS_S5PC100上的M25P10芯片为例(内核版本2.6

SPI总线

一.SPI总线简介 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口.SPI 用 于CPU与各种外围器件进行全双工.同步串行通讯.它只需四条线就可以完成MCU与各种外围器件的通讯,这四条线是:串行时钟线(CSK).主机输入/从 机输出数据线(MISO).主机输出/从机输入数据线(MOSI).低电平有效从机选择线CS.当SPI工作时,在移位寄存器中的数据逐位从输出引脚 (MOSI)输出(高位在前),同时从输入引脚(