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; }