查看: 372|回复: 0

[应用笔记] SX1208模组软件移植

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2023-12-6 10:45:15 | 显示全部楼层 |阅读模式
  一、背景

  本文档介绍利尔达SX1208平台模组如
  LSD4RF-2S313N10
  LSD4RF-2S313N20
  LSD4RF-2S813N10
  LSD4RF-2X717N10
  LSD4RF-2X817N10
  在使用中常规的软件移植过程。

  二、过程

  1、SX1208系列模组移植过程


  1.1 核对原理图和PCB是否真实对应


  产品硬件设计是一定要仔细核对MCU的IO和SX1208模组的IO链接的顺序原理图是否和PCB真实对应。

  LSD4RF-2S313N20为例

  检查时,先不要焊接模组。

  先用万用表或者示波器测试下连接模组的MCU的输出IO(RST、SCK、MOSI、NSS)是否都能正常输出高低电平。并测试下连接模组的MCU的输入IO(DIO0、MISO)是否都能正确识别到高低电平。
万用表或者示波器测试点一定链接到模组的封装的PAD上,用来确认原理图和真实的PCB的接线是否真实对应。

  该测试目的:实际应用中遇到过使用者的原理图和PCB没有真实对应的情况。比如有客户的原理图的MISO连接的是MCU的P2.2,但是真实的PCB实际连接的是P2.7的情况。该测试用来排除MCU和模组的PCB真实连接和原理图不对应的情况。

  2、软件移植时请先使用软件SPI

  软件移植时请先使用软件SPI进行移植,待模组收发全部调通之后再切换成硬件SPI。

  SX1208的软件SPI时序示意代如下:

  static unsigned char LSD_RF_SpiInOut (unsigned char mosi)
  {
   unsigned char i;
   unsigned char onebyte;
   onebyte = mosi;
   for(i = 8; i > 0; i--)
   {
    LSD_RF_DELAY();
    if(onebyte & 0x80)
    {
     LSD_SPI_SIMO_OUT(1);
    }
    else
    {
     LSD_SPI_SIMO_OUT(0);
    }

    LSD_RF_DELAY();
    LSD_SPI_SCK_OUT(1);
    onebyte <<= 1;   
    if(LSD_SPI_SOMI_IN())
    {
     onebyte++;      
    }
    LSD_RF_DELAY();
    LSD_SPI_SCK_OUT(0);
   }
   return onebyte;         
  }

  该软件时序对应如下SX208的PSI时序。

  先使用软件SPI的原因是,客户在实际使用中遇到过硬件SPI配置时序不符合要求,或者MCU的硬件SPI库有问题等情况。

  3、选定模组版本

  复位和SPI读写调试完毕后,要先再软件中选定模组版本。

  在LSD_RFregsetting.h文件中选定VERSION的值
  #define  LSD4RF_2X717N10  1
  #define  LSD4RF_2S313N10  2
  #define  VERSION  LSD4RF_2S313N10
  如果模组是LSD4RF-2S313N10、LSD4RF-2S313N20、LSD4RF-2S813N10小功率(13dBm)模组VERSION值选LSD4RF_2S313N10。
  如果模组是LSD4RF-2X717N10、LSD4RF-2X817N10大功率(20dBm)模组VERSION值选LSD4RF_2X717N10。版本选定后还需要在件上选定适配各款模组的频点。
  具体在代码中的static const unsigned char Freq_Cal_Tab[]频点寄存器数组中选定。

  4、调试接收函数

  先不要打开MCU和SX1208模组连接的DIO0的中断(并关闭所有RF的DIO的中断),把所有MCU连接的SX1208的DIO都定义为输入状态。

  SX1208在主循环while(1)前完成初始化后,调用LSD_RF_RXmode_FSK();让SX1208进入RX状态。并在while(1)中先不停的扫描DIO0,并做成如下验证接收的函数代码。
  while (1)
  {
   while (1)
   {
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
     uint8_t flag;
     SX1208_Read(REG_IRQFLAGS2, &flag);
     if(flag & 0x04)//communication_states = RX_DONE;
     {
      LSD_RF_RxPacket_FSK(data_buffer, &data_len);  
      __NOP();
      LSD_RF_RXmode_FSK();
     }
     else
     {
      __NOP();        
      LSD_RF_RXmode_FSK();        
     }
    }
   }
  }

  然后测试SX1208接收电流是否为16mA左右的正常接收电流。如果收到数据包则代码一定会进入if(flag & 0x04)中。

  5、调试发送函数

  将上边已经做好的接收调试函数的主循环改为如下:

  while (1)
  {
   LSD_RF_SendPacket_FSK(data_buffer,data_len);
   while (1)
   {
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
     uint8_t flag;
     SX1208_Read(REG_IRQFLAGS2, &flag);
     if(flag & 0x08)//communication_states = TX_DONE;;
     {
      __NOP();
      break;
     }
     else
     {
      __NOP();        
     }
    }
   }
   delayms(4000);
  }

  如果正常发送完毕则代码一定会进入到if(flag & 0x08)中。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表