ESP8266_RTOS_SDK 简单的SPI读写

文章目录

  • 前言
  • 1.ESP8266的硬件SPI
  • 2.SPI发送
  • 3.SPI接收


前言

大家使用ESP8266_RTOS_SDK官方提供的SPI例程,是不是觉得很扯蛋
我就是想单纯发送我的数据,为什么有增加了乱七八糟命令/地址,和我们以前使用的SPI完全不一样

SPI传输数据,格式为:8bit命令(读值:3,写值:4)+ 8bit地址(值:0x0) + 64byte数据

传输的时候,还要求

一次传输只支持64字节

难道就不能像平时一样传输 char 类型的字节流?


1.ESP8266的硬件SPI

首先明白,我们使用到的是IO12 IO13 IO14这3个引脚
ESP8266_RTOS_SDK 简单的SPI读写_第1张图片

2.SPI发送

官方提供的spi发送函数很复杂,有兴趣的可以慢慢研究
这里我化繁为简,就传输我的数据,那些什么指令/地址全部不要

static esp_err_t user_spi_send_data(uint8_t *data, uint32_t len)
{
    spi_trans_t trans = {0};
    trans.mosi = data;
    trans.bits.mosi = len * 8;
    return spi_trans(HSPI_HOST, &trans);
}

以下是一个测试例程

#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp8266/gpio_struct.h"
#include "esp8266/spi_struct.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_libc.h"
#include "driver/gpio.h"
#include "driver/spi.h"

static const char *TAG = "user_spi";

static void IRAM_ATTR spi_event_callback(int event, void *arg)
{
}

static esp_err_t user_spi_send_data(uint8_t *data, uint32_t len)
{
    spi_trans_t trans = {0};
    trans.mosi = data;
    trans.bits.mosi = len * 8;
    return spi_trans(HSPI_HOST, &trans);
}

static esp_err_t user_spi_init(void)
{
    ESP_LOGI(TAG, "init hspi");
    spi_config_t spi_config;
    // Load default interface parameters
    // CS_EN:1, MISO_EN:1, MOSI_EN:1, BYTE_TX_ORDER:1, BYTE_TX_ORDER:1, BIT_RX_ORDER:0, BIT_TX_ORDER:0, CPHA:0, CPOL:0
    spi_config.interface.val = SPI_DEFAULT_INTERFACE;
    // Load default interrupt enable
    // TRANS_DONE: true, WRITE_STATUS: false, READ_STATUS: false, WRITE_BUFFER: false, READ_BUFFER: false
    spi_config.intr_enable.val = SPI_MASTER_DEFAULT_INTR_ENABLE;
    // Cancel hardware cs
    spi_config.interface.cs_en = 0;
    // MISO pin is used for DC
    spi_config.interface.miso_en = 0;
    // CPOL: 1, CPHA: 1
    spi_config.interface.cpol = 0;
    spi_config.interface.cpha = 0;
    // Set SPI to master mode
    // 8266 Only support half-duplex
    spi_config.mode = SPI_MASTER_MODE;
    // Set the SPI clock frequency division factor
    spi_config.clk_div = SPI_2MHz_DIV;
    // Register SPI event callback function
    spi_config.event_cb = spi_event_callback;
    return spi_init(HSPI_HOST, &spi_config);
}

void app_main(void)
{
    uint8_t buf[16] = {0x01, 0x08, 0x06, 0x07, 0x12, 0};
    user_spi_init();
    while (1)
    {
        user_spi_send_data(buf, 5);
        vTaskDelay(5000 / portTICK_RATE_MS);
    }
}

通过逻辑分析仪分析,发送的数据正确
ESP8266_RTOS_SDK 简单的SPI读写_第2张图片

3.SPI接收

你可能感兴趣的:(ESP8266,ESP8266,SPI)