EC600U_esp32_iap_uart/EC600U_lora/lora.c
2024-02-05 17:39:56 +08:00

321 lines
7.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "./inc/user.h"
#include "./inc/lora.h"
#include "ql_api_osi.h"
#include "ql_log.h"
#define LOGI(msg, ...) QL_LOG(QL_LOG_LEVEL_INFO, "lora", msg, ##__VA_ARGS__)
extern unsigned char * write_buf;
extern unsigned char * read_buf;
uint16_t syncword;
uint8_t PacketParams[6] = {0};
uint16_t lora_get_syncword(void)
{
if(lora_read_register(LORA_SYNCWORD,2)){
uint16_t syncword = read_buf[4] << 8 | read_buf[5];
return syncword;
}
return 65535;
}
void lora_set_standby(uint8_t data)
{
lora_write_cmd(0x80,&data,1);
}
void lora_set_RfSwitchCtrl(uint8_t enable)
{
lora_write_cmd(LORA_SET_RFSWITCHMODE,&enable,1);
}
void lora_set_calibrate(uint8_t param)
{
lora_write_cmd(LORA_SET_CALIBRATE,&param,1);
}
void lora_set_regulator(uint8_t param)
{
lora_write_cmd(LORA_SET_REGULATORMODE,&param,1);
}
void lora_set_bufferBaseAddress(uint8_t tx_base_add,uint8_t rx_base_add)
{
uint8_t data[2] = {tx_base_add,rx_base_add};
lora_write_cmd(LORA_SET_BUFFERBASEADDRESS,data,2);
}
void lora_set_PaConfig(uint8_t paDutyCycle,uint8_t hpMax,uint8_t deviceSel,uint8_t paLut)
{
uint8_t data[4] = {paDutyCycle,hpMax,deviceSel,paLut};
lora_write_cmd(LORA_SET_PACONFIG,data,4);
}
void lora_set_OverCurrentProtection(float max_current)
{
if((max_current >= 0.0)&&(max_current <= 140.0)){
uint8_t data = (uint8_t)(max_current*2/5);
lora_wrtie_register(LORA_SET_OCP,&data,1);
}
}
void lora_set_TX(uint8_t power,uint8_t rampTime)
{
if(power > 22) power = 22;
if(power < -3) power = -3;
uint8_t data[2] = {power,rampTime};
lora_write_cmd(LORA_SET_TX_PARAMS,data,2);
}
void lora_set_calibrateImage(uint32_t freq)
{
uint8_t calFreq[2] = {0,0};
if( freq > 900000000 ){
calFreq[0] = 0xE1;
calFreq[1] = 0xE9;
}else if( freq > 850000000 ){
calFreq[0] = 0xD7;
calFreq[1] = 0xDB;
}else if( freq > 770000000 ){
calFreq[0] = 0xC1;
calFreq[1] = 0xC5;
}else if( freq > 460000000 ){
calFreq[0] = 0x75;
calFreq[1] = 0x81;
}else if( freq > 425000000 ){
calFreq[0] = 0x6B;
calFreq[1] = 0x6F;
}
lora_write_cmd(LORA_SET_CALIBRATEIMAGE,calFreq,2);
}
void lora_set_RfFreq(uint32_t freq)
{
lora_set_calibrateImage(freq);
uint32_t frequence = (uint32_t)((double)freq/(double)FREQ_STEP);
uint8_t data[4] = {0,0,0,0};
data[0] = (uint8_t)((frequence>>24)&0xff);
data[1] = (uint8_t)((frequence>>16)&0xff);
data[2] = (uint8_t)((frequence>>8)&0xff);
data[3] = (uint8_t)(frequence&0xff);
lora_write_cmd(LORA_SET_RFFREQ,data,4);
}
void lora_stop_rxTimerRonpreamble(uint8_t enable)
{
//取反
enable = !enable;
lora_write_cmd(LORA_SET_STOPRXTIMERONPREAMBLE,&enable,1);
}
void lora_set_symbNumTimeout(uint8_t symbNum)
{
lora_write_cmd(LORA_SET_SYMBNUMTIMEOUT,&symbNum,1);
}
void lora_set_packetType(uint8_t type)
{
lora_write_cmd(LORA_SET_PACKETTYPE,&type,1);
}
void lora_set_modulationParams(uint8_t spreadingFactor,uint8_t bandwidth,uint8_t codingRate,uint8_t lowDataRateOptimize)
{
uint8_t data[4] = {spreadingFactor,bandwidth,codingRate,lowDataRateOptimize};
lora_write_cmd(LORA_SET_MODULATIONPARAMS,data,4);
}
uint8_t* lora_get_packetParams(uint16_t preambleLength,uint8_t payloadLen,uint8_t crcOn,uint8_t invertIrq)
{
PacketParams[0] = (preambleLength >> 8)&0xFF;
PacketParams[1] = preambleLength;
if(payloadLen){
PacketParams[2] = 0x01;
PacketParams[3] = payloadLen;
}else{
PacketParams[2] = 0x00;
PacketParams[3] = 0xFF;
}
if(crcOn){
PacketParams[4] = 0x01; //inverted
}else{
PacketParams[4] = 0x00; //standard
}
if(invertIrq){
PacketParams[5] = 0x01;
}else{
PacketParams[5] = 0x00;
}
return PacketParams;
}
void lora_set_IQ_Polarity(uint8_t iqConfig)
{
//获取当前寄存器数据
lora_read_register(0x0736,1);
uint8_t iqConfigCurrent = read_buf[0];
if(iqConfig == 0x01){//inverted
iqConfigCurrent &= 0xFB;
}else{
iqConfigCurrent |= 0x04; //standard
}
lora_wrtie_register(0x0736,&iqConfigCurrent,1);
}
void lora_set_packetParams(uint8_t * packetParams)
{
lora_write_cmd(LORA_SET_PACKETPARAMS,packetParams,6);
}
void lora_set_DioRiqConfig(uint16_t irqMask, uint16_t dio1, uint16_t dio2, uint16_t dio3)
{
uint8_t buf[8] = {0};
buf[0] = (uint8_t)((irqMask >>8)&0x00FF);
buf[1] = (uint8_t)(irqMask & 0x00FF);
buf[2] = (uint8_t)((dio1 >>8)&0x00FF);
buf[3] = (uint8_t)(dio1 & 0x00FF);
buf[4] = (uint8_t)((dio2 >>8)&0x00FF);
buf[5] = (uint8_t)(dio2 & 0x00FF);
buf[6] = (uint8_t)((dio3 >>8)&0x00FF);
buf[7] = (uint8_t)(dio3 & 0x00FF);
lora_write_cmd(LORA_SET_DIO_IRQ_CONFIG,buf,8);
}
uint8_t lora_get_status(void)
{
lora_read_cmd(LORA_GET_STATUS,1);
return (uint8_t)read_buf[0];
}
int lora_set_Rx(uint32_t timeout)
{
lora_set_standby(0x00);
uint8_t buf[3] = {0};
buf[0] = (uint8_t)((timeout >> 16) & 0xFF);
buf[1] = (uint8_t)((timeout >> 8) & 0xFF);
buf[2] = (uint8_t)(timeout & 0xFF);
lora_write_cmd(LORA_SET_RX,buf,3);
for(int i = 0; i < 10; i++){
if((lora_get_status()&0x70) == 0x50){ //01110000,
return 1; //01010000 所以状态为0x20
}
ql_delay_us(1000);
}
return 0;
}
uint16_t lora_get_irq_status(void)
{
lora_read_cmd(LORA_GET_IRQSTATUS,3);
return (uint16_t)((read_buf[2] << 8) | read_buf[3]);
}
void lora_clear_irq_status(uint16_t irq_status)
{
uint8_t buf[2] = {0};
buf[0] = (uint8_t)((irq_status >>8)&0x00FF);
buf[1] = (uint8_t)(irq_status & 0x00FF);
lora_write_cmd(LORA_CLEAR_IRQSTATUS,buf,2);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int lora_init(void)
{
transfer_buf_init();
int err = lora_gpio_init();
if(err != 1){
LOGI("lora_gpio_init fail,err = %d\n",err);
return 0;
}
err = lora_spi_init();
if(err != 1){
LOGI("lora_spi_init fail,err = %d\n",err);
return 0;
}
lora_reset();
return 1;
}
int lora_start(void)
{
/*获取同步字并判断*/
syncword = lora_get_syncword();
if(syncword != LORA_SYNCWORD_1 && syncword != LORA_SYNCWORD_2){
LOGI("syncword 0x%02X is error\n",syncword);
return 0;
}
/*设置standby为RC模式*/
lora_set_standby(LORA_STANDBY_RC);
/*启用RF开关控制*/
lora_set_RfSwitchCtrl(1);
/*设置射频校准*/
lora_set_calibrate(0b01111111);
/*设置电源为DCDC模式*/
lora_set_regulator(REGULATOR_DCDC);
/*设置缓冲区基地址*/
lora_set_bufferBaseAddress(0,0);
/*配置功率放大器*/
lora_set_PaConfig(0x04,0x07,0x00,0x01); //+22dBM
/*设置过流保护*/
lora_set_OverCurrentProtection(60.0);
/*设置发送参数*/
lora_set_TX(20,0x04);//默认20发送功率渐变200us
/*设置射频频率*/
lora_set_RfFreq(RF_FREQ);
return 1;
}
int lora_radioConfig(void)
{
/*不禁用接收定时器*/
lora_stop_rxTimerRonpreamble(0);
/*设置超时参数*/
lora_set_symbNumTimeout(0);
/*设置数据包类型*/
lora_set_packetType(0x01);//lora模式
/*设置射频调制参数*/
lora_set_modulationParams(7,4,1,0);
/*配置数据包参数*/
uint8_t *packetParams = lora_get_packetParams(8,0,1,0);
/*设置射频接收IQ极性*/
lora_set_IQ_Polarity(packetParams[5]);
/*设置数据包参数*/
lora_set_packetParams(packetParams);
/*配置数字输入输出中断*/
lora_set_DioRiqConfig(1023,2,0,0);//0b1111111111,0b0000000010
/*设置接收模式为RX连续模式*/
if(lora_set_Rx(0xFFFFFF) == 0) return 0;
return 1;
}