前言

最近项目上遇到困难,esp8266的SPI用起来有点晕,硬件SPI驱动代码研究不透,猜想应该像STM32操作寄存器一样,可是现在水平有限还是没啃下来,只做到esp8266 硬件SPI发送命令字(一个字节)到stm32,stm32正确的接收到了数据,但关键的问题还是想把esp8266 硬件SPI驱动搞懂,esp8266中HSPI发送数据格式为:命令字 + 地址 + 数据,分别对应不同的底层代码。现在先把硬件SPI驱动代码记录下来,待后续3.0版本的sdk 更新外设SPI驱动后对比学习下,自己也实现了IO口模拟SPI通信,使用逻辑分析仪测试觉得速度还可以接受,也附在这篇博客中。

一. 硬件HSPI

来自esp github,驱动代码也在HSPI_Master/driver路径下。

用例:

#include "gpio.h"
#include "spi_register.h"
#include "spi_interface.h"void spi_initialize()
{//Initialze Pins on ESP8266PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI);PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK);SpiAttr pAttr;   //Set as Master/Sub mode 0 and speed 10MHzpAttr.mode = SpiMode_Master;pAttr.subMode = SpiSubMode_0;pAttr.speed = SpiSpeed_10MHz;pAttr.bitOrder = SpiBitOrder_MSBFirst;SPIInit(SpiNum_HSPI, &pAttr);
}void Send_cmd(uint8 command)
{SpiData pDat;pDat.cmd = command;     ///< Command valuepDat.cmdLen = 1;       ///< Command byte lengthpDat.addr = NULL;      ///< Point to address valuepDat.addrLen = 0;        ///< Address byte lengthpDat.data = NULL;       ///< Point to data bufferpDat.dataLen = 0;      ///< Data byte length.SPIMasterSendData(SpiNum_HSPI, &pDat);
}/******************************************************************************* FunctionName : user_init* Description  : entry of user application, init user function here* Parameters   : none* Returns      : none*******************************************************************************/
void user_init(void)
{uint8 cmd = 0xaa;uint32 addr = 0xbbcc;uint32 data[2] = { 0x11223344, 0x55667788 };spi_initialize();printf("Starting SPI Communication\n");while (1) {Send_cmd(0x34);SpiData pDat;pDat.cmd = cmd;               ///< Command valuepDat.cmdLen = 1;              ///< Command byte lengthpDat.addr = &addr;              ///< Point to address valuepDat.addrLen = 2;            ///< Address byte lengthpDat.data = data;               ///< Point to data bufferpDat.dataLen = sizeof(data);  ///< Data byte length.SPIMasterSendData(SpiNum_HSPI, &pDat);vTaskDelay(100);}
}

二. 软件SPI

软件SPI可能速度较慢,我自己测试了IO口速度大概是1.75翻转一次,也就是570k,比串口速度好多了。
用例:

LOCAL void spi_task(void *pvParameters)
{SOFT_SPI_INIT();while(1){softspi_write_byte(0x08);softspi_write_byte(0x03);softspi_write_byte(0x04);softspi_write_byte(0x0A);vTaskDelay(5);//printf("spi test\n");}vTaskDelete(NULL);
}

驱动代码 :

/** soft spi.c**  Created on: 2018年8月10日*      Author: Hynson*/#include "soft_spi.h"/* spi write one byte  */
void ICACHE_FLASH_ATTR softspi_write_byte(u8 data)
{u8 i;CS_0();for(i = 0; i < 8; i++){if (data & 0x80){MOSI_1();}else{MOSI_0();}SCK_0();data <<= 1;SCK_1();}CS_1();
}
/* spi read one byte */
u8 ICACHE_FLASH_ATTR softspi_read_byte(void)
{u8 read = 0;u8 i;CS_0();for (i = 0; i < 8; i++){SCK_0();read = read<<1;if (MISO_IS_HIGH()){read++;}SCK_1();}CS_1();return read;
}
/** soft_spi.h**  Created on: 2018年11月24日*      Author: Hynson*/#ifndef __SOFT_SPI_H_
#define __SOFT_SPI_H_#include "c_types.h"
#include "gpio.h"
#include "esp8266/gpio_register.h"
#include "esp8266/eagle_soc.h"
#include "esp8266/pin_mux_register.h"
#include "esp8266/ets_sys.h"#define SPI_MISO  12
#define SPI_MOSI    13
#define SPI_SCK     14
#define SPI_CS      15#define SOFT_SPI_INIT()   do{\PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);\PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13);\PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);\PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_GPIO15);\GPIO_DIS_OUTPUT(SPI_MISO);\}while(0)#define MOSI_0()    GPIO_OUTPUT_SET(SPI_MOSI, 0)
#define MOSI_1()    GPIO_OUTPUT_SET(SPI_MOSI, 1)
#define CS_0()      GPIO_OUTPUT_SET(SPI_CS, 0)
#define CS_1()      GPIO_OUTPUT_SET(SPI_CS, 1)
#define SCK_0()     GPIO_OUTPUT_SET(SPI_SCK, 0)
#define SCK_1()     GPIO_OUTPUT_SET(SPI_SCK, 1)#define MISO_IS_HIGH()   (GPIO_INPUT_GET(SPI_MISO) != 0)u8 ICACHE_FLASH_ATTR softspi_read_byte(void);
void ICACHE_FLASH_ATTR softspi_write_byte(u8 data);#endif /* __SOFT_SPI_H_ */

esp8266和STM32 51单片机 spi通信网上也找了好久 查找了好多资料,关于这方面的还真是比较少,觉得比较好的文章见下面参考。
参考:

  1. stm32通过spi连接esp8266的hspi 开发
  2. WiFi-ESP8266入门开发(十三)-使用SPI
  3. esp8266 spi slave 驱动调试

esp8266~SPI使用相关推荐

  1. ESP8266 SPI通信

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

  2. esp8266 rtos 开发环境 ubuntu_esp8266/32~资源帖[持续更新]

    一. 背景 最开始入手esp8266是大三下学期(16年),好像当时是同专业的一朋友带入坑的.刚开始玩ardunio想通过esp8266到app,ardunio是通过AT指令和8266交互的.后面用着 ...

  3. arduino lora通讯_ESP8266 LoRa网关第一步:SPI总线

    logic_spi_esp8266_arduino.png 之前一直有看到PyCom开发的基于MicroPython/ESP32的LoRa网关,但是也没有测试过.最近看到国内有卖ESP32/LoRa模 ...

  4. ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用

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

  5. esp8266/32~资源帖[持续更新]

    一. 背景 最开始入手esp8266是大三下学期(16年),好像当时是同专业的一朋友带入坑的.刚开始玩ardunio想通过esp8266到app,ardunio是通过AT指令和8266交互的.后面用着 ...

  6. mongoose-iot_如何使用带有ESP32和Mongoose OS的GCP-Cloud IoT核心版查看天气

    mongoose-iot This post on freecodecamp.org is not maintained. The most up to date version is on Medi ...

  7. bookmarks_2021_9_28

    书签栏 通讯 s7-1200与s7-200smart通讯-工业支持中心-西门子中国 IO_device S7-1200PROFINET通信 ET 200SP 安装视频 - ID: 95886218 - ...

  8. LiteOs代码目录结构

    LiteOS的代码目录结构说明 转自https://github.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Code_Info.md 关于代码树中各个目录存放的 ...

  9. ESP8266-- 温湿度监控代码DHT-11(web页面展示)

    代码基于MicroPyhon.esp-8266 SPI Flash 只有 8Mbit,无法写入更多的功能. DHT-11 温度±2 ,这里的检测频率在30s/次. web展示代码 : def web_ ...

最新文章

  1. 【转载】Asp.Net MVC3网站并成功的连接了MongoDB
  2. 计算机音乐数字乐谱核爆神曲,原神乐谱核爆神曲
  3. oracle锁表导致update,delete,insert出现无反应的问题
  4. 在终端(Terminal)中用颜色显示不同类型文件
  5. oracle agile 性能,Oracle Agile PLM安全漏洞(CVE-2016-3554)
  6. 图片连续向左向右向下向上滚动和左右运动、指向停止js代码
  7. 面试题32:从上到下打印二叉树
  8. RabbitMQ如何解决被重复消费和数据丢失的问题?
  9. How to create a angular2 project process
  10. 2014.01.25 JFinal 使用经验积累
  11. java坦克大战爆炸效果_Java坦克大战第一个坦克不爆炸问题
  12. 22道接口测试面试题答案。
  13. 中学计算机课程ppt课件,《高中信息技术》PPT课件.ppt
  14. 2016《A survey of transfer learning》迁移学习笔记
  15. 虚拟服务器和vdi,如何搭建高效虚拟桌面架构(VDI)
  16. Your app declares support for audio in the UIBackgroundModes key in your Info.plist 错误
  17. Android 获取手机状态栏高度
  18. 陈艾盐:春燕百集访谈节目第二十六集
  19. [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法
  20. 丽江文化旅游学院易腾创想Java实训第14组总结

热门文章

  1. 浅谈1037U、3317U主板如何点亮LVDS屏幕
  2. UVa在线比赛单题汇总-----DP专题
  3. linux io的cfq代码理解一
  4. C#以太网Sockets客户端设计
  5. 交换机端口橙色灯常亮是什么问题?
  6. 火山PC静态调用非静态
  7. android 开发艾特功能,Android 仿微博@ # 艾特 话题功能
  8. 好玩的Java程序:截图抽取问题
  9. 什么样的运营方式能够提升app的用户留存率?
  10. 云存储服务是什么意思?