【Esp32】Spi接口驱动SX1268模块

  • 0. 实验结果
  • 1.原理解析
  • 2.硬件接线
  • 3. SX1268 模块的 SPI 时序分析
  • 4. 基于 ESP32 实现函数封装
  • 4.1 读寄存器
  • 4.2 写寄存器
  • 5. LoRa参数介绍

日期: 2023-01-13
项目需要用乐鑫的 ESP32开发板驱动 Lora 模块,用的是  深圳SX1268ZTR4-GC的lora模块,
由于网上的参考资料大部分都是基于STM32驱动的,
本文实现了基于ESP32的SPI3接口驱动 sx1268 模块实现数据的收发。
用两个 esp32 + sx1268 模块的形式

关于lora数据通信+mqtt+智能监控平台的接入,参考文章:【Esp32】Esp32+sx1268+mqtt+智能监控平台

0. 实验结果

实现2个模块的数据收发,

实测距离10m左右,发数据太快会存在丢包现象

esp32配置spi为从机模式 esp32 spi接口_stm32

1.原理解析

【PingPong系统设计需求】: 将LoRa终端定义成两种角色:Master(主机)和Slave(从机)

  • Master主动发送PING数据,接收PANG数据
  • Slave如果接收到PING数据,回应PANG数据
  • 终端在LCD屏幕上显示终端类型及收发数据包个数

【PingPong通信机制:】

esp32配置spi为从机模式 esp32 spi接口_单片机_02

2.硬件接线

esp32配置spi为从机模式 esp32 spi接口_嵌入式硬件_03

esp32配置spi为从机模式 esp32 spi接口_单片机_04

3. SX1268 模块的 SPI 时序分析

开始传输数据时,拉低NSS引脚(spi协议中的CS引脚),传输完之后,拉高引脚
Spi:模式0,全双工通信

esp32配置spi为从机模式 esp32 spi接口_寄存器_05

4. 基于 ESP32 实现函数封装

封装读写字节函数:

bool spi_read_byte(uint8_t* rx_data, uint8_t* tx_data, size_t DataLength )
bool spi_write_byte(uint8_t* tx_data, size_t DataLength )

虽然叫 read_byte 但是可以当做读写使用。
当写字节时,rx_data = NULL;即可
当读字节时,先发送一个tx_data,再将读到的字节存到 rx_data中。为什么这么封装呢?

封装传输字节的函数:

uint8_t spi_transfer(uint8_t address)

当写字节时,参数address 表示写的内容,此时,函数的返回值无意义
当读字节时,address = 0,返回值表示,读取到的字

4.1 读寄存器

esp32配置spi为从机模式 esp32 spi接口_单片机_06

解释:NOP指的是空操作指令,相当于主机执行一次 write ,但是write的字节为0

读寄存器:比如读寄存器 addr 开始的2个字节,

spi_transfer(cmd)
spi_transfer(addr高四位)
spi_transfer(addr低四位)
spi_transfer(0)

rx_data[0] = spi_transfer(0);
rx_data[1] = spi_transfer(0);

4.2 写寄存器

esp32配置spi为从机模式 esp32 spi接口_单片机_07

spi_transfer(cmd)
spi_transfer(addr高四位)
spi_transfer(addr低四位)
spi_transfer(data[n]);     // n = 0……x

5. LoRa参数介绍

esp32配置spi为从机模式 esp32 spi接口_stm32_08