IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于vsvode开发ESP32 教你从环境搭建到SPI使用 -> 正文阅读

[嵌入式]基于vsvode开发ESP32 教你从环境搭建到SPI使用

1.基于VSCODE的开发环境搭建

1.1 点击下载的链接 : ESP-IDF
1.2.开发环境构建 :vscode
1.3环境搭建参考链接:链接: 环境搭建教程

2.创建工程

参考环境搭建,将测试工程拷贝到自定义开发环境中,并打开ESP-IDF 4.4 PowerShell使用idf.py fullclean运行一次,清除配置文件。并使用idf.py build 对整个工程做一次构建。(PS:可以在Vscode 中完成)。

3.编写cmake 添加自定义文件夹

    file(GLOB_RECURSE SOURCES nfc_sdk/*.c ) //填写实际对应的子文件夹名称
    set(include_dirs 
       nfc_sdk //填写实际对应的子文件夹名称
        )
    idf_component_register(SRCS ${SOURCES} "main.c"
                        INCLUDE_DIRS ${include_dirs})

4. SPI 配置与使用

4.1 SPI初始化

spi_device_handle_t nfc_spi; //SPI句柄

unsigned char Spi_init(void) //SPI初始化
{
    unsigned char sta = 0;
    esp_err_t ret = 0;
    spi_bus_config_t buscfg = {
        .miso_io_num = PIN_NUM_MISO,
        .mosi_io_num = PIN_NUM_MOSI,
        .sclk_io_num = PIN_NUM_CLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
        .max_transfer_sz = 1024,
    };
    spi_device_interface_config_t devcfg = {
        .clock_speed_hz = SPI_MASTER_FREQ_5M, // Clock out at 10 MHz,
        .mode = 0,                            // SPI mode 0
        .spics_io_num = PIN_NUM_CS,
        .queue_size = 7, // 传输队列大小,决定了等待传输数据的数量
    };
    spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH2);
    ESP_ERROR_CHECK(ret);
    ret = spi_bus_add_device(SPI2_HOST, &devcfg, &nfc_spi);
    ESP_ERROR_CHECK(ret);
    return sta;
}

4.2 SPI传输发送

esp_err_t spi_write(spi_device_handle_t spi, uint8_t *data, uint8_t len)
{
    esp_err_t ret;
    spi_transaction_t t;
    if (len == 0)
        return;               //no need to send anything
    memset(&t, 0, sizeof(t)); //Zero out the transaction

    t.length = len * 8;                         //Len is in bytes, transaction length is in bits.
    t.tx_buffer = data;                         //Data
    t.user = (void *)0;                         //D/C needs to be set to 1
    ret = spi_device_polling_transmit(spi, &t); //Transmit!
    assert(ret == ESP_OK);                      //Should have had no issues.
    return ret;
}

4.3 SPI传输接收

esp_err_t spi_read(spi_device_handle_t spi, uint8_t *data)
{
    spi_transaction_t t;
    memset(&t, 0, sizeof(t));
    t.length = 8;
    t.flags = SPI_TRANS_USE_RXDATA;
    t.user = (void *)1;
    esp_err_t ret = spi_device_polling_transmit(spi, &t);
    assert(ret == ESP_OK);
    *data = t.rx_data[0];
    return ret;
}

4.4 SPI特殊应用参考配置

void WRITEREG(unsigned char addr, unsigned char data)
{
    unsigned char flag = 0, ucbuf[3] = {0};
    esp_err_t ret;
    spi_transaction_t t;
    memset(&t, 0, sizeof(t)); //Zero out the transaction
    t.user = (void *)1;       //D/C needs to be set to 1
    gpio_set_level(PIN_NUM_CS, 1);
    if (addr & 0x80)
    {
        flag = 1;
        ucbuf[0] = ((0x00 << 1) & 0xFE);
        ucbuf[1] = 0x01;
        t.tx_buffer = &ucbuf;
        t.length = 2 * 8;
        ret = spi_device_polling_transmit(nfc_spi, &t); //Transmit!
        assert(ret == ESP_OK);                          //Should have had no issues.
    }
    ucbuf[0] = ((addr << 1) & 0xFE);
    ucbuf[1] = data;
    t.tx_buffer = &ucbuf;
    t.length = 2 * 8;
    ret = spi_device_polling_transmit(nfc_spi, &t); //Transmit!
    if (flag)
    {
        ucbuf[0] = ((0x00 << 1) & 0xFE);
        ucbuf[1] = 0x00;
        t.tx_buffer = &ucbuf;
        t.length = 2 * 8;
        ret = spi_device_polling_transmit(nfc_spi, &t); //Transmit!
    }
    return ret;
}

unsigned char READREG(unsigned char addr)
{
    unsigned char reg = 0xFF, ucbuf[3] = {0};
    unsigned char flag = 0;
    esp_err_t ret;
    spi_transaction_t t;
    memset(&t, 0, sizeof(t)); //Zero out the transaction
    t.user = (void *)1;       //D/C needs to be set to 1
    if (addr & 0x80)
    {
        flag = 1;
        ucbuf[0] = ((0x00 << 1) & 0xFE);
        ucbuf[1] = 0x01;
        t.tx_buffer = &ucbuf;
        t.length = 2 * 8;
        ret = spi_device_polling_transmit(nfc_spi, &t); //Transmit!
    }
    ucbuf[0] = (((addr << 1) & 0xFE) | 0x01); // 0110 1000   1101 0001  0xd1
    t.flags = SPI_TRANS_USE_RXDATA;
    t.length = 2 * 8;
    t.tx_buffer = &ucbuf;
    ret = spi_device_polling_transmit(nfc_spi, &t); //Transmit!
    assert(ret == ESP_OK);
    reg = t.rx_data[1];
    if (flag)
    {
        ucbuf[0] = ((0x00 << 1) & 0xFE);
        ucbuf[1] = 0x00;
        t.tx_buffer = &ucbuf;
        t.length = 2 * 8;
        ret = spi_device_polling_transmit(nfc_spi, &t); //Transmit!
    }
    return reg;
}

5 基于SPI通讯测试NFC模块

void app_main(void){
//********************* 用户其他代码
    Spi_init();
while(1){
  LOG_printf("[sy_test_task_handle]0x68 = 0x%x ", READREG(0x68));
  vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:03:54  更:2022-07-20 19:06:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:28:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码