esp8266~SPI使用,flutter技术解析与实战

最近项目上遇到困难,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路径下。

esp8266~SPI使用,flutter技术解析与实战

用例:


#include "gpio.h"

#include "spi_register.h"

#include "spi_interface.h"



void spi_initialize()

{

    //Initialze Pins on ESP8266

    PIN_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 10MHz

    pAttr.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 value

    pDat.cmdLen = 1;       ///< Command byte length

    pDat.addr = NULL;      ///< Point to address value

    pDat.addrLen = 0; 	   ///< Address byte length

    pDat.data = NULL; 	   ///< Point to data buffer

    pDat.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 value

        pDat.cmdLen = 1;		      ///< Command byte length

        pDat.addr = &addr; 		      ///< Point to address value

        pDat.addrLen = 2; 	          ///< Address byte length

        pDat.data = data; 		      ///< Point to data buffer

        pDat.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


### 最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](

)**

![](https://www.icode9.com/i/ll/?i=img_convert/b4e2f3326501ee9da3a79eab67053a08.png)

![](https://www.icode9.com/i/ll/?i=img_convert/5c40eda0f4407bfdd14c1e0a3936dc51.png)

![](https://www.icode9.com/i/ll/?i=img_convert/86462d78dfd198614f6850b3b66caa59.png)

> **本文已被[腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://ali1024.coding.net/public/P7/Android/git)收录,自学资源及系列文章持续更新中...**
转存中...(img-AEQIEkSi-1631248896562)]

[外链图片转存中...(img-qbQJaahM-1631248896563)]

> **本文已被[腾讯CODING开源托管项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://ali1024.coding.net/public/P7/Android/git)收录,自学资源及系列文章持续更新中...**
上一篇:ESP8266学习——OS Timer


下一篇:ESP8266 读取MPU-6050数据OLED显示