【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左右,发数据太快会存在丢包现象
1.原理解析
【PingPong系统设计需求】: 将LoRa终端定义成两种角色:Master(主机)和Slave(从机)
- Master主动发送PING数据,接收PANG数据
- Slave如果接收到PING数据,回应PANG数据
- 终端在LCD屏幕上显示终端类型及收发数据包个数
【PingPong通信机制:】
2.硬件接线
3. SX1268 模块的 SPI 时序分析
开始传输数据时,拉低NSS引脚(spi协议中的CS引脚),传输完之后,拉高引脚
Spi:模式0,全双工通信
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 读寄存器
解释: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 写寄存器
spi_transfer(cmd)
spi_transfer(addr高四位)
spi_transfer(addr低四位)
spi_transfer(data[n]); // n = 0……x
5. LoRa参数介绍