SPI数据传输(库函数方法)
主机端:
/*********************************
代码功能:SPI数据传输(主机端)
引脚说明:
SS/CS:片选(高电平屏蔽,低电平启用)
MOSI :主机送出信号
MISO :主机结收信号
CLK :时钟脉冲
SPI成员:
begin();
功能 :初始化SPI,设置CLK,MISO和SS为输出,将SCK和MOSI拉低,将SS拉高。
形式 :SPI.begin();
返回值:none
setBitOrder();
功能:设 置进入和输出SPI总线比特(bit)的顺序:LSBFIRST(低位开始)或者 MSBFIRST (高位开始)。
形式:SPI.setBitOrder(order);
参数:order:LSBFIRST或 MSBFIRST
返回值:none
setClockDivider();
功能:设置SPI串行通信时钟的分频系数
形式:setClockDivider(SPI_CLOCK);
参数(SPI_CLOCK)
SPI_CLOCK_DIV2 //2分频,系统时钟的 1/2
SPI_CLOCK_DIV4 //4分频,系统时钟的 1/4
SPI_CLOCK_DIV8 //8分频,系统时钟的 1/8
SPI_CLOCK_DIV16 //16分频,系统时钟的 1/16
SPI_CLOCK_DIV32 //32分频,系统时钟的 1/32
SPI_CLOCK_DIV64 //64分频,系统时钟的 1/64
SPI_CLOCK_DIV128 //128分频,系统时钟的 1/128
setDataMode();
功能:设置数据模式
形式:SPI.setDataMode(mode);
参数(mede):
SPI_MODE0 CPOL = 0 CPHA = 0
SPI_MODE1 CPOL = 0 CPHA = 1
SPI_MODE2 CPOL = 1 CPHA = 0
SPI_MODE3 CPOL = 1 CPHA = 1
时钟极性CPOL: 即SPI空闲时,时钟信号SCLK的电平(1:空闲时高电平; 0:空闲时低电平)
时钟相位CPHA: 即SPI在SCLK第几个边沿开始采样(0:第一个边沿开始; 1:第二个边沿开始)
transfer();
功能:在SPI上传输一个字节(byte),发送和接收都是这个函数
形式:SPI.transfer(val);
参数(val):要发送的字节
返回值:从 bus 上读取字节。(读操作使用的时候)
end();
功能:结束传输
形式:end();
参数:无
返回值:无
创作时间:2016*10*10
作者邮箱:jikexianfeng@outlook.com
********************************/
#include<SPI.h> //共用MOSI从机输入线
void setup()
{
Serial.begin(); //串口通信波特率
Serial.println("start ...");
digitalWrite(SS,HIGH); //SS高电平表示从器件未被选中,从器件不工作,MISO输出高阻;
SPI.begin(); //初始化SPI串口
SPI.setClockDivider(SPI_CLOCK_DIV8); //设置SPI的时钟速率为8分频
}
void loop()
{
char c;
digitalWrite(SS,LOW); //启动周边选择
for(const char *p = "Hello world!\n";c = *p;p++) //送出测试的字符
{
SPI.transfer(c); //SPI输出数据
Serial.print(c); //串口输出数据
}
digitalWrite(SS,HIGH); //使从器件不工作
delay();
}
从机端:
/*********************************
代码功能:SPI数据传输(从机端)
创作时间:2016*10*14
作者邮箱:jikexianfeng@outlook.com
********************************/
#include<SPI>
]; //设置缓冲区
volatile byte pos; //定义一个共享的字符
volatile boolean process_it; //定义一个共享的整型
void setup(void)
{
//通信串口设置
Serial.begin(); //设置串口和波特率
Serial.println("start slave");
//SPI总线设置
pinMode(MISO,OUTPUT); //拉高屏蔽主机输出线
SPCR |= _BV(SPE); //打开ISP在从机
SPI.setBitOrder(MSBFIRST); //传输方式高位开始
SPI.setDataMode(SPI_MODE0); //设置SPI数据模式
SPI.setClockDivider(SPI_CLOCK_DIV8); //设置SPI的时钟速率为8分频
//中断使用数据
pos = ;
process_it = false; //假
SPI.attachInterrupt(); //准备好中断
}
//ISR终端服务程序
ISR(SPI_STC_vect)
{
byte c = SPDR; //从SPI寄存器读取数据
if(pos < sizeof(buf)) //判断空间是否使用完
{
buf[pos++] =c;
if(c =='\n')
process_it = true;
}
}
void loop(void)
{
if(process_it) //判读数据是否写入结束
{
String stringOne = String(buf);
Serial.print(stringOne);
buf[pos] = ;
pos = ;
process_it = false;
}
}
SPI数据传输(库函数方法)的更多相关文章
- 进阶之路(基础篇) - 008 SPI数据传输(库函数方法)
主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...
- 通过底层AVR方法实现SPI数据传输
主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...
- 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输
主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- Linux驱动 - SPI驱动 之四 SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- MicroSD卡(TF卡)SPI模式实现方法
现在我们手机的内存卡多为Micro SD卡,又叫TF卡,所以Micro SD卡比SD卡常见.自己曾经也想写写SD卡的读取程序,但又不想特地再去买个SD卡,这时想起手机内存卡不是和SD卡很像吗?在网上查 ...
- STM32建立project库函数方法
(1)打开keilMDK主界面能够看到project中有一个默认的project,点击这个project名字,然后选择菜单Project->Close Project,就关闭掉这个project ...
- C++批量加载动态库函数方法
1.枚举定义enum { // 0 - GigE DLL (implicitly called) Func_isVersionCompliantDLL, Func_isDriver ...
- 嵌入式物联网之SPI接口原理与配置
本实验采用W25Q64芯片 W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb.该25Q系列的器件在灵活性和性能方面远远超过普通的串行闪存器件.W25Q64将8M字节的容量分为 ...
随机推荐
- LeetCode【217. Contains Duplicate】
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- cvMat结构体详解
/* *CvMat矩阵头 */ typedef struct CvMat { int type; //数据类型,比如CV_32FC1含义是32位浮点型单通道,再比如CV_8UC3含义是8位无符号整型三 ...
- 国外程序员整理的 C++ 资源大全(转)
原文:http://www.csdn.net/article/2014-10-24/2822269-c 关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz发起和维护. 内容包括:标准库.W ...
- ps6 安装失败-FATAL: Payload '{3F023875-4A52-4605-9DB6-A88D4A813E8D} Camera Profiles Installer 6.0.98.0' information not found in Media_db.
点击 '错误摘要' Exit Code: 34 -------------------------------------- Summary ----------------------------- ...
- MapReduce 2简介
在Hadoop 1.0版本中,mapred.job.tracker决定了执行MapReduce程序的方式,若设置为local,则使用本地的作业运行器,若设置为主机:端口(eb179:9001),则该配 ...
- javascript 刷新当前页面
编辑器加载中... 1. window.location.replace(window.location.href)
- OpenCV GPU CUDA OpenCL 配置
首先,正确安装OpenCV,并且通过测试. 我理解GPU的环境配置由3个主要步骤构成. 1. 生成关联文件,即makefile或工程文件 2. 编译生成与使用硬件相关的库文件,包括动态.静态库文件. ...
- FCKeditor 2.6.4.1 初始化值不能显示中文问题
最近在学习PHP加入FCKeditor 在线编辑器,发现在初始化Value赋值时,英文可以显示出来,中文怎么都显示不出来,连乱码都不显示. 经过漫长的探索,终于找到原因了! 在fckeditor目录下 ...
- 异常Throwable类
所有异常类型都是Throwable类的子类,它派生出两个子类 Error和Exception Error类:表示紧靠程序本身无法恢复的严重错误,如内存溢出,动态链接失败,虚拟机错误 ...
- Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)
sqoop2-1.99.4和sqoop2-1.99.3版本操作略有不同:新版本中使用link代替了老版本的connection,其他使用类似. sqoop2-1.99.4环境搭建参见:Sqoop2环境 ...