树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口
一、SPI接口
樹莓派3B+上的SPI接口如下所示,有兩組SPI,分別由CE0和CE1來進行選擇。
首先查看樹莓派的SPI是否啟用,在/dev查看是否有spidev0.0和spidev0.1
如果不存在spi設備號,需要在raspi-config中啟用,在命令行輸入:sudo raspi-config?
選Interfacing Options,選擇SPI,選擇enable。
二、wiringPiSPI庫
wiringPISPI庫提供了樹莓派的SPI驅動調用,包含四個接口函數。
2.1 獲取SPI的描述符?wiringPiSPIGetFd ? ?
int wiringPiSPIGetFd ? ? (int channel) ;輸入參數為通道,由CE0和CE1決定連接的是哪一個SPI,CE0連接SPI0,CE1連接SPI1。
2.2 SPI讀寫函數?wiringPiSPIDataRW ?
int wiringPiSPIDataRW ? ?(int channel, unsigned char *data, int len) ;由于SPI是上升沿下數據,下降沿讀數據的,因此,一個時鐘即可同時完成讀寫。wiringPiSPIDataRW函數同時執行讀寫,因此,讀取的數據會覆蓋寫入的數據空間,即讀寫命令都會操作data指針指向的buff。調用一次即完成一次讀寫,片選使能CE0和CE1由該函數自動設置,無需再次操作。
2.3 SPI模式設置函數?wiringPiSPISetupMode?
int wiringPiSPISetupMode (int channel, int speed, int mode) ;該函數設置SPI的模式,包括通道(0,1),SPI速度,和SPI模式(0,1,2,3)。SPI有四種工作模式,各個工作模式的不同在于SCLK不同, 具體工作由CPOL,CPHA決定
- CPOL: (Clock Polarity),時鐘極性
? ? ? ? ? 當CPOL為0時,時鐘空閑時電平為低;
? ? ? ? ? 當CPOL為1時,時鐘空閑時電平為高;
- CPHA:(Clock Phase),時鐘相位
? ? ? ? ? 當CPHA為0時,時鐘周期的上升沿采集數據,時鐘周期的下降沿輸出數據;
? ? ? ? ? 當CPHA為1時,時鐘周期的下降沿采集數據,時鐘周期的上升沿輸出數據;
一般采用模式0,可以設置為:
wiringPiSPISetupMode (0, 500000, 0);//500kHz2.4 SPI默認模式0設置?wiringPiSPISetup ? ?
int wiringPiSPISetup ? ? (int channel, int speed) ;此函數直接默認了SPI模式為0,只需設置通道和速度即可。
三、SX1278 移植SPI
根據SX1278的接口函數驅動代碼可知,只需要自己實現LoRa_Write_Buff和LoRa_Read_Buff即可。兩者函數的接口形式為:
void LoRa_Write_Buff(uint8_t addr,uint8_t *buffer,uint8_t size);void LoRa_Read_Buff(uint8_t addr, uint8_t *buffer, uint8_t size);即調用上述函數對SX1278的寄存器進行指定長度的讀寫。根據手冊,可知在進行SPI讀寫之前需要先發送操作地址碼,同時讀操作的地址最高位為1,寫操作的地址最高位為地址0。
因此,可以在讀寫之前需要進行寄存器的地址讀寫配置,static uint8_t Cfg_SpiModeRW(uint8_t rw, uint8_t val)。
/*! * \brief Configure the SPI read and write mode * \para rw,uint8_t, read mode = SPI_LORA_READ and write mode = SPI_LORA_WRITESPI_LORA_READ = 0, SPI_LORA_WRITE = 1, a Marao define * \retval a_val:uint8_t,cfg_addr */ static uint8_t Cfg_SpiModeRW(uint8_t rw, uint8_t val) {uint8_t a_val;if(rw == SPI_LORA_READ){a_val = 0x7F & val;}else if(rw == SPI_LORA_WRITE){a_val = 0x80 | val;}return a_val; }SX1278的SPI時序圖如下:
wiringPiSPI的wiringPiSPIDataRW 函數同時執行讀寫,且自動控制CE接口,因此,LoRa_Write_Buff和LoRa_Read_Buff中需要把數據buff和地址操作CMD提前準備好,然后調用一次wiringPiSPIDataRW函數即可實現指定長度和寄存器的SPI讀寫。具體移植如下:
/*! * \brief LoRa write buff with SPI, using wiringPiSPI wiringPiSPIDataRW interface * \para addr:uint8_t, LoRa Reg addrbuffer:uint8_t pointer, write buffersize:uint8_t,size of buffer byte to write * \retval none */ void LoRa_Write_Buff(uint8_t addr,uint8_t *buffer,uint8_t size) {uint8_t cmd;uint8_t buf[256];buf[0] = Cfg_SpiModeRW(SPI_LORA_WRITE,addr);memcpy(buf+1,buffer,size);wiringPiSPIDataRW(SPI_CHANNEL_0,buf,size+1);//build addr+buff cmd } /*! * \brief LoRa read buff with SPI, using wiringPiSPI wiringPiSPIDataRW interface * \para addr:uint8_t, LoRa Reg addrbuffer:uint8_t pointer, read buffersize:uint8_t,size of buffer byte to read * \retval none */ void LoRa_Read_Buff(uint8_t addr, uint8_t *buffer, uint8_t size) { uint8_t cmd;uint8_t buf[257];buf[0] = Cfg_SpiModeRW(SPI_LORA_READ,addr);wiringPiSPIDataRW(SPI_CHANNEL_0,buf,size+1);memcpy(buffer,buf+1,size);//remove fisrt val, which means addr }移植的時候,別忘了頭文件
#include "wiringPi.h" #include "wiringPiSPI.h"至此,SPI移植完畢。
其他:
樹莓派移植SX1278 LoRa通信--使用wiringPi 移植GPIO中斷
樹莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口
樹莓派UART串口編程--使用wiringPi庫-C開發【1-基礎應用】
樹莓派UART串口編程--使用wiringPi庫-C開發【2-修改驅動】
樹莓派Raspberry 操作GPIO--LED
總結
以上是生活随笔為你收集整理的树莓派移植SX1278 LoRa通信--使用wiringPiSPI移植SPI通信接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apk私钥_获取APK证书MD5、SHA
- 下一篇: vs2013 旗舰版 密钥