【Esp32】Spi接口驱动SX1268模块
- 1.硬件接线
- 2. SX1268 模块的 SPI 时序分析
- 3. 基于 ESP32 实现函数封装
- 3.1 读寄存器
- 3.2 写寄存器
- 4. 实验结果
日期: 2023-01-13
项目需要用乐鑫的 ESP32开发板驱动 Lora 模块,用的是 深圳SX1268ZTR4-GC的lora模块,
由于网上的参考资料大部分都是基于STM32驱动的,
本文实现了基于ESP32的SPI3接口驱动 sx1268 模块实现数据的收发。
用两个 esp32 + sx1268 模块的形式
1.硬件接线
2. SX1268 模块的 SPI 时序分析
开始传输数据时,拉低NSS引脚(spi协议中的CS引脚),传输完之后,拉高引脚
Spi:模式0,全双工通信
3. 基于 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,返回值表示,读取到的字
3.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);
3.2 写寄存器
spi_transfer(cmd)
spi_transfer(addr高四位)
spi_transfer(addr低四位)
spi_transfer(data[n]); // n = 0……x
4. 实验结果
实现2个模块的数据收发,
实测距离10m左右,发数据太快会存在丢包现象
若有错误,希望提出批评指教,在评论区留言或者私聊均可。