快捷搜索: 王者荣耀 脱发

ESP8266_RTOS_SDK 简单的SPI读写


前言

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

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

传输的时候,还要求

一次传输只支持64字节

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


1.ESP8266的硬件SPI

首先明白,我们使用到的是IO12 IO13 IO14这3个引脚

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 <stdio.h>
#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";

esp_err_t esp8266_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);
}

uint8_t esp8266_spi_read_byte(void)
{
          
   
    spi_trans_t trans;
    uint32_t Rdata = 0;
    memset(&trans, 0x0, sizeof(trans));
    trans.bits.val = 0;
    trans.miso = &Rdata;
    trans.bits.miso = 8 * 1;
    spi_trans(HSPI_HOST, &trans);
    return (uint8_t *)Rdata;
}

esp_err_t esp8266_spi_init(void)
{
          
   
    ESP_LOGI(TAG, "init spi");
    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;

    spi_config.interface.cs_en = 0;
    spi_config.interface.mosi_en = 1;
    spi_config.interface.miso_en = 1;// 置1,否则miso无法接收数据

    // Set SPI to master mode
    // ESP8266 Only support half-duplex
    spi_config.mode = SPI_MASTER_MODE;
    // Set the SPI clock frequency division factor
    spi_config.clk_div = SPI_2MHz_DIV;
    spi_config.event_cb = NULL;
    return spi_init(HSPI_HOST, &spi_config);
}

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

通过逻辑分析仪分析,发送的数据正确

3.SPI接收

uint8_t esp8266_spi_read_byte(void)
{
          
   
    spi_trans_t trans;
    uint32_t Rdata = 0;
    memset(&trans, 0x0, sizeof(trans));
    trans.bits.val = 0;
    trans.miso = &Rdata;
    trans.bits.miso = 8 * 1;
    spi_trans(HSPI_HOST, &trans);
    return (uint8_t *)Rdata;
}
经验分享 程序员 微信小程序 职场和发展