|
一、背景
本文档介绍利尔达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
|