目录
第一组数据采用LORA扩频因子10,发射功率20dBm,带宽126Khz,前导码20,跳频150Khz,起始频率434Mhz,CRC开,编码率4/5,低空速优化开,同步字一个字节。
总结:1278收发较为简单,但参数较少,现在有二代LORS,sx1262稍微看了一眼文档里面的跳频操作比这个复杂,过几天就研究一下
前言
最近在用EBYTE家的E32-400M22S模块(LORA_SX1278),用作跳频操作,但在国内资料中很少提起,所以在此做记录。
一、LORA_SX1278
此为semtech家生产的芯片,除此之外还有sx1262等,1278是最早的一批叫做一代lora,他家很奇怪代码越小出的越晚。SX126X和SX127X差的很大,SX126X采用指令的形式而SX127X仍是往寄存器里送数值。
官网:
Semtech Semiconductor, IoT Systems and Cloud Connectivity | Semtech
二、E32-400M22S
ebyte家的模块,MCU用的stm8有工程DEMO,但用的IAR-STM8,不太习惯。https://www.ebyte.com/,网站有sx1278的文档但版本较早缺少很多有用的信息,建议看semtech的版本。
三、FHSS(跳频)
跳频表示为FHSS,翻阅手册找到如下解释
操作:
- standby模式设置一些基本参数
- 寄存器0x24写入非零数值
- 打开FHSS中断
- 打开RX或者TX模式
- 在RX或TX模式检测FHSS中断是否产生
- 若产生中断,要写入新的频率。没有FHSS则继续检测(若开启FH功能则必定会切换信道)
- 一定要清除FHSS中断
- 检测是否有RX,TX中断,若有则接收或者发送结束
描述:
文档里面很简单就这一段表述,可以知道0x24寄存器写入非零数值即可启动FHSS,这个数值又称为在信道停留时间,建议的>4。实测1和2都产生了信道混乱,因为时间太短无法完成跳频设置的功能。3中注意打开中断的时候不要忘记要把RX TX也打开,我在第一次操纵的时候覆盖了RXTX。4.就是正常操作模式没有什么需要注意的。5.我在发射端采用DO_WHILE编程,在死循环检测FHSS的中断,若产生RX中断则跳出循环。在接收端采用IF编程,之前采用而是DO_WHILE后才发现有时候会写死,跑不出来了。6.写入频率这个过程要快,所需时间越短越好,频率可在循环外提前计算好。
下面附上收发方的时序图
在图中,可以看到箭头所指为FHSS中断,故在每个信道开始前产生而不是在信道结束的时候产生,这是较为重要的一点。收发双方的0X24中信道停留时间即hoppingperiod此处保证了双方的时序同步。信道0中放的是前导码和同步字。
手册里还有一张图
这张图我并没有将他实现到代码里面。
四、代码实现
const uint32e_t fre_list[]= //频率表存放跳频频率,其中起始频率为434MHz为信道0,每次跳1MHz { , //channel 1 , //channel 2 , , , , , , , , , , , , }; uint8e_t num_hop_channel = 15; //表中就15个信道 static uint8e_t config_tx[45]; //num_hop_channel*3,上表中每个信道要占用3个字节 uint32e_t freq_tx; /初始化只需运行一次*/ void HOP_INIT() { uint8e_t i=0; for(i=0;i<num_hop_channel;i++) { freq_tx = ( uint32e_t )( ( double )fre_list[i] / ( double )FREQ_STEP ); config_tx[i*3] = ( uint8e_t )( ( freq_tx >> 16 ) & 0xFF ); config_tx[i*3+1] = ( uint8e_t )( ( freq_tx >> 8 ) & 0xFF ); config_tx[i*3+2] = ( uint8e_t )( freq_tx & 0xFF ); } } /*此为EBYTE中函数,我在其中更改*/ uint8e_t E32x_GoTransmit( uint8e_t* data, uint8e_t size ) { static uint8e_t Hop_channel=0; uint8e_t irqStatus = 0; /* 模式切换:待机 */ E32x_SetStby(); /* off跳频 寄存器地址:0x24 */ E32x_SetRegister( 0x24,4 ); /* 设置数据包长度 寄存器地址:0x22 */ E32x_SetRegister( 0x22, size ); /* FIFO:发送区 发送地址从128开始 寄存器地址:0x0E */ E32x_SetRegister( 0x0E, 0x80 ); /* FIFO:发送区 SPI写入地址从128开始 寄存器地址:0x0D */ E32x_SetRegister( 0x0D, 0x80 ); /* FIFO:写入发送数据 */ E32x_SetFIFO( data, size ); /* 设置GPIO映射 这里配置DIO0映射到TxDone 即触发发送完成中断 本例程采用轮询读取模块内部标志位的方式来判断是否发送完成。所以,IO配置了也没用到。 如需考虑中断,需要配置宏定义 EBYTE_TRANSMIT_MODE_BLOCKED 并自行做IO中断处理 */ E32x_SetGPIO( 0x40, 0x40 ); /* IO: 开启发送电路 */ E32X_SetAntenna( ANTENNA_TXEN ); /* 允许发送中断 */ E32x_SetIRQ( IRQ_TXDONE ); /* 清除中断标识 */ E32x_ClearIRQ(); /加入跳频模式*/ E32x_SetIRQ( 0x0a ); //允许发送跳频中断 /* 切换为发送模式 */ E32x_SetTransmit(); /* 阻塞 等待发送完成 */ do { irqStatus = E32x_GetIRQ(); /* 读取模式控制寄存器 寄存器地址:0x01 */ if(irqStatus & IRQ_FHSSCHANGEDCHANNEL) //产生跳频中断,提示当前信道发送完毕要跳频到下一信道 { Hop_channel =( E32x_GetRegister( 0x1c )&0x3f); //读取当前信道标号bit0~5为信道号 //更改新的频率 E32x_SetRegisters( 0x06, config_tx+Hop_channel*3, 3 ); //寄存器起始地址:0x06 共计3字节,采用当前信道号的方法去取频率表中的数据 // DEBUG( "\r\n CHANNEL : %d %d",Hop_channel,irqStatus ); //直接串口打印出来,但耗时间后来采用下面方法 buff_tx_texxt[Hop_channel]=Hop_channel; //先存储当前信道号,在循环外串口调试出来测试 E32x_SetRegister( 0x12,( 0x02&irqStatus)); //清除中断当前位的中断不是全部 } } while( ( !( irqStatus & IRQ_TXDONE ) ) ); /* 到此发送完成 清除中断 */ E32x_ClearIRQ(); /* 待机 */ E32x_SetStby(); DEBUG( "\r\n TXDONE " ); /* 回调用户处理函数 */ Ebyte_Port_TransmitCallback( 0x0001 ); return 0; }
初次之外还需要注意,本代码若超过15个信道则发生乱码,并没有进行循环处理,除此之外还需要注意,sx1278中存储当前信道号的寄存器中 仅有5位保存,即只能64个信道,每次发生FHSS中断自增一,下次就是信道0,但我不知道是否影响其内部操作,如果不影响则跳频信道数还能往上加,加到FIFO的最大值没什么问题。
除此之外查阅资料,还有人写了代码GitHub - nimaltd/sx1278: sx1278 LoRa driver for Stm32 HAL
基于stm32移植性很高可以操作,比我写的好多了。
五、实验测试
下面将给出两组数据,
第一组数据采用LORA扩频因子10,发射功率20dBm,带宽126Khz,前导码20,跳频150Khz,起始频率434Mhz,CRC开,编码率4/5,低空速优化开,同步字一个字节。
1.发送字符1,信道占用0~4,其中信道0已知是前导码
很奇怪的是信道1并没有数据,接收也正常
2.前提条件不变,发射1234,四个字节数据。占用信道0~6
3.前提条件不变,发送八个字节,占用信道0~7
第二组数据采用LORA扩频因子7,发射功率20dBm,带宽500Khz,前导码10,跳频1Mhz,起始频率434Mhz,CRC开,编码率4/5,低空速优化开,同步字一个字节。发送1个字节需要8ms,计算器在sem官网有。
1.发送一个字节,占用信道0~6,大约8ms
这个与第一组数据对比可以知道信道1也被使用了,不知道为什么之前那个不行
2.发送四字节数据,占用信道0~7,大约10ms
速度很快
由于0X24寄存器中写入的是4,即HOPPINGPERIOD
总结:1278收发较为简单,但参数较少,现在有二代LORS,sx1262稍微看了一眼文档里面的跳频操作比这个复杂,过几天就研究一下
个人邮箱
今天的文章 LORA_SX1278跳频_E32-400M22S(EBYTE模块)分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/92971.html