专栏首页知识分享ESP8266 SDK开发: 外设篇-SPI

ESP8266 SDK开发: 外设篇-SPI

SPI引脚

上程序

#include "spi_interface.h"




SpiAttr spiConfig;//配置SPI
SpiData SpiSend;//配置SPI发送的数据

2.配置GPIO,设置为主机模式

3.关于发送数据

首先大家不要被官方规定的发送的几种数据所迷惑

你要明白,无论是啥命令,地址,数据

都是用SPI发送数据而已

你要是这都不明白....说明你已经被协议弄糊涂了

其实对于通信而言你需要把大的方向搞明白

什么叫:通信方式 (SPI,串口)

什么叫:通信协议 (在通信方式基础上规定的数据协议)

之所以有命令,地址,和数据之分,其实是咱和某个支持SPI的芯片通信的时候

如果想读取SPI芯片某个寄存器里面的值

你需要先用SPI发送发送读命令(告诉芯片我要读数据)

然后用SPI发送要读取的地址

然后另一个芯片就返回过来数据了

3.发送一个字节数据

用cmd测试

为了方便我监控数据,使用了一个1S的硬件定时器

        SpiSend.cmd= 0x55;//设置发送的数据
        SpiSend.cmdLen=1;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据

监控如下

4.发送两个字节数据

        SpiSend.cmd= 0x55aa;//设置发送的数据
        SpiSend.cmdLen=2;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据

测试如下

先传的0xaa  后传输的 0x55

用户实际应用的时候要注意!

5.再看一下 addr

addr最大可以传输一个32位的数据(4字节)

5.1 注意下下面的情况

测试如下:

注意:

其实实际上设置为传输1位的时候芯片内部默认先取addr数据地址的 低八位

uint32_t data = 0x01;

实际上 data = 0x01000000

传输数据的时候芯片先取的最后面的00

使用addr传输的1位数据的时候需要注意

注意:

注意:

注意:

使用 addr 只要是不传输4位数据

芯片内部都会默认先传低八位

使用 addr 无论是只要是不传输4位数据

芯片内部都会默认先传低八位

使用 addr 无论是只要是不传输4位数据

芯片内部都会默认先传低八位

下面看用addr传输4位数据

u32 cnt = 0;
uint32_t data = 0x0103070f;
void hw_test_timer_cb(void)
{
    cnt++;
    if(cnt>1000)//1S
    {
        cnt=0;
        SpiSend.addr= &data;//设置发送的数据
        SpiSend.addrLen=4;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据
    }
}

测试如下:

正好传输4位数据的时候,芯片内部默认先传输高八位

5.2 传输一个u8型4字节的数组,传输个数是2字节

芯片默认是先传输数组后面的数据,依次向前

u8 temp[4] = {0x01,0x02,0x03,0x04};
void hw_test_timer_cb(void)
{
    cnt++;
    if(cnt>1000)//1S
    {
        cnt=0;
        SpiSend.addr= (uint32_t *)(&temp);//设置发送的数据
        SpiSend.addrLen=2;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据
    }
}

5.3 传输一个u8型4字节的数组,如果传输个数是4字节

芯片也会先传输数组后面的数据,依次向前

u8 temp[4] = {0x01,0x02,0x03,0x04};
void hw_test_timer_cb(void)
{
    cnt++;
    if(cnt>1000)//1S
    {
        cnt=0;
        SpiSend.addr= (uint32_t *)(&temp);//设置发送的数据
        SpiSend.addrLen=2;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据
    }
}

以上为 使用addr 传输数据时需要注意的地方

6 现在看一下  data

只要记住一点即可

data 和 上面的 addr 传输的时候取数据的方式完全相反

data就不再多加测试:用户只需要记住上面的话即可!

由此便推导出使用data应该会怎么传输

我想官方这样做是为了应对客户不同的传输数据情况!

6.1 测试使用data ,u8型数组传输2字节的情况

u8 temp[4] = {0x01,0x02,0x03,0x04};
void hw_test_timer_cb(void)
{
    cnt++;
    if(cnt>1000)//1S
    {
        cnt=0;
        SpiSend.data= (uint32_t *)(&temp);//设置发送的数据
        SpiSend.dataLen=2;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据
    }
}

测试如下:

和addr完全相反,data是先传输数组前面的数据

6.2 测试使用data ,u8型数组传输4字节的情况

u8 temp[4] = {0x01,0x02,0x03,0x04};
void hw_test_timer_cb(void)
{
    cnt++;
    if(cnt>1000)//1S
    {
        cnt=0;
        SpiSend.data= (uint32_t *)(&temp);//设置发送的数据
        SpiSend.dataLen=4;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据
    }
}

测试如下:

关于组合起来

u32 cnt = 0;
u8 temp[4] = {0x01,0x02,0x03,0x04};
void hw_test_timer_cb(void)
{
    cnt++;
    if(cnt>1000)//1S
    {
        cnt=0;
        SpiSend.cmd = 0x55;
        SpiSend.cmdLen = 1;
        SpiSend.addr= (uint32_t *)(&temp);//设置发送的数据
        SpiSend.addrLen=4;//发送的数据个数(字节为单位)
        SPIMasterSendData(SpiNum_HSPI,&SpiSend);//发送数据
    }
}

测试如下:

总结:

cmd,addr,data的数据该怎么传还是怎么传

但是是先传 cmd 然后 addr 最后 data

如果想SPI发送数据的时候接收数据

SPIMasterRecvData(SpiNum spiNum, SpiData* pOutData)

史上最短的引脚模拟SPI

/**
* @brief  SPI函数
* @param  value--发送的数据
* @param  None
* @param  None
* @retval SPI接收的数据
* @example
**/
unsigned char SPIWriteRead(unsigned char value)
{
    unsigned char i=0,temp=0;
    SPI_CLK = 0;//进入之前其实是高电平
    if(SPI_MISO)temp|=0x80;//接收数据
    for(i=0;i<8;i++)
    {
        SPI_MOSI=value&(0x80>>i);//准备数据
        SPI_CLK=1;
        SPI_CLK = 0;
        if(i<7)if(SPI_MISO)temp|=0x80>>(i+1);//接收数据
    }
    return temp;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 15-STM32+ESP8266+AIR202基本控制篇-实现功能2和功能4详细步骤7-web服务器配置https访问(Linux系统)

    说明 这节配置一下OpenResty,让web服务器可以实现https访问 添加一个网站 1.虽然安装了OpenResty 但是需要手动添加站点 <ig...

    杨奉武
  • 30-STM32+ESP8266+AIR202基本控制篇-功能优化-MQTT服务器配置SSL单向认证(Linux系统)

    说明 如果设备连接MQTT只走TCP,信息可以用软件监控出来. 为了防止传输的信息被监控,TCP + SSL 使用自带的证书文件(开启单向认证) 1.软件...

    杨奉武
  • 3-STM32+ESP8266+AIR202基本控制篇功能1-APP使用APUConfig配网绑定ESP8266,并通过MQTT和ESP8266实现远程通信控制

    整体说明 这节演示一下使用APP配网绑定ESP8266然后和ESP8266实现MQTT远程温湿度采集和远程控制继电器 绑定方式:APUConfig APUC...

    杨奉武
  • 关于seajs

    虽然已经有很长时间没写JavaScript,但很多时候看到一些应用还是会带着好奇心去研究一下。之前是看腾讯的朋友网,它的webchat做的很不错(虽然ff下有b...

    meteoric
  • 最小差

    一份执着✘
  • 前端模块化详解(完整版)

    上例子通过jquery方法将页面的背景颜色改成红色,所以必须先引入jQuery库,就把这个库当作参数传入。这样做除了保证模块的独立性,还使得模块之间的依赖关系变...

    小生方勤
  • 前端模块化详解(完整版)

    在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端(表单验证等),随...

    Nealyang
  • 初识 Python3.7 的 dataclasses 标准库

    最近在进行一个新的后端项目时想初步应用一下领域驱动设计的思想。DDD 开发需要对一个领域对象进行各种操作,而不是把业务数据包在dict里在 action 层,r...

    ★忆先★
  • Shell的Debug命令

    使用Host的Target Server与Target的WDB Agent连接后,既可以使用Workbench的Debugger进行图形化的在线调试,也可以使用...

    Taishan3721
  • 「译」ES6:参数默认值的实现细节

    在这篇文章中我们会介绍另一个 ES6 的特性,带默认值的函数参数。正如我们将看到的,有一些微妙的案例。

    Chor

扫码关注云+社区

领取腾讯云代金券