“线程”中讨论的其它部件:TM4C123, ENERGIA
//Hi
//I 正在尝试将 Lora 与 CCS 中的 tm4c123连接,但我不知道 SPI.transfer()是如何工作的
//以下代码在 Energia 中完全有效(Lora + tm4c123)
//发件人和以下一个是接收人代码
//************************************************************************************************************************************************************** //
//发件人代码
#include <SPI.h>
#define 芯片选择 Pn_3
#define RDID 0x42
SPIClass mySPI(0);// 5是端口 Q 上的 SSI3,有关其它信息,请参见 SPI.cpp
/* SSI0
PA2_CLK
PA3_FSS);NSS
PA4_RX);错误
PA5_TX);MOSI
*
#define REG_FIFO 0x00
#define mode_Sleep 0x00
#define mode_STDBY 0x01
#define mode_TX 0x03
#define mode_RX_continuous 0x05
#define mode_RX_single 0x06
#define REG_OP_mode 0x01
#define REG_FR_MSB 0x06
#define REG_FL_MID 0x07
#define REG_FR_LSB 0x08
#define REG_PA_config 0x09
#define REG_OCP 0x0B
#define REG_LNA 0x0c
#define REG_FIFO ADDR_PTR 0x0d
#define REG_FIFO,TX_BASE,ADDR 0x0E
#define REG_FIFO,RX_base_ADDR 0x0F
#define REG_FIFO,RX_current_ADDR 0x10
#define REG_IRQ_flags 0x12
#define REG_RX_NB_Bytes 0x13
#define REG_PKT_SNR 值0x19
#define REG_PKT_RSS_value 0x1a
#define REG_RSSI_value 0x1b
#define REG_MODE_CONFIG_1 0x1d
#define REG_MODE_CONFIG_2 0x1E
#define REG_Preambions_MSB 0x20
#define REG_Preambions_LSB 0x21
#define REG_PAYLOAD 长度0x22
#define REG_MODE_CONFIG_3 0x26
#define REG_FREQ_ERROR_MSB 0x28
#define REG_FREQ_ERROR_MID 0x29
#define REG_FREQ_ERROR_LSB 0x2a
#define REG_RSS_宽频 带0x2C
#define REG_detection _optimize 0x31
#define REG_INVERTIQ 0x33
#define REG_detection 阈值0x37
#define REG_SYNC_word 0x39
#define REG_INVERTIQ2 0x3b
#define REG_DIO_MAPPING:1 0x40
#define REG_version 0x42
#define REG_PA_DAC 0x4d
//模式
#define mode_Long_range_mode 0x80
#define PA-output_RFO_PIN 0
#define pa_output_pa_boost_pin 1.
// PA 配置
#define pa_spine 0x80
// IRQ 掩码
#define IRQ_TX_DONE 掩码0x08
#define IRQ_PAYER_CRC_ERROR_MASK 0x20
#define IRQ_RX_DONE 掩码0x40
#define rf_mid_band 阈值525E6
#define RSSI_offset_Hf_port 157
#define RSSI_offset_LF_port 164
#define MAX_PKT_LENGTH 255
void setTxPower (int level,int outputpin = pa_output_pa_boost_pin);
Int BeginPacket (int inicitHeader = false);
Int _inicitHeaderMode;
长频率;
#define ss 5.
#define rst pf_2
#define dio0 2.
内部计数;
UINT8_t RV;
void setup()(无效设置())
{
Serial.begin(115200);
延迟(1000);//等待串行监视器打开
serial.println("start");
IF(!LoRahbege(866E6))
{
serial.println("启动 LoRa 失败!");
同时(1);
}
setSyncWord(0xF3);
serial.println("do");
}
void loo()
{
BeginPacket();
serial.println("正在发送");
Lora_send ("ABCD");
延迟(1000);
Lora_send (“WXYZ”);
延迟(1000);
Lora_send (“Mnop”);
serial.println("完成");
serial.println("");
延迟(5000);
}
void Lora_send (字符*a)
{
serial.println(a);
int b=strlen(A);//字符串长度
写入寄存器(REG_OP_MODE, MODE_STDBY);
写入寄存器(REG_FIFO _ADDR_PTR),0x00);
(int i=0;a[i];i++)
WriteRegister (REG_FIFO,A[i]);//要发送的按摩
书写寄存器(REG_PAYLOAD 长度,b);//按摩长度
writeRegister (mode_STDBY,mode_TX);
写入寄存器(REG_FIFO _ADDR_PTR),0x00);
写入寄存器(REG_IRQ_FLAGS,0x00);
}
Int BeginPacket (内部植入报头)
{
IF (再次入院())
{
返回0;
}
//进入待机模式
idle();
IF (内植入标题)
{
implicitHeaderMode();
}
否则
{
exicitHeaderMode();
}
//重置 FIFO 地址和装盘长度
写入寄存器(REG_FIFO _ADDR_PTR,0);
写入寄存器(REG_PAYLOAD 长度,0);
返回1;
}
void exicitHeaderMode()(无效解释标题模式())
{
_implicitHeaderMode = 0;
写入寄存器(REG_MODE_CONFIG_1,读取寄存器(REG_MODE_CONFIG_1)和0xFE);
}
void inicitHeaderMode()(作废植入标题模式())
{
_implicitHeaderMode = 1;
writeRegister (REG_MODE_CONFIG_1,readRegister (REG_MODE_CONFIG_1)| 0x01);
}
布尔再次入院()
{
如果((readRegister (REG_OP_MODE)& MODE_TX)= MODE_TX)
{
返回 true;
}
IF (读寄存器(REG_IRQ_flags)和 IRQ_TX_Done 掩码)
{
//清除 IRQ
写入寄存器(REG_IRQ_flags,IRQ_TX_DONE 掩码);
}
返回 false;
}
void setSyncWord(int SW)
{
writeRegister (REG_SYNC_Word,SW);
}
Int LoRahbeg(长频)
{
Pin 模式(芯片选择引脚,输出);
DigitalWrite (芯片选择针脚,高);
IF (rst!=-1)
{
PintMode (rst,输出);
DigitalWrite (rst,low);
延迟(100);
DigitalWrite (rst,high);
延迟(100);
}
mySPI.begin();
RV =读寄存器(REG_VERSION );
IF (RV!= 0x12)
{
返回0;
}
睡眠();
设定频率(频率);
//设置基本地址
写入寄存器(REG_FIFO _TX_BASE _ADDR,0);
写入寄存器(REG_FIFO,RX_base_ADDR,0);
//设置 LNA 升压
写入寄存器(REG_LNA, readRegister(REG_LNA)| 0x03);
//设置自动 AGC
写入寄存器(REG_MODE_CONFIG_3, 0x04);
//将输出功率设置为17 dBm
setTxPower(17);
//进入待机模式
idle();
返回1;
}
void setTxPower (int level,int outputpin)
{
如果(pa_output_RFO_PIN == outputPin)为{
// RFO
如果(级别<0)
{
级别=0;
}
如果(级别> 14)则为其他
{
级别=14;
}
写入寄存器(REG_PA_CONFIG,0x70 |级别);
}
否则
{
// PA 增压
如果(级别> 17)
{
如果(级别> 20)
{
级别=20;
}
//从层中减去3,因此18-20映射到15-17
级别-= 3;
//高功率+20 dBm 操作(Semtech S12 78年76月77日 /79 5.4.3)
写入寄存器(REG_PA_DAC,0x87);
setOCP(140);
}
否则
{
IF (级别<2)
{
级别=2;
}
//默认值 PA_HF/LF 或+17dBm
写入寄存器(REG_PA_DAC,0x84);
setOCP(100);
}
写入寄存器(REG_PA_CONFIG,PA_BOOST |(级别-2));
}
}
无效 setOCP (uint8_t mA)
{
UINT8_t ocpTrim =27;
IF (mA <= 120)
{
八角微调=(mA - 45)/ 5;
}
否则(mA <=240)
{
八角微调=(mA + 30)/ 10;
}
WriteRegister (REG_OCP,0x20 |(0x1F 和 ocpTrim));
}
空闲()
{
写入寄存器(REG_OP_MODE,MODE_LON_RANGE_MODE | MODE_STDBY);
}
无效休眠()
{
写入寄存器(REG_OP_MODE,MODE_LON_RANGE_MODE | MODE_SLEEP);
}
void setFrequency (长频率)
{
频率=频率;
UINT64_t f法国 法郎=((uint64_t)频率<<19)/32000000;
写入寄存器(REG_FR_MSB,(uint8_t)(FF.>16));
写入寄存器(REG_FR_MID,(uint8_t)(f法国 法郎>> 8));
写入寄存器(REG_FL_LSB,(uint8_t)(FF.>0));
}
UINT8_t 读寄存器(uint8_t 地址)
{
返回单个传输(地址和0x7f,0x00);
}
无效写入寄存器(uint8_t 地址,uint8_t 值)
{
SingleTransfer (地址| 0x80,值);
}
UINT8_t 单路传输(uint8_t 地址,uint8_t 值)
{
UINT8_t RV;
mySPI.begin();
Pin 模式(芯片选择引脚,输出);
DigitalWrite (芯片选择针脚,低);
mySPI.transfer (地址);
RV = mySPI.transfer (数值);
DigitalWrite (芯片选择针脚,高);
返回 RV;
}
// //
//接收器代码 Energia Lora tm4c.
#include <SPI.h>
#define 芯片选择 Pn_3
#define RDID 0x42
SPIClass mySPI(0);// 5是端口 Q 上的 SSI3,有关其它信息,请参见 SPI.cpp
/* SSI0
PA2_CLK
PA3_FSS);NSS
PA4_RX);错误
PA5_TX);MOSI
*
#define REG_FIFO 0x00
#define REG_OP_mode 0x01
#define REG_FR_MSB 0x06
#define REG_FL_MID 0x07
#define REG_FR_LSB 0x08
#define REG_PA_config 0x09
#define REG_OCP 0x0B
#define REG_LNA 0x0c
#define REG_FIFO ADDR_PTR 0x0d
#define REG_FIFO,TX_BASE,ADDR 0x0E
#define REG_FIFO,RX_base_ADDR 0x0F
#define REG_FIFO,RX_current_ADDR 0x10
#define REG_IRQ_flags 0x12
#define REG_RX_NB_Bytes 0x13
#define REG_PKT_SNR 值0x19
#define REG_PKT_RSS_value 0x1a
#define REG_RSSI_value 0x1b
#define REG_MODE_CONFIG_1 0x1d
#define REG_MODE_CONFIG_2 0x1E
#define REG_Preambions_MSB 0x20
#define REG_Preambions_LSB 0x21
#define REG_PAYLOAD 长度0x22
#define REG_MODE_CONFIG_3 0x26
#define REG_FREQ_ERROR_MSB 0x28
#define REG_FREQ_ERROR_MID 0x29
#define REG_FREQ_ERROR_LSB 0x2a
#define REG_RSS_宽频 带0x2C
#define REG_detection _optimize 0x31
#define REG_INVERTIQ 0x33
#define REG_detection 阈值0x37
#define REG_SYNC_word 0x39
#define REG_INVERTIQ2 0x3b
#define REG_DIO_MAPPING:1 0x40
#define REG_version 0x42
#define REG_PA_DAC 0x4d
//模式
#define mode_Long_range_mode 0x80
#define mode_Sleep 0x00
#define mode_STDBY 0x01
#define mode_TX 0x03
#define mode_RX_continuous 0x05
#define mode_RX_single 0x06
#define PA-output_RFO_PIN 0
#define pa_output_pa_boost_pin 1.
// PA 配置
#define pa_spine 0x80
// IRQ 掩码
#define IRQ_TX_DONE 掩码0x08
#define IRQ_PAYER_CRC_ERROR_MASK 0x20
#define IRQ_RX_DONE 掩码0x40
#define rf_mid_band 阈值525E6
#define RSSI_offset_Hf_port 157
#define RSSI_offset_LF_port 164
#define led PF_1
#define RH_RF95_HEADER_LEN 4.
#define MAX_PKT_LENGTH 255
#define RH_RF95_MAX_PAYLOAD _LEN MAX_PKT_Length
void setTxPower (int level,int outputpin = pa_output_pa_boost_pin);
Int BeginPacket (int inicitHeader = false);
Int parsePacket (int size = 0);
Int _inicitHeaderMode;
Int 打包索引;
长频率;
#define ss 5.
#define rst pf_2
#define dio0 2.
内部计数;
UINT8_t RV;
挥发性 uint8_t _BufLen;
UINT8_t _BUf[RH_RF95_MAX_PAYLOAD _LEN];
内部 i1=0;
///当缓冲区中有有效消息时为 True
易失性 bool _rxBufValid;
void setup()(无效设置())
{
Serial.begin(115200);
serial.println("Recever ");
同时(!LoRahbege(866E6))
{
serial.println(".");
延迟(500);
}
setSyncWord(0xF3);
serial.println("Start");
}
void loo()
{
Int packetSize = parsePacket();
IF (打包大小)
{
serial.print ("接收的数据包");
对于(i1=0;i1<packetSize;i1+)
{
CHAR I=readRegister (REG_FIFO);
serial.print(i);
}
serial.println("");
}
}
内部可用()
{
返回(readRegister (REG_RX_NB_Bytes)-_packetIndex);
}
内部参数包(int size)
{
Int packetLength = 0;
Int irqFlags = readRegister (REG_IRQ_flags);
如果(尺寸> 0)
{
implicitHeaderMode();
写入寄存器(REG_PAYLOAD 长度,大小和0xff);
}
否则
{
exicitHeaderMode();
}
//清除 IRQ
writeRegister (REG_IRQ_flags,irqFlags);
如果((irqFlags & IRQ_RX_DON_MASK)&(irqFlags & IRQ_PAYER_CRC_ERROR_MASK)=0)
{
//收到一个数据包
打包索引=0;
//读取数据包长度
IF (_inicitHeaderMode)
{
PacketLength = readRegister (REG_PAYLOAD 长度);
}
否则
{
PacketLength =读寄存器(REG_RX_NB_Bytes);
}
//将 FIFO 地址设置为当前 RX 地址
写入寄存器(REG_FIFO _ADDR_PTR),读取寄存器(REG_FIFO _RX_CURRENT_ADDR);
//进入待机模式
idle();
}
否则,如果(readRegister (REG_OP_MODE)!=(mode_Long_range_mode | mode_RX_single)))
{
//重置 FIFO 地址
写入寄存器(REG_FIFO _ADDR_PTR,0);
//置于单个 RX 模式
写入寄存器(REG_OP_MODE,MODE_LON_RANGE_MODE | MODE_RX_single);
}
回程封装长度;
}
Int BeginPacket (内部植入报头)
{
IF (再次入院())
{
返回0;
}
//进入待机模式
idle();
IF (内植入标题)
{
implicitHeaderMode();
}
否则
{
exicitHeaderMode();
}
//重置 FIFO 地址和装盘长度
写入寄存器(REG_FIFO _ADDR_PTR,0);
写入寄存器(REG_PAYLOAD 长度,0);
返回1;
}
void exicitHeaderMode()(无效解释标题模式())
{
_implicitHeaderMode = 0;
写入寄存器(REG_MODE_CONFIG_1,读取寄存器(REG_MODE_CONFIG_1)和0xFE);
}
void inicitHeaderMode()(作废植入标题模式())
{
_implicitHeaderMode = 1;
writeRegister (REG_MODE_CONFIG_1,readRegister (REG_MODE_CONFIG_1)| REG_OP_MODE);
}
布尔再次入院()
{
如果((readRegister (REG_OP_MODE)& MODE_TX)= MODE_TX)
{
返回 true;
}
IF (读寄存器(REG_IRQ_flags)和 IRQ_TX_Done 掩码)
{
//清除 IRQ
写入寄存器(REG_IRQ_flags,IRQ_TX_DONE 掩码);
}
返回 false;
}
void setSyncWord(int SW)
{
writeRegister (REG_SYNC_Word,SW);
}
Int LoRahbeg(长频)
{
Pin 模式(芯片选择引脚,输出);
DigitalWrite (芯片选择针脚,高);
IF (rst!=-1)
{
PintMode (rst,输出);
DigitalWrite (rst,low);
延迟(100);
DigitalWrite (rst,high);
延迟(100);
}
mySPI.begin();
RV =读寄存器(REG_VERSION );
IF (RV!= 0x12)
{
返回0;
}
睡眠();
设定频率(频率);
//设置基本地址
写入寄存器(REG_FIFO _TX_BASE _ADDR,0);
写入寄存器(REG_FIFO,RX_base_ADDR,0);
//设置 LNA 升压
写入寄存器(REG_LNA, readRegister(REG_LNA)| 0x03);
//设置自动 AGC
写入寄存器(REG_MODE_CONFIG_3, 0x04);
//将输出功率设置为17 dBm
setTxPower(17);
//进入待机模式
idle();
返回1;
}
void setTxPower (int level,int outputpin)
{
IF (PA_OUTPUT _RFO_PIN ==输出引脚)
{
// RFO
如果(级别<0)
{
级别=0;
}
如果(级别> 14)则为其他
{
级别=14;
}
写入寄存器(REG_PA_CONFIG,0x70 |级别);
}
否则
{
// PA 增压
如果(级别> 17)
{
如果(级别> 20)
{
级别=20;
}
//从层中减去3,因此18-20映射到15-17
级别-= 3;
//高功率+20 dBm 操作(Semtech S12 78年76月77日 /79 5.4.3)
写入寄存器(REG_PA_DAC,0x87);
setOCP(140);
}
否则
{
IF (级别<2)
{
级别=2;
}
//默认值 PA_HF/LF 或+17dBm
写入寄存器(REG_PA_DAC,0x84);
setOCP(100);
}
写入寄存器(REG_PA_CONFIG,PA_BOOST |(级别-2));
}
}
无效 setOCP (uint8_t mA)
{
UINT8_t ocpTrim =27;
IF (mA <= 120)
{
八角微调=(mA - 45)/ 5;
}
否则(mA <=240)
{
八角微调=(mA + 30)/ 10;
}
WriteRegister (REG_OCP,0x20 |(0x1F 和 ocpTrim));
}
空闲()
{
写入寄存器(REG_OP_MODE,MODE_LON_RANGE_MODE | MODE_STDBY);
}
无效休眠()
{
写入寄存器(REG_OP_MODE,MODE_LON_RANGE_MODE | MODE_SLEEP);
}
void setFrequency (长频率)
{
频率=频率;
UINT64_t f法国 法郎=((uint64_t)频率<<19)/32000000;
写入寄存器(REG_FR_MSB,(uint8_t)(FF.>16));
写入寄存器(REG_FR_MID,(uint8_t)(f法国 法郎>> 8));
写入寄存器(REG_FL_LSB,(uint8_t)(FF.>0));
}
UINT8_t 读寄存器(uint8_t 地址)
{
返回单个传输(地址和0x7f,0x00);
}
无效写入寄存器(uint8_t 地址,uint8_t 值)
{
SingleTransfer (地址| 0x80,值);
}
UINT8_t 单路传输(uint8_t 地址,uint8_t 值)
{
UINT8_t RV;
mySPI.begin();
Pin 模式(芯片选择引脚,输出);
DigitalWrite (芯片选择针脚,低);
mySPI.transfer (地址);
RV = mySPI.transfer (数值);
DigitalWrite (芯片选择针脚,高);
返回 RV;
}