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;
}
版权声明:本文为weixin_43808708原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。