esp8266~SPI使用
前言
最近项目上遇到困难,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通信网上也找了好久 查找了好多资料,关于这方面的还真是比较少,觉得比较好的文章见下面参考。
参考:
- stm32通过spi连接esp8266的hspi 开发
- WiFi-ESP8266入门开发(十三)-使用SPI
- esp8266 spi slave 驱动调试
esp8266~SPI使用相关推荐
- ESP8266 SPI通信
设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信 1. SPI总线--SPI类库的使用 SPI是串行外设接口(Seri ...
- esp8266 rtos 开发环境 ubuntu_esp8266/32~资源帖[持续更新]
一. 背景 最开始入手esp8266是大三下学期(16年),好像当时是同专业的一朋友带入坑的.刚开始玩ardunio想通过esp8266到app,ardunio是通过AT指令和8266交互的.后面用着 ...
- arduino lora通讯_ESP8266 LoRa网关第一步:SPI总线
logic_spi_esp8266_arduino.png 之前一直有看到PyCom开发的基于MicroPython/ESP32的LoRa网关,但是也没有测试过.最近看到国内有卖ESP32/LoRa模 ...
- ESP8266开发之旅 网络篇③ Soft-AP——ESP8266WiFiAP库的使用
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... 共同学习成长QQ群 622368884,不喜勿 ...
- esp8266/32~资源帖[持续更新]
一. 背景 最开始入手esp8266是大三下学期(16年),好像当时是同专业的一朋友带入坑的.刚开始玩ardunio想通过esp8266到app,ardunio是通过AT指令和8266交互的.后面用着 ...
- 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 ...
- bookmarks_2021_9_28
书签栏 通讯 s7-1200与s7-200smart通讯-工业支持中心-西门子中国 IO_device S7-1200PROFINET通信 ET 200SP 安装视频 - ID: 95886218 - ...
- LiteOs代码目录结构
LiteOS的代码目录结构说明 转自https://github.com/LiteOS/LiteOS/blob/master/doc/LiteOS_Code_Info.md 关于代码树中各个目录存放的 ...
- ESP8266-- 温湿度监控代码DHT-11(web页面展示)
代码基于MicroPyhon.esp-8266 SPI Flash 只有 8Mbit,无法写入更多的功能. DHT-11 温度±2 ,这里的检测频率在30s/次. web展示代码 : def web_ ...
最新文章
- 【转载】Asp.Net MVC3网站并成功的连接了MongoDB
- 计算机音乐数字乐谱核爆神曲,原神乐谱核爆神曲
- oracle锁表导致update,delete,insert出现无反应的问题
- 在终端(Terminal)中用颜色显示不同类型文件
- oracle agile 性能,Oracle Agile PLM安全漏洞(CVE-2016-3554)
- 图片连续向左向右向下向上滚动和左右运动、指向停止js代码
- 面试题32:从上到下打印二叉树
- RabbitMQ如何解决被重复消费和数据丢失的问题?
- How to create a angular2 project process
- 2014.01.25 JFinal 使用经验积累
- java坦克大战爆炸效果_Java坦克大战第一个坦克不爆炸问题
- 22道接口测试面试题答案。
- 中学计算机课程ppt课件,《高中信息技术》PPT课件.ppt
- 2016《A survey of transfer learning》迁移学习笔记
- 虚拟服务器和vdi,如何搭建高效虚拟桌面架构(VDI)
- Your app declares support for audio in the UIBackgroundModes key in your Info.plist 错误
- Android 获取手机状态栏高度
- 陈艾盐:春燕百集访谈节目第二十六集
- [Unity存档系统]简单介绍Unity常见存档系统二JSON以及使用方法
- 丽江文化旅游学院易腾创想Java实训第14组总结