大家好、
我现在请大家发言、因为我在使两个 LoRa 器件相互通信方面遇到了问题。
我购买了两个 SX1261DVK1BAS 开发套件、并将其中一个套件分开、将 SX1261卡集成到 TM4C129的卡中。
目标是让主器件与 TM4C129配合使用、让从器件与第二个开发套件配合使用。
我对这些参数进行了相同的配置、以便允许它们进行通信。
我的问题是、当我尝试发送第一个信号时、第二个信号不接收任何信号、当我发送第二个信号时、第一个信号也不接收任何信号。
但是,我认为我在初始化级别做了正确的事情,端口和主端口的配置...
我有点绝望、真的不知道如何解决问题。
非常感谢你的帮助
初始化:
void SX126x IoInit( void )
{/*
CS */
MAP_GPIOPinTypeGPIOOutput (RADIO_NSS);//output
GPIOPinWrite (radio_NSS、GPIO_PIN_4);//mise à 1 de la pin
//忙
GPIOPinWrite (RADIO_BUSY、0);//mise à 0 DE LA 引脚
MAP_GPIOPinTypeGPIOInput (RADIO_BUSY);//输入
GPIOPadConfigSet (RADIO_BUSY、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);//上拉已启用
// IRQ */
MAP_GPIOPinTypeGPIOInput (RADIO_DIO_1);//输入
GPIOPinWrite (RADIO_DIO_1、0);//mise à 0 de la 引脚
MAP_GPIOIntEnable (RADIO_DIO_1);
GPIOPadConfigSet (RADIO_DIO_1、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);//上拉启用
/* ANT SW*/
GPIOPinWrite (RADIO_ANT_SWITCH_POWER、0);//mise à 0 de la 引脚
MAP_GPIOPinTypeGPIOOutput (RADIO_ANT_SWITCH_POWER);//output
/* reset *
GPIOPinWrite (RADIO_RESET、0);//mise à 0 de la 引脚
MAP_GPIOPinTypeGPIOOutput (RADIO_RESET);
/* SPI SSI1 */
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
GPIOPinConfigure (GPIO_PB5_SSI1CLK);
GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);// MOSI (TX)
GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);// MISO (RX)
GPIOPinTypeSSI (SPI_CLOCK);
GPIOPinTypeSSI (SPI_MOSI);
GPIOPinTypeSSI (SPI_MISO);
SSIConfigSetExpClk (SSI1_base、
HRD_u32SysClock、
SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、
SX126x_bit_rate、
SX126x_data_lenight);
SSIEnable (SSI1_base);
}
void SX126xIoIrqInit (void)
{
MAP_IntEnable (INT_GPIOC);
MAP_GPIOIntTypeSet (RADIO_DIO_1、GPIO_RISE_EDGE);
MAP_IntPrioritySet (INT_GPIOC、(6 << 5));
}
void SX126x 重置( void ){
HRD_vdDelayM(10);
MAP_GPIOPinWrite (RADIO_RESET、0);
HRD_vdDelayM(20);
MAP_GPIOPinWrite (RADIO_RESET、GPIO_PIN_4);
HRD_vdDelayM(10);
}
void SX126xAntSwOn( void ){
GPIOPinWrite (RADIO_ANT_SWITCH_POWER、GPIO_PIN_2);//mise à 1 de la 引脚
}
void SX126x AntSwoff (void)
{
GPIOPinWrite (RADIO_ANT_SWITCH_POWER、0);//mise à 0 de la 引脚
}
主要:
const uint8_t PingMsg[]="ping";
const uint8_t PongMsg[]="pong";
uint16_t BufferSize = buffer_size;
uint8_t Buffer[buffer_size];
states_t State = LOWPOWER;
INT8_t RssiSize = 0;
INT8_t SnValue = 0*!
*无线电事件函数指针
*/
static RadioEvents _t RadioEvents;
/*!
*\brief 函数在无线电 Tx DONE 事件上执行
*/
void OnTxDone (void)
{
radio.sleep();
状态= TX;
}
/*!
*\brief 函数,在无线电接收完成事件上执行
*/
void OnRxDone (uint8_t *有效负载、uint16_t 大小、int16_t RSSI、INT8_t SNR)
{
radio.sleep();
buffersize =大小;
memcpy( Buffer, PAYLOAD, BufferSize );
RsiValue = RSSI;
SnrValue = SNR;
状态= RX;
}
/*!
*\brief 功能在无线电 Tx 超时事件上执行
*/
void OnTxTimeout( void ){
radio.sleep();
状态= TX_TIMEOUT;
}
/*!
*\brief 功能在 Radio Rx Timeout 事件上执行
*/
void OnRxTimeout( void ){
radio.sleep();
状态= RX_TIMEOUT;
}
/*!
*\brief 功能在无线电接收错误事件上执行
*/
void OnRxError( void ){
radio.sleep();
状态= RX_ERROR;
}
void LoRA_Task (void * pvParrameters)
{
bool isMaster = true;
uint8_t i;
//目标板初始化
SX126x IoInit();
// SSI1_init_DYN ();
//无线电初始化
RadioEvents.TxDone = OnTxDone;
RadioEvents.RxDone = OnRxDone;
RadioEvents.TxTimeout = OnTxTimeout;
RadioEvents.RxTimeout = OnRxTimeout;
RadioEvents.RxError = OnRxError;
Radio.Init(无线电通风口);
radio.SetChannel( rf_frequency );
radio.SetTxConfig (MODE_Lora、TX_OUTPUT 功率、0、Lora 带宽、
Lora_Spreading_factor、Lora_CODINGRATE、
Lora_帧 头_length、Lora_fix_length_payload_on、
true、0、0、Lora IQ_翻转_on、3000);
radio.SetRxConfig (MODEM_Lora、LROA_bandwidth、LROA_Spreading_factor、
LOLA_CODINGRATE、0、LOLA_PREAMING_LENGTH、
Lora_symbol_timeout、Lora_fix_length_PAYLOAD_ON、
0、true、0、0、Lora_iq_in翻转_on、 true );
radio.rx( RX_TIMEOUT_VALUE );
while (1)
{
Switch(状态)
{
案例 RX:
if (isMaster == true)
{
if (BufferSize >0)
{
if (strncmp( const char*) Buffer,( const char*) PongMsg,4)=0)
{
//发送下一个 ping 帧
strcpy( charg*) Buffer ( char*) PingMsg );
//我们用有效载荷的数字填充缓冲区
for (i = 4;i < BufferSize;i++)
{
Buffer[i]= i - 4;
}
HRD_vdDelayMs(1000);
RADIO .Send (缓冲区、缓冲区大小);
}
否则 if (strncmp(( const char*) Buffer,( const char*) PingMsg,4)=0)
{//主设备已存在,然后成为从设备
isMaster = false;
//发送下一个乓帧
strcpy( charg*) Buffer ( char*) PongMsg );
//我们用有效载荷的数字填充缓冲区
for (i = 4;i < BufferSize;i++)
{
Buffer[i]= i - 4;
}
HRD_vdDelayMs(1000);
RADIO .Send (缓冲区、缓冲区大小);
}
else //接收有效,但不显示 ping 或 pong 消息
{//将设备设置为主设备应答再次开始
isMaster = true;
radio.rx( RX_TIMEOUT_VALUE );
}
}
其他
{
if (BufferSize >0)
{
if (strncmp( const char*) Buffer,( const char*) PingMsg,4)=0)
{
//将回复发送到 ping 字符串
strcpy( charg*) Buffer ( char*) PongMsg );
//我们用有效载荷的数字填充缓冲区
for (i = 4;i < BufferSize;i++)
{
Buffer[i]= i - 4;
}
HRD_vdDelayMs(1000);
RADIO .Send (缓冲区、缓冲区大小);
}
else //接收有效,但 ping 不符合预期
{//将器件设置为主器件并重新启动
isMaster = true;
radio.rx( RX_TIMEOUT_VALUE );
}
}
状态= LOWPOWER;
中断;
案例 TX:
if (isMaster == true)
{
//debug ("Ping ...\r\n");
}
其他
{
//debug ("Pong...\r\n");
}
radio.rx( RX_TIMEOUT_VALUE );
状态= LOWPOWER;
中断;
案例 RX_TIMEOUT:
if (isMaster == true)
{
//发送下一个 ping 帧
strcpy( charg*) Buffer ( char*) PingMsg );
for (i = 4;i < BufferSize;i++)
{
Buffer[i]= i - 4;
}
HRD_vdDelayMs(1000);
RADIO .Send (缓冲区、缓冲区大小);
}
其他
{
radio.rx( RX_TIMEOUT_VALUE );
}
状态= LOWPOWER;
中断;
RX_ERROR 案例:
//我们收到了一个带有 CRC 错误的数据包,像数据包正确一样发送应答
if (isMaster == true)
{
//发送下一个 ping 帧
strcpy( charg*) Buffer ( char*) PingMsg );
for (i = 4;i < BufferSize;i++)
{
Buffer[i]= i - 4;
}
HRD_vdDelayMs(1000);
RADIO .Send (缓冲区、缓冲区大小);
}
其他
{
//发送下一个乓帧
strcpy( charg*) Buffer ( char*) PongMsg );
for (i = 4;i < BufferSize;i++)
{
Buffer[i]= i - 4;
}
HRD_vdDelayMs(1000);
RADIO .Send (缓冲区、缓冲区大小);
}
状态= LOWPOWER;
中断;
案例 TX_TIMEOUT:
radio.rx( RX_TIMEOUT_VALUE );
状态= LOWPOWER;
中断;
案例 LOWPOWER:
中断;
默认值:
状态= LOWPOWER;
中断;
}
//处理无线电 IRQ
if (Radio.IrqProcess!= NULL)
{
radio.IrqProcess ();
}
HRD_vdDelayM(10);
}
}