This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:在 CCS/Energia 中使用 tm4c123的 Lora

Guru**** 2536410 points
Other Parts Discussed in Thread: ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1076704/tm4c123gh6pm-lora-with-tm4c123-in-ccs-energia

部件号:TM4C123GH6PM
“线程”中讨论的其它部件:TM4C123ENERGIA

//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;
}