一、案例介紹
下面是一個(gè)基于CC2530和ESP8266的項(xiàng)目示例,它演示了如何使用CC2530與ESP8266通信以及使用AT指令控制其WiFi模塊設(shè)置和數(shù)據(jù)傳輸。
項(xiàng)目概述: 項(xiàng)目實(shí)現(xiàn)通過(guò)CC2530控制ESP8266將其配置成AP+TCP服務(wù)器模式,并通過(guò)手機(jī)APP連接到TCP服務(wù)器并完成數(shù)據(jù)傳輸。ESP8266將作為一個(gè)熱點(diǎn)(AP)來(lái)工作,其WiFi模塊被配置為建立一個(gè)TCP服務(wù)器并監(jiān)聽(tīng)端口號(hào)。CC2530將使用其串口與ESP8266進(jìn)行通信,并通過(guò)AT指令控制ESP8266的WiFi模塊設(shè)置和數(shù)據(jù)傳輸。
硬件組件:
軟件組件:
- IAR Embedded Workbench for 8051
- ESP8266 AT指令集
- Android Studio
實(shí)現(xiàn)步驟:
- 硬件連接: 將ESP8266模塊與USB轉(zhuǎn)TTL串口轉(zhuǎn)接板相連,然后將串口轉(zhuǎn)接板連接到PC上的USB接口。 在開(kāi)發(fā)板上焊接CC2530,然后將其連接到ESP8266模塊的TXD和RXD引腳上(即CC2530的P0.2與P0.3引腳,分別連接到ESP8266的RXD和TXD引腳)。
- 配置ESP8266模塊: 使用串口工具連接到ESP8266模塊,然后根據(jù)AT指令集將其配置為AP+TCP服務(wù)器模式。例如,可以使用以下AT指令來(lái)配置ESP8266的WiFi模塊:
AT+CWMODE=3
AT+CWSAP="MyWiFi","12345678",1,0
AT+CIPMUX=1
AT+CIPSERVER=1,8080
其中,“MyWiFi”和“12345678”分別是熱點(diǎn)的名稱和密碼,“1”表示加密方式為WPA2-PSK,“0”表示不隱藏SSID,而“8080”則是TCP服務(wù)器監(jiān)聽(tīng)的端口號(hào)。
編寫(xiě)CC2530程序: 在IAR Embedded Workbench for 8051中創(chuàng)建一個(gè)新的工程,在其中添加串口驅(qū)動(dòng)程序以及ESP8266通信所需的AT指令函數(shù)。然后,編寫(xiě)主程序代碼來(lái)實(shí)現(xiàn)以下功能:
- 初始化串口
- 向ESP8266發(fā)送AT指令以配置其WiFi模塊
- 等待ESP8266向CC2530發(fā)送TCP連接請(qǐng)求
- 接受從ESP8266傳回的數(shù)據(jù)并將其顯示在串口工具中
以下是示例代碼的一部分,用于初始化串口并向ESP8266發(fā)送AT指令:
#include "uart.h"
#include
?
// AT指令函數(shù)
void at_command(char* cmd)
{
uart_puts(cmd);
uart_puts("rn");
delay_ms(1000);
}
?
int main()
{
// 初始化串口
uart_init();
// 發(fā)送AT指令以配置ESP8266的WiFi模塊
at_command("AT+CWMODE=3");
at_command("AT+CWSAP="MyWiFi","12345678",1,0");
at_command("AT+CIPMUX=1");
at_command("AT+CIPSERVER=1,8080");
?
while (1)
{
// 接受從ESP8266傳回的數(shù)據(jù)并將其顯示在串口工具中
if (uart_available())
{
char c = uart_read();
uart_putc(c);
}
}
?
return 0;
}
二、CC2530與ESP8266科普
CC2530是德州儀器(Texas Instruments,簡(jiǎn)稱TI)公司推出的一款基于ZigBee協(xié)議的SoC單芯片解決方案,它集成了一個(gè)8051內(nèi)核、硬件AES加密加速器、具備豐富外設(shè)的低功耗射頻芯片和物理層。CC2530支持IEEE 802.15.4標(biāo)準(zhǔn)和ZigBee協(xié)議,并且具有低功耗、高可靠性和長(zhǎng)距離等特點(diǎn),廣泛應(yīng)用于物聯(lián)網(wǎng)、智能家居、智能醫(yī)療、無(wú)線傳感網(wǎng)和工業(yè)自動(dòng)化等領(lǐng)域。
ESP8266是一款由中國(guó)企業(yè)樂(lè)鑫(Espressif Systems)研發(fā)的超低功耗Wi-Fi芯片,被廣泛應(yīng)用于物聯(lián)網(wǎng)相關(guān)設(shè)備的開(kāi)發(fā)中。該芯片采用Tensilica L106 32位處理器,內(nèi)置TCP/IP協(xié)議,可以實(shí)現(xiàn)Wi-Fi通信,同時(shí)也支持傳統(tǒng)的UART協(xié)議、SPI協(xié)議等串行通信方式。ESP8266芯片集成了射頻電路、天線、Flash存儲(chǔ)器和電源管理等,體積小巧、功耗低,具有高度集成性和低成本的特點(diǎn)。
ESP8266芯片的主要特點(diǎn)如下:
1. 支持802.11 b/g/n Wi-Fi協(xié)議,通信距離遠(yuǎn),數(shù)據(jù)傳輸速度快;
2. 內(nèi)置32位低功耗Tensilica L106 CPU,主頻可達(dá)80MHz;
3. 支持UART、SPI、I2C等多種串行通信協(xié)議;
4. 集成了高速緩存和SRAM,具有強(qiáng)大的處理性能和存儲(chǔ)能力;
5. 支持藍(lán)牙4.2、BLE等無(wú)線通信協(xié)議(部分型號(hào)支持);
6. 能夠與各種MCU和傳感器等外設(shè)進(jìn)行協(xié)同工作,大大降低了開(kāi)發(fā)成本和門(mén)檻。
ESP8266芯片具有成本低、功耗低、尺寸小和易于開(kāi)發(fā)等優(yōu)點(diǎn),在物聯(lián)網(wǎng)、智能家居、智能手環(huán)、智能家電等領(lǐng)域廣泛應(yīng)用。同時(shí),ESP8266芯片也被視為低功耗Wi-Fi IoT領(lǐng)域中的殺手锏,為物聯(lián)網(wǎng)設(shè)備的互聯(lián)提供了更為簡(jiǎn)便、穩(wěn)定、高效的解決方案。
三、功能代碼實(shí)現(xiàn)介紹
在CC2530上實(shí)現(xiàn)控制ESP8266配置成AP+TCP服務(wù)器模式,與手機(jī)APP之間完成數(shù)據(jù)傳輸,需要使用CC2530的串口與ESP8266通信,以及使用ESP8266 AT指令控制ESP8266的WiFi模塊設(shè)置和數(shù)據(jù)的發(fā)送,代碼如下:
#include
#include
#include
?
#define ESP_ON P1_0 // ESP8266電源控制引腳
#define ESP_RST P1_1 // ESP8266復(fù)位引腳
#define UART_TX P0_2 // CC2530串口發(fā)送引腳
#define UART_RX P0_3 // CC2530串口接收引腳
?
// ESP8266 AT指令常用指令
const char* AT_RST = "AT+RST";
const char* AT_CWMODE = "AT+CWMODE=3"; // 設(shè)置ESP8266為AP+STA模式
const char* AT_CWSAP = "AT+CWSAP="ssid","pass",1,3"; // 設(shè)置ESP8266 AP模式下的WiFi名稱和密碼
const char* AT_CIPMUX = "AT+CIPMUX=1"; // 設(shè)置ESP8266多路連接模式
const char* AT_CIPSERVER = "AT+CIPSERVER=1,8888"; // 設(shè)置ESP8266 TCP服務(wù)器端口
const char* AT_CIPSEND = "AT+CIPSEND=0,50"; // 設(shè)定ESP8266發(fā)送數(shù)據(jù)的長(zhǎng)度,50字節(jié)
?
// ESP8266 AT指令回應(yīng)標(biāo)志
const char* RESPONSE_OK = "OK"; // AT指令執(zhí)行成功
const char* RESPONSE_ERROR = "ERROR"; // AT指令執(zhí)行失敗
const char* RESPONSE_READY = "ready"; // ESP8266已經(jīng)準(zhǔn)備就緒
const char* RESPONSE_CONNECT = "CONNECT"; // ESP8266連接成功
const char* RESPONSE_CLOSED = "CLOSED"; // ESP8266連接關(guān)閉
?
// ESP8266的WIFI名稱和密碼
const char* SSID = "esp8266";
const char* PASSWORD = "wifipassword";
?
// 存儲(chǔ)ESP8266返回的數(shù)據(jù)
char response[100];
?
// 延時(shí)函數(shù)
void delay(int ms) {
while (--ms > 0) __delay_cycles(48000);
}
?
// 向ESP8266發(fā)送AT指令,并獲取ESP8266的回應(yīng)
void sendATCommand(const char* cmd, uint8_t wait) {
uint8_t i = 0;
memset(response, 0, sizeof(response));
printf("AT command: %sn", cmd);
printf("AT response:n");
while (cmd[i]) {
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = cmd[i++];
}
while (wait && !(UCA0IFG & UCRXIFG));
while (UCA0IFG & UCRXIFG) {
if (response[0] == '?' && UCA0RXBUF != 'r' && UCA0RXBUF != 'n') {
response[0] = UCA0RXBUF;
response[1] = '?';
continue;
}
if (strlen(response) < sizeof(response) - 1) {
? ? ? ? ? ? ?int len = strlen(response);
? ? ? ? ? ? ?response[len] = UCA0RXBUF;
? ? ? ? ? ? ?response[len + 1] = '?';
? ? ? ? }
? ? }
? ? ?printf("%s", response);
?}
??
?void main(void) {
? ? ?uint8_t retry = 5;
? ? ?_BIS_SR(GIE);
??
? ? ?// 配置IO口
? ? ?P1DIR |= BIT0 + BIT1;
? ? ?P1OUT &= ~(BIT0 + BIT1);
? ? ?P1OUT |= ESP_ON; // 打開(kāi)ESP8266電源
? ? ?P1OUT &= ~ESP_RST; // 復(fù)位ESP8266
? ? ?delay(500);
? ? ?P1OUT |= ESP_RST;
? ? ?delay(1000);
??
? ? ?// 配置串口
? ? ?P0SEL |= BIT2 + BIT3;
? ? ?UCA0CTL1 = UCSSEL_2;
? ? ?UCA0BR0 = 130;
? ? ?UCA0BR1 = 6;
? ? ?UCA0MCTL = UCBRS_4;
??
? ? ?// 逐步執(zhí)行AT指令,確保每一步配置都執(zhí)行成功
? ? ?while (retry-- > 0) {
sendATCommand(AT_RST, 1);
sendATCommand(AT_CWMODE, 1);
sendATCommand(AT_CWSAP, 1);
sendATCommand(AT_CIPMUX, 1);
sendATCommand(AT_CIPSERVER, 1);
if (strstr(response, RESPONSE_OK) != NULL) break;
}
if (retry == 0) return; // 配置失敗,退出程序
?
// 等待ESP8266準(zhǔn)備就緒
while (1) {
sendATCommand("", 1);
if (strstr(response, RESPONSE_READY) != NULL) break;
delay(500);
}
?
// 等待手機(jī)APP連接
while (1) {
sendATCommand("", 1);
if (strstr(response, RESPONSE_CONNECT) != NULL) {
printf("Client connected.n");
// 發(fā)送數(shù)據(jù)
sendATCommand(AT_CIPSEND, 0);
while (!(UCA0IFG & UCTXIFG));
UCA0TXBUF = 'H'; UCA0TXBUF = 'e';
UCA0TXBUF = 'l'; UCA0TXBUF = 'l';
UCA0TXBUF = 'o'; UCA0TXBUF = ',';
UCA0TXBUF = 'W'; UCA0TXBUF = 'o';
UCA0TXBUF = 'r'; UCA0TXBUF = 'l';
UCA0TXBUF = 'd'; UCA0TXBUF = '!';
delay(100); // 延時(shí)確保數(shù)據(jù)發(fā)送完成
// 關(guān)閉連接
sendATCommand("AT+CIPCLOSE=0", 1);
printf("Client disconnected.n");
}
delay(10);
}
}
這是CC2530的代碼,其中ESP8266的控制使用了AT指令。也就是說(shuō),ESP8266作為網(wǎng)絡(luò)模塊,只是負(fù)責(zé)在指定的端口上監(jiān)聽(tīng)客戶端的連接和傳輸數(shù)據(jù),真正控制數(shù)據(jù)傳輸?shù)氖荂C2530,CC2530還要負(fù)責(zé)ESP8266的WiFi模塊設(shè)置和TCP服務(wù)器的建立。這里只是給出了用CC2530控制ESP8266的代碼,手機(jī)APP的代碼需要自行開(kāi)發(fā)。
審核編輯:湯梓紅
-
通信
+關(guān)注
關(guān)注
18文章
6024瀏覽量
135950 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2909文章
44557瀏覽量
372776 -
WIFI
+關(guān)注
關(guān)注
81文章
5296瀏覽量
203575 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76422 -
ESP8266
+關(guān)注
關(guān)注
50文章
962瀏覽量
44962
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論