ForestRain
ForestRain
This guy hasn't written anything yet

注册于 1 year ago

回答
11
文章
11
关注者
6

  1. lora-radio-driver使用了系统的spi设备(用到了mutex),因此涉及SX1268 SPI的读写不能放在中断环境中
  2. 解决方式之一是通过事件(rt_event)来传递RF中断事件,然后在线程中处理原本在ISR执行的内容,可以参考下lora-radio-driver\samples

  1. 使用的是哪个网关,最好提供下网关的相关日志

    • 先确认下网关是否有正确转发(比如join-accept)
  2. 抓一些设备端从上电后的完整日志信息,建议把ulog组件也使能@heisewangluo

可以参考下lorawan-ed-stack软件包,当前支持LoRaWAN1.0.x,
MCU当前主要适配了STM32L0\STM32L4\STM32H7平台

  1. 实验下ART-PI做slaver,LSD4RF-TEST2002做master,是否可以单向或者双向通信?
  2. 从日志来看,SPI通信OK,检查下rtconfig.h文件中DIO0等引脚号是否确实跟上述图片内容一致
  3. 另外注意两个设备需要连接好天线,同时不要靠的太近

  1. 对的,正如你所分析,rt-thread spi的接口使用了互斥量(mutex),而mutex不同在中断环境中使用
  2. 这个问题是lora-radio-driversx127x的bug,

https://github.com/Forest-Rain/lora-radio-driver master已更新,有问题欢迎PR ^-^

  1. 触发TX\RX timeout,说明当前radio发送可能出现了问题,检查下DIO0等引脚的配置
  2. lora-radio-driver当前使用事件集来管理所有radio相关中断,解决方式如下:

4.1 lora-radio.h 新增tx\rx timeout事件

/*!
 * Radio Dio Irq event definition
 */
typedef enum
{
    EV_LORA_RADIO_IRQ0_FIRED       =   0x0001,
    EV_LORA_RADIO_IRQ1_FIRED       =   0x0002,
    EV_LORA_RADIO_IRQ2_FIRED       =   0x0004,
    EV_LORA_RADIO_IRQ3_FIRED       =   0x0008,
    EV_LORA_RADIO_IRQ4_FIRED       =   0x0010,
    EV_LORA_RADIO_IRQ5_FIRED       =   0x0020,
    EV_LORA_RADIO_TIMEOUT_FIRED    =   0x0040, /* sx127x tx\rx timeout*/
}RadioDioIrqEvent_t;

4.2 lora-radio-sx127x.c 新增tx\rx timeout事件触发

void SX127xOnTimeoutIrqEvent( void *args )
{
#ifdef LORA_RADIO_DRIVER_USING_ON_RTOS_RT_THREAD
    rt_event_send(&lora_radio_event, EV_LORA_RADIO_TIMEOUT_FIRED);
#endif
}

4.3 sx127x.c 新增tx\rx timeout回调函数

/*!
 * Hardware DIO IRQ callback initialization
 */
static DioIrqHandler *SX127xDioIrq[] = { SX127xOnDio0Irq, SX127xOnDio1Irq,
                                          SX127xOnDio2Irq, SX127xOnDio3Irq,
                                          SX127xOnDio4Irq, NULL, 
                                          SX127xOnTimeoutIrq };

4.4 sx127x.c tx\\rx timeou回调函数初始化

void SX127xInit( RadioEvents_t *events )
{
    // Initialize driver timeout timers
#ifdef LORA_RADIO_DRIVER_USING_ON_RTOS_RT_THREAD    
    TimerInit( &TxTimeoutTimer, SX127xOnTimeoutIrqEvent );
    TimerInit( &RxTimeoutTimer, SX127xOnTimeoutIrqEvent );
    TimerInit( &RxTimeoutSyncWord, SX127xOnTimeoutIrqEvent );
#else
    TimerInit( &TxTimeoutTimer, SX127xOnTimeoutIrq );
    TimerInit( &RxTimeoutTimer, SX127xOnTimeoutIrq );
    TimerInit( &RxTimeoutSyncWord, SX127xOnTimeoutIrq );
#endif 
}

  1. 可以先确认下SPI外设的主频是否正确
  2. 通过实验测试下SPI连续读写是否正常
  3. 查看系统中,有没有比lora_radio_thread优先级更高的任务复用SPI

最好提供些调试日志信息

有一个想法是针对需要低功耗且处理任务较轻的事件触发型场景(可应用在rt-thread nano),提供如下一种模式————os tick来自低功耗定时器(LPTIM),同时内核提供实时的64位低功耗软件定时器扩展,这样的话,可不需要tickless,低功耗设备应用起来也会比较方便

  1. STM32F40x系列192K SRAM中有64K特殊RAM(即CCM),只能内核使用image1.png
  2. CCM(Core Coupled Memory)是给F4内核专用的全速64KB RAM, CCM没有经过总线矩阵, F4内核(通过D-Bus)与之直接相连, 地址空间在0x1000 0000 ~ 0x1000 FFFF.image2.png
  3. 由于CCM地址空间和常规的SRAM不连续, DMA和外设无法直接使用,CCM一般都要手动分配资源,确保这块内存不被外设使用
  4. 可根据实际情况设计,将CCM用于RTOS堆栈、高速运算缓存(JPEG编码/解码)等
  5. 参考如下文章[《STM32 之五 Core Coupled Memory(CCM)内存》]

(https://blog.csdn.net/zcshoucsdn/article/details/79176306)

  1. 从日志来看,显示的是 PHY TxTimeout PHY RxTimeout ,检查下DIO0等引脚配置,TXDONE与RXDONE依赖于DIO0的中断信号
  2. 用户radio接收函数接口
void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )

@h1044812458

  1. 针对STM32平台,通过CubeMX使能您的硬件平台所使用的SPI外设(比如SPI1)及其引脚(SCK,MISO,MOSI)(比如在STM32L4,在stm32l4xx_hal_msp.c 会自动包含SPI外设的初始化)
  2. 参考 sample / lora-radio-test.c
    ...
      // Radio initialization
    RadioEvents.TxDone = OnTxDone;
    RadioEvents.RxDone = OnRxDone;
    RadioEvents.TxTimeout = OnTxTimeout;
    RadioEvents.RxTimeout = OnRxTimeout;
    RadioEvents.RxError = OnRxError;
    
    Radio.Init( &RadioEvents );

回到
顶部

发布
问题

投诉
建议