前言
一、ATK-LORA
ATK-LORA是正點(diǎn)原子推出的一款小體積、微功率、低功耗、高性能的遠(yuǎn)距離 LoRa 無(wú)線串口模塊,該模塊采用高效的 ISM 頻段射頻 SX1278 擴(kuò)頻芯片,其工作頻率為 410MHz~441MHz,信道以 1MHz 頻率為步進(jìn),共有 32 個(gè)信道,可在線修改模塊的串口速率、發(fā)射功率、空中速率、工作模式和自定義通訊密鑰等各種參數(shù)。ATK-MW1278D 模塊的各項(xiàng)基本參數(shù),如下表所示:
LORA模塊通過(guò) 6 個(gè) 2.54mm 間距的排針與外部相連接,方便用戶使用和調(diào)試,模塊外觀如下圖所示:
各個(gè)引腳的詳細(xì)描述,如下表所示:
二、AT指令集及工作模式
1. 一般模式
發(fā)射端: 在一般模式下,發(fā)射端模塊接收來(lái)自串口的用戶數(shù)據(jù),當(dāng)用戶數(shù)據(jù)的數(shù)據(jù)量達(dá)到 58 字節(jié)時(shí),發(fā)射端模塊將啟動(dòng)無(wú)線發(fā)射,此時(shí)用戶可以繼續(xù)輸入需要發(fā)射的數(shù)據(jù),當(dāng)用戶輸入的數(shù)據(jù)小于 58 字節(jié)時(shí),發(fā)射端模塊將等待 1 個(gè)字節(jié)的時(shí)間,若期間無(wú)用戶數(shù)據(jù)輸入,則將此時(shí)發(fā)射端模塊接收到的所有用戶數(shù)據(jù)通過(guò)無(wú)線發(fā)出。當(dāng)發(fā)射端模塊開始發(fā)送第一個(gè)用戶數(shù)據(jù)包的時(shí)候,發(fā)射端模塊的 AUX 引腳將輸出高電平,在發(fā)射端模塊發(fā)射出所有用戶數(shù)據(jù)后,發(fā)射端模塊的 AUX 引腳將輸出低電平,此時(shí)表明數(shù)據(jù)包已全部發(fā)出,用戶可以繼續(xù)通過(guò)串口輸出數(shù)據(jù)。在該模式下發(fā)出的數(shù)據(jù)包,可以被處于一般模式、喚醒模式、信號(hào)強(qiáng)度模式和中繼模式下的接收端模塊接收。
接收端: 在一般模式下,接收端模塊將一直打開無(wú)線接收功能,可以接收來(lái)自一般模式、喚醒模式和信號(hào)強(qiáng)度模式下的發(fā)射端模塊發(fā)出的數(shù)據(jù)包。在接收端模塊接收到數(shù)據(jù)包后,接收端模塊的 AUX 引腳將輸出高電平,隨后大約 2~3ms 后將接收到的數(shù)據(jù)包通過(guò)串口輸出給外部控制器,在所有的無(wú)線數(shù)據(jù)都通過(guò)串口輸出后,接收端的 AUX 引腳將輸出低電平。
2. 喚醒模式
發(fā)射端: 在喚醒模式下,發(fā)射端模塊的工作方式與一般模式下的發(fā)射端工作方式基本一致,唯一不同的地方在于,喚醒模式下的發(fā)射端模塊會(huì)在每個(gè)數(shù)據(jù)包前自動(dòng)地添加喚醒碼(喚醒碼地長(zhǎng)度取決于休眠時(shí)間的配置)。添加喚醒碼的目的是為了喚醒處于省電模式下的接收端模塊,因此處于喚醒模式下的發(fā)射端模塊相較于處于一般模式下的發(fā)射端模塊,發(fā)出的數(shù)據(jù)包能被處于省電模式下的接收端模塊接收。
接收端: 在喚醒模式下,接收端模塊的工作方式于處于一般模式下的接收端模塊一致。
3. 省電模式
發(fā)射端: 在省電模式下,發(fā)射端模塊將處于休眠狀態(tài),期間串口的接收功能將被關(guān)閉,無(wú)法接收來(lái)自外部串口的數(shù)據(jù),因此在該模塊下,發(fā)射端模塊不具有無(wú)線發(fā)射功能。
接收端: 在省電模式下,接收端模塊僅能接收來(lái)自喚醒模式下發(fā)射端模塊發(fā)出的無(wú)線數(shù)據(jù)。在該模式下,接收端模塊將會(huì)定時(shí)監(jiān)聽喚醒碼,一旦接收端模塊監(jiān)聽到有效的喚醒碼時(shí),接收端模塊將持續(xù)處于接收無(wú)線接收狀態(tài),待整個(gè)有效數(shù)據(jù)包接收完畢后,接收端模塊的AUX 引腳將輸出高電平,隨后大約 2~3ms 后將接收到的數(shù)據(jù)包通過(guò)串口輸出給外部控制器,在所有的無(wú)線數(shù)據(jù)都通過(guò)串口輸出后,接收端的 AUX 引腳將輸出低電平,隨后,接收端模塊將繼續(xù)保持“休眠-監(jiān)聽”的工作狀態(tài),通過(guò)配置不同的喚醒時(shí)間,將使得處于省電模式下的接收端模塊具有不同的接收響應(yīng)延遲和功耗,用戶應(yīng)在通訊延遲和平均功耗之間取一個(gè)平衡點(diǎn)。
4. 信號(hào)強(qiáng)度模式
信號(hào)強(qiáng)度模式可查看通訊雙方的信號(hào)強(qiáng)度,為評(píng)估通訊雙方的通訊質(zhì)量提供參考,實(shí)際應(yīng)用應(yīng)以實(shí)際的丟包率為評(píng)估標(biāo)準(zhǔn)。
發(fā)射端: 在信號(hào)強(qiáng)度模式下,發(fā)射端模塊的工作方式于處于一般模式下的發(fā)射端模塊的工作方式一致。
接收端: 在信號(hào)強(qiáng)度模式下,接收端模塊將在接收到來(lái)自發(fā)射端的無(wú)線數(shù)據(jù)后輸出信號(hào)強(qiáng)度的信息。
三、傳輸模式
1. 透明傳輸
透明傳輸指的是傳輸?shù)臄?shù)據(jù)完全透明,發(fā)射端模塊串口輸入的發(fā)射數(shù)據(jù)與接收端模塊串口輸出的接收數(shù)據(jù)是一致的。
透明傳輸可以實(shí)現(xiàn)一個(gè)模塊與一個(gè)或多個(gè)模塊之間的無(wú)線數(shù)據(jù)傳輸,只要各個(gè)模塊的配置的設(shè)備地址、信道和空中速率參數(shù)相同,那么這些模塊之間就能夠進(jìn)行數(shù)據(jù)通訊,如下圖所示:
2. 定向傳輸
定向傳輸指的是在發(fā)射端模塊串口的輸入數(shù)據(jù)中包含了指定傳輸對(duì)象模塊的設(shè)備地址和信道信息,發(fā)射端模塊會(huì)將數(shù)據(jù)發(fā)送給與之同一空中速率的指定接收端模塊,指定接收端模塊的串口僅輸出不包含指定傳輸對(duì)象模塊的設(shè)備地址和信號(hào)信息的數(shù)據(jù)。
定向傳輸可以在同一空中速率中實(shí)現(xiàn)發(fā)射端模塊定點(diǎn)地向指定接收端模塊發(fā)送數(shù)據(jù),如下圖所示:
3. 廣播和監(jiān)聽
除了透明傳輸和定向傳輸,當(dāng)接收端模塊的設(shè)備地址配置為 0xFFFF 時(shí),接收端模塊能夠監(jiān)聽相同網(wǎng)絡(luò)地址和空中速率配置的所有數(shù)據(jù)傳輸(監(jiān)聽);同時(shí),發(fā)射端模塊發(fā)送的數(shù)據(jù),能夠發(fā)送給其他相同信道和空中速率配置的接收端模塊(廣播),如下圖所示:
四、上位機(jī)配置
1. 透明傳輸下
保證模塊之前的各配置項(xiàng)相等
發(fā)送數(shù)據(jù)時(shí)直接發(fā)送想要發(fā)送的數(shù)據(jù)即可
2. 定向傳輸下
模塊地址和通信信道可以不同
發(fā)送數(shù)據(jù)時(shí)格式為 模塊地址+通信信道+數(shù)據(jù)
五、stm32通信設(shè)計(jì)
1. 模塊初始化
u8 LoRa_Init(void)
{
u8 retry=0;
u8 temp=1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復(fù)用功能時(shí)鐘
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,從而PA15可以做普通IO使用,否則PA15不能做普通IO!!!
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //LORA_MD0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //推挽輸出 ,IO口速度為50MHz
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //LORA_AUX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOA.4
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = DISABLE; //中斷線關(guān)閉(先關(guān)閉后面再打開)
EXTI_Init(&EXTI_InitStructure);//根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //LORA_AUX
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//搶占優(yōu)先級(jí)2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; //關(guān)閉外部中斷通道(后面再打開)
NVIC_Init(&NVIC_InitStructure);
LORA_MD0=0;
LORA_AUX=0;
while(LORA_AUX)//確保LORA模塊在空閑狀態(tài)下(LORA_AUX=0)
{
//Show_Str(40+30,50+20,200,16,"模塊正忙,請(qǐng)稍等!!",16,0);
printf("模塊正忙請(qǐng)稍等\r\n");
delay_ms(500);
}
usart3_init(115200);//初始化串口3
LORA_MD0=1;//進(jìn)入AT模式
delay_ms(40);
retry=3;
while(retry--)
{
if(!lora_send_cmd("AT","OK",70))
{
temp=0;//檢測(cè)成功
break;
}
}
if(retry==0) temp=1;//檢測(cè)失敗
return temp;
}
2. 配置LORA的信道、速率、串口、發(fā)射功率、傳輸模式等
void Lora_set(void)
{
usart3_init(115200);
usart3_rx(1);//開啟串口3接收
while(LORA_AUX);//等待模塊空閑
LORA_MD0=1; //進(jìn)入配置模式
delay_ms(40);
Lora_mode=0;//標(biāo)記"配置模式"
//為防止通信產(chǎn)生干擾可以自己修改這里的模塊配置參數(shù),如果另一側(cè)是用上位機(jī)接收,
//就在上位機(jī)調(diào)試APP中修改為對(duì)應(yīng)的參數(shù)即可,不然兩個(gè)模塊無(wú)法通信
lora_send_cmd((u8 *)"AT+CWMODE=0",(u8 *)"OK",200); //設(shè)置為一般模式
lora_send_cmd((u8 *)"AT+TMODE=0",(u8 *)"OK",200); //設(shè)置為透明傳輸
lora_send_cmd((u8 *)"AT+TPOWER=3",(u8 *)"OK",200); //設(shè)置發(fā)射功率20db
lora_send_cmd((u8 *)"AT+WLRATE=24,2",(u8 *)"OK",200); //設(shè)置信道為24,空中速率2.4
lora_send_cmd((u8 *)"AT+WLTIME=0",(u8 *)"OK",200); //設(shè)置休眠時(shí)間為1S
lora_send_cmd((u8 *)"AT+ADDR=00,02",(u8 *)"OK",200); //設(shè)置模塊地址為2
lora_send_cmd((u8 *)"AT+UART=7,0",(u8 *)"OK",200);//設(shè)置波特率115200,無(wú)校驗(yàn)
LORA_MD0=0;//退出配置,進(jìn)入通信
delay_ms(40);
while(LORA_AUX);//判斷是否空閑(模塊會(huì)重新配置參數(shù))
USART3_RX_STA=0;
Lora_mode=1;//標(biāo)記"接收模式"
usart3_init(115200);
Aux_Int(1);//設(shè)置LORA_AUX上升沿中斷
}
3. lora發(fā)送命令
//lora發(fā)送命令
//cmd:發(fā)送的命令字符串(不需要添加回車了),當(dāng)cmd<0XFF的時(shí)候,發(fā)送數(shù)字(比如發(fā)送0X1A),大于的時(shí)候發(fā)送字符串.
//ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答
//waittime:等待時(shí)間(單位:10ms)
//返回值:0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果)
// 1,發(fā)送失敗
u8 lora_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((USART3->SR&0X40)==0);//等待上一次數(shù)據(jù)發(fā)送完成
USART3->DR=(u32)cmd;
}else u3_printf("%s\r\n",cmd);//發(fā)送命令
if(ack&&waittime) //需要等待應(yīng)答
{
while(--waittime) //等待倒計(jì)時(shí)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果
{
if(lora_check_cmd(ack))break;//得到有效數(shù)據(jù)
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
4. 接收應(yīng)答
//lora發(fā)送命令后,檢測(cè)接收到的應(yīng)答
//str:期待的應(yīng)答結(jié)果
//返回值:0,沒有得到期待的應(yīng)答結(jié)果
//其他,期待應(yīng)答結(jié)果的位置(str的位置)
u8* lora_check_cmd(u8 *str)
{
char *strx=0;
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
5. AUX中斷設(shè)置
//mode:配置的模式 0:關(guān)閉 1:上升沿 2:下降沿
void Aux_Int(u8 mode)
{
if(!mode)
{
EXTI_InitStructure.EXTI_LineCmd = DISABLE;//關(guān)閉中斷
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
}else
{
if(mode==1)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿
else if(mode==2)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
}
Int_mode = mode;//記錄中斷模式
EXTI_Init(&EXTI_InitStructure);
NVIC_Init(&NVIC_InitStructure);
}
//LORA_AUX中斷服務(wù)函數(shù)
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4))
{
if(Int_mode==1)//上升沿(發(fā)送:開始發(fā)送數(shù)據(jù) 接收:數(shù)據(jù)開始輸出)
{
if(Lora_mode==1)//接收模式
{
USART3_RX_STA=0;//數(shù)據(jù)計(jì)數(shù)清0
}
Int_mode=2;//設(shè)置下降沿觸發(fā)
LED0=0;//DS0亮
}
else if(Int_mode==2)//下降沿(發(fā)送:數(shù)據(jù)已發(fā)送完 接收:數(shù)據(jù)輸出結(jié)束)
{
if(Lora_mode==1)//接收模式
{
USART3_RX_STA|=1<<15;//數(shù)據(jù)計(jì)數(shù)標(biāo)記完成
}else if(Lora_mode==2)//發(fā)送模式(串口數(shù)據(jù)發(fā)送完畢)
{
Lora_mode=1;//進(jìn)入接收模式
}
Int_mode=1;//設(shè)置上升沿觸發(fā)
LED0=1;//DS0滅
}
Aux_Int(Int_mode);//重新設(shè)置中斷邊沿
EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中斷標(biāo)志位
}
}
6. 通信測(cè)試文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-467505.html
m=LoRa_ReceData();
key=KEY_Scan(0);
if(key==WKUP_PRES)
u3_printf("Hello Lora");
if(m[0]=='1')
printf("yes \r\n");
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467505.html
到了這里,關(guān)于ATK-LORA 無(wú)線通信模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!