最近项目上遇到困难,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 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)收录,自学资源及系列文章持续更新中...**