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字节的容量分为 ...
随机推荐
- Python paramiko 模块
paramiko模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko # 创建SSH对象 ssh ...
- C#禁止程序重复启动
采用线程互斥锁Mutex,在winform程序的主入口点中加入如下代码,将程序改为单实例运行. static class Program { /// <summary> /// 应用程序的 ...
- JSP页面的隐含对象和Servlet程序里的对象之间的关联和区别
首先,有两个概念: 1.JSP页面的域对象:pageContext,request,session,application对象(四个) void setAttribute(String name,Ob ...
- python---生成随机密码
#简短地生成随机密码,包括大小写字母.数字,可以指定密码长度 from random import choice import string #python3中为string.ascii_letter ...
- 在Label中显示一段文字
Let’s create a new Xamarin.Forms PCL solution, named Greetings, using the same process described abo ...
- 另一种遍历Map的方式: Map.Entry 和 Map.entrySet()
源网址: http://blog.csdn.net/mageshuai/article/details/3523116 今天看Think in java 的GUI这一章的时候,里面的TextArea这 ...
- NBU AIX ORACLE10G RAC恢复到AIX单实例(表空间恢复)
ln -s /usr/openv/netbackup/bin/libobk.a64 /oraclev3/product/10.2.0/lib/libobk.a不建软连接会报如下错误: using ta ...
- loadrunner11遇到的问题汇总及相应的解决方案(持续更新)
1.在此界面点击Run Load Tests提示: "Can not save the license information because access to the registry ...
- 5,SFDC 管理员篇 - 数据模型 - 数据关联
1,PickList 1,填写基本信息 2, 选择能角色的权限 3,在哪一个层上显示(object 上有多个 Record Type 对应多个层,需要选择在哪一个层显示) 4,Save 2,两个P ...
- tp框架 中的时间 查询范围
$where['add_time'] = array(array('egt',$starttime),array('elt',$endtime),'AND');