https://www.cnblogs.com/yangfengwu/p/7520260.html

重点是说SPI通信协议,,,,

不要害怕协议因为协议是人规定的,,刚好我也是人......规定的协议既然能成为规范让所有人所接受,那么必然有它的优势和优点,必然值得学习,,

害怕协议的人是因为当初碰到了不懂的老师,他只会告诉你这很难............其实是他不会........

CS      :   Chip Selection    片选引脚,多个设备时可以用这个引脚选择和哪个设备通信

MOSI  :   Master Out   Slave In   主机输出数据引脚,,,,从机接收数据引脚

MISO :   Master In  Slave Out     主机接收数据引脚....从机输出数据引脚

CLK  :    时钟

还有两个参数----假设有的单片机自带硬件SPI,一定会提供设置下面两个参数,,,当然有的支持SPI通信的芯片也可能涉及这两个参数

CPOL    :表示时钟信号(CLK引脚)在空闲时是高电平还是低电平

CPHA    :表示数据在时钟信号(CLK)的第几个沿开始数据传输

现在假如说

CPOL   = 0  ;//时钟信号(CLK引脚)在空闲时是低电平

CPHA   = 0;//数据在时钟信号(CLK)的第1个沿开始数据传输

通信的时候先传输高位

假如说  主机发给从机   10101010       从机发给主机    01010101

再假如 主机接收数据存到  MasterData 里面

从机接收数据存到  SlaveData 里面

第一个上升沿  主机的0101010 最高位是 1 所以主机会让MOSI引脚输出高电平

从机的1010101最高位是 0  所以从机会让MISO引脚为低电平

第一个下降沿  主机接收MISO引脚的数据,因为是低电平所以 MasterData= 0000 000;

从机接收MOSI引脚的数据,因为是高电平所以从机SlaveData = 0000 0001;

第二个上升沿  主机左移一位  101010X 最高位是 0 所以主机会让MOSI引脚输出低电平

从机左移一位 010101X 最高位是 1  所以从机会让MISO引脚为高电平

第二个下降沿  主机接收MISO引脚的数据,因为是高电平所以 MasterData= 0000 0001;

从机接收MOSI引脚的数据,因为是低电平所以从机SlaveData = 0000 0010;

就这样8个上升和8个下降沿之后

MasterData  = 01010101

SlaveData    =  10101010

现在假如说

CPOL   = 0  ;//时钟信号(CLK引脚)在空闲时是低电平

CPHA   = 1;//数据在时钟信号(CLK)的第2个沿开始数据传输

第一个下降沿  主机的0101010 最高位是 1 所以主机会让MOSI引脚输出高电平

从机的1010101最高位是 0  所以从机会让MISO引脚为低电平

第一个上升沿  (注意是标号为1的那个,,,实际上是第二个上升沿)

主机接收MISO引脚的数据,因为是低电平所以 MasterData= 0000 0000;

从机接收MOSI引脚的数据,因为是高电平所以从机SlaveData = 0000 0001;

第二个下降沿  主机左移一位  101010X 最高位是 0 所以主机会让MOSI引脚输出低电平

从机左移一位 010101X 最高位是 1  所以从机会让MISO引脚为高电平

第二个上升沿  主机接收MISO引脚的数据,因为是高电平所以 MasterData= 0000 0001;

从机接收MOSI引脚的数据,因为是低电平所以从机SlaveData = 0000 0010;

第八个下降沿  主机把最后一位0放在了 MOSI引脚输出低电平

从机把最后一位1放在了 MISO引脚输出高电平

其实现在我也有疑惑,,,这样就完了吗??????只把数据放在引脚上就行了吗????然后内部硬件就自动接收了吗????

看一下摩托罗拉的数据手册

难道最后一位会自动的接收?????搞不懂咧咧.....改天自己测试一下,,,让主机工作在

CPOL   = 0  ;//时钟信号(CLK引脚)在空闲时是低电平

CPHA   = 1;//数据在时钟信号(CLK)的第2个沿开始数据传输

然后让主机发一个字节的数据看看CLK怎样变化的..............然后再尝试手写从机接收....然后知道结果了再来修改这个地方....

其余的两种就不说了

其实说白了就是

CPOL控制在空闲状态下CLK是高电平还是低电平

CPHA控制数据是在第一个沿就开始传输还是在第二个沿

其实呢!!写程序最终还是要看芯片的资料,,,,,

现在看一下ESP8266的SPI

spi.setup(, spi.MASTER, spi.CPOL_HIGH, spi.CPHA_HIGH, , )

用SPI1,主机模式,,空闲状态下Clk为高电平,,第二个沿开始数据传输,8位数据,8分频(10Mhz),默认半双工

发送数据呢就简单了

比如向从机发送0xaa,0x55,0x02,0x01

spi.send(,0xaa,0x55,0x02,0x01)

接收数据呢还另有个函数
假设需要接收4个数据

ReadData = spi.recv(,,0xaa)

其实就是让CLK产生32个脉冲信号,每8个代表一个字节的数据,,后面的0xaa哈,是在产生脉冲信号的时候MOSI引脚发送的数据,,如果不写

默认发0xFF

对了接收到的数据都是以字符串的形式保存在变量里面,,可能会问我怎么自己解析数据呢

假如说判断是不是接收到0xaa 和0x55

aa = spi.recv(1,2,0xaa)

if   aa:byte(1)==0xaa  and  aa:byte(2)==0x55  then

自己的执行函数

end

大家肯定会说你咋知道要这样写

因为有API文档

还有一点,,我一开始看到过别人这样做过,,所以呢我就知道可以这样用....知识这东西一定要活学活用

http://blog.csdn.net/silno/article/details/72866623?locationNum=10&fps=1

最后说一下和STM32进行SPI通信的一些注意,,,当然是把stm32配置成从机模式,,然后呢其余的设置一定要一样

列如我配置的

void Spi2SlaveInit(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );//SPI2时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//CS
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PB13/14/15上拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_14); //PB13/14/15上拉 GPIO_ResetBits(GPIOB,GPIO_Pin_15); //PB13/14/15上拉 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
// SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //如果这里使用硬件模式,从机低电平
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = ;
SPI_Init(SPI2, &SPI_InitStructure); SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE); SPI_Cmd(SPI2 , ENABLE);
}

要注意

CS引脚在模块刚启动的时候一定是低电平............

再说一点,我的32程序用的中断接收的SPI的数据,然后在中断里面准备发送的数据,,大家这样想

主机的数据发过来一个字节数据之后才进的中断,,所以如果想在中断里面发送数据,,应该在进中断之前准备好数据的第一个字节

假设主机需要读四个字节就会进四次中断

我从机发给主机的数据是0xaa 0x55 0x01 0x02

char table[4] = {0xaa, 0x55, 0x01, 0x02}

在主机发送数据之前

我需要   SPI2->DR = table;

Spi2SendBuff = table+1;

void SPI2_IRQHandler(void)
{
if(SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET)
{
SPI2->DR = *Spi2SendBuff;
Spi2ReadBuff[Spi2ReadCnt] = SPI2->DR; Spi2ReadCnt ++;
Spi2SendBuff ++;
}
}

这样的话来第一个中断的时候我的第一个数据0xaa也发向了主机,然后又准备了第二个数据,,,,,,,四次中断就会把数据发给了主机,,注意指针溢出乱指了一下

这篇文章呢主要是会用ESP8266的SPI就行哈......

https://www.cnblogs.com/yangfengwu/p/7524326.html

三,ESP8266 SPI的更多相关文章

  1. 三,ESP8266 SPI(基于Lua脚本语言)

    https://www.cnblogs.com/yangfengwu/p/7520260.html 重点是说SPI通信协议,,,, 不要害怕协议因为协议是人规定的,,刚好我也是人......规定的协议 ...

  2. ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信

        设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信,所以本章的主要内容就是讲解ESP8266 SPI和I2C总线 ...

  3. ESP8266 SPI通信

    设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信 1. SPI总线——SPI类库的使用 SPI是串行外设接口(Seri ...

  4. ZYNQ SGI、PPI、SPI三种中断的实例(含代码)

    ZYNQ中断分为3类: SGI(Software Generated Interrupts)软件中断 PPI(Private Peripheral Interrupts)私有外设中断 SPI(Shar ...

  5. ESP8266开发之旅 网络篇⑯ 无线更新——OTA固件更新

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  6. ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  7. ESP8266开发之旅 基础篇① 走进ESP8266的世界

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. ESP8266开发之旅 基础篇③ ESP8266与Arduino的开发说明

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

随机推荐

  1. iOS上机题(附个人见解)

    ##机试题目如下 用命令行创建一个以CocoaPods管理的项目[Test-你的姓名拼音],新建3个ViewController,完成以下题目 将下面的问题在一个UITabView里面列出所有问题,单 ...

  2. 安徽省2016“京胜杯”程序设计大赛_I_恶魔A+B

    恶魔A+B Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 73 Accepted: 17 Description 相信大家 ...

  3. 开源社群系统ThinkSNS+安装部署演示视频!

    社群系统TS+一期版本发布之后,很多小伙伴们反馈安装部署有些困难,那么今天由我们的颜值与技术实力担当乔斌大佬通过录制视频的形式,给大家演示一下部署的整个过程,录制过程中有些杂音,请各位尽情谅解,后续我 ...

  4. Android开发中EditText的点击Enter键焦点改变处理(获取焦点和失去焦点交互变化)

    最近因为项目需要,需要将EditText的焦点转移到LineraLayout上: 即为EditText输入完毕后,点击回车键或者按压其他嵌入式android设备的OK键,获取LineraLayout的 ...

  5. macvlan 网络隔离和连通 - 每天5分钟玩转 Docker 容器技术(57)

    上一节我们创建了两个 macvlan 并部署了容器,网络结构如下: 本节验证 macvlan 之间的连通性. bbox1 能 ping 通 bbox3,bbox2 能 ping 通 bbox4.即:同 ...

  6. MVC5+EF6 完整教程17--升级到EFCore2.0

    EF Core 2.0上周已经发布了,我们也升级到core 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): ...

  7. Go 程序的性能优化及 pprof 的使用

    Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们 ...

  8. Struts2.5的的环境搭建及跑通流程

    Struts2.5 struts是开源框架.使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间.如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,st ...

  9. C# 实例练习(第二天)

    实例练习 1. 完成简单登录效果,设置用户登录账号密码,清空控制台,进入登录页面,请求用户输入账号.密码和验证码(随机产生),并判断用户输入的信息,给出相应的提示. C#代码如下: 主要知识点: (1 ...

  10. canvas自适应圆形时钟绘制

    前面的话 前面介绍过canvas粒子时钟的绘制,本文将详细介绍canvas自适应圆形时钟绘制 效果演示 最终自适应圆形时钟的效果如下所示 功能分析 下面来分析一下该圆形时钟的功能 [1]静态背景 对于 ...