【IoT】联网 WIFI 设计之瑞昱 RTL8710 使用基础
1、瑞昱 RTL8710 主要特点
• 802.11 b/g/n ,CMOS MAC,物理层基带
• 内置低功耗 32 位 CPU:可以兼作应用处理器
• 内置 TCP/IP 协议栈
• 内置 TR 开关、balun、LNA、功率放大器和匹配网络
• 内置 PLL、稳压器和电源管理组件
• MO、2x1 MIMO
• A-MPDU 、A-MSDU 的聚合和 0.4 s 的保护间隔
• WiFi @ 2.4 GHz,支持 WPA/WPA2 安全模式
• 支持 STA/AP/STA AP 工作模式
• 支持 Smart Config 功能(包括 Android 和 iOS 设备)
• HSPI 、UART、I2C、I2S、IR Remote Control、PWM、GPIO
• 深度睡眠保持电流为 10 uA,关断电流小于 5 uA
• 2 ms 之内唤醒、连接并传递数据包
• 802.11b 模式下 20 dBm 的输出功率
• 待机状态消耗功率小于1.0 mW (DTIM3)
• 工作温度范围: -40℃ - 130℃
瑞昱 RTL8710 作为一款完整的 WiFi 解决方案,能够独立运行,也可以作为从机搭载于其他主机 MCU 运行。
它内置了一颗主频为主 166 MHz,并可兼做应用处理的超低功耗 32 位微型 CPU。
在搭载应用并作为设备中唯⼀的应⽤处理器时,能够直接从外接闪存中启动。内置的高速缓冲存储器有利于提高系统性能,并减少内存需求。
RTL8710 在负责无线上网接入承担 WiFi 适配器的任务时,可以将其添加到任何基于微控制器的设计中,连接简单易行,只需通过 SPI/SDIO 接口或 I2C/UART 口即可。
强大的片上处理和存储能⼒,使其可通过 GPIO 口集成传感器及其他应用的特定设备,实现了最低前期的开发和运行中最少地占用系统资源。
瑞昱 RTL8710 CPU主频为 166MHz ,并采用 QFN-48(6x6mm)封装工艺,同时拥有 42K 的可用内存。
瑞昱 RTL8710 通过内置 1MB flash,不仅尺寸小,还可帮助开发者降低开发成本。
瑞昱 RTL8710 GPIO 最大 21 个管脚,同时 I2C 最大值有 3 个,最多 2 个 PCM,以及多达 4 个 PWM,并支持 2 个高速 UART,1 个低速 UART。
数据吞吐量方面,在 802.11n 网络模式下,瑞昱 RTL8710 的最大数率为 150Mbps。
在市场应用方面,瑞昱RTL8710可运用于智能家居、家庭⾃动化、⼯业⽆线控制、传感器网络、可穿戴电子产品、无线位置感知设备、安全 ID 标签、无线定位系统信号等。
通过测试发现,瑞昱 RTL8710 芯片不仅稳定、丢包率也低的超乎我们的想象,同时使用瑞昱 RTL8710 路由器的兼容性和网络连接的稳定性也令人满意。
在数据安全性上,瑞昱 RTL8710 的安全性更高, 并且支持 MD5,SHA-1/2,HMAC-MD5,HMAC-SHA1,HMAC-SHA2 等多种认证算法。
详细信息参考:
RTL8710 基础浅析
RTL8710 基础资源
2、AT 指令联网
设置 AP 和密码:
ATW3=SSID
ATW4=passwd
ATW5=cannel
ATWB (Start STA+AP)
然后连接网络:
ATW0=SSID (连接的id)
ATW1=12345678 (连接的密码)
ATW2= (这一项可不用)
ATWC (Join a network)
ping 网络:
ATWI=168.254.0.101
3、代码实现读取温度值
业务逻辑:
void main(void)
{gpio_t gpio_led;int led_status;int i2clocalcnt;int error;uint8_t userRegister; //variable for user registerint endOfBattery; //variable for end of batteryuint8_t sht2x_serialnumber[8];float temperature = 1.123f;float humidity = 2.456f;DBG_8195A("sleep 10 sec. to wait for UART console\n");Mdelay(10000);DBG_8195A("start i2c example - SHT2x\n");error = SHT2x_Init(sht2x_serialnumber);if ( error == NO_ERROR ) {DiagPrintf("SHT2x init ok, Serial Number = 0x %02x %02x %02x %02x %02x %02x %02x %02x\r\n", sht2x_serialnumber[7],sht2x_serialnumber[6],sht2x_serialnumber[5],sht2x_serialnumber[4],sht2x_serialnumber[3],sht2x_serialnumber[2],sht2x_serialnumber[1],sht2x_serialnumber[0]);} else {DiagPrintf("SHT2x init FAILED! \r\n");for(;;);}while(1){error |= SHT2x_GetTempAndHumi(&temperature, &humidity);// --- check end of battery status (eob)---// note: a RH / Temp. measurement must be executed to update the status of eoberror |= SHT2x_ReadUserRegister(&userRegister); //get actual user regif( (userRegister & SHT2x_EOB_MASK) == SHT2x_EOB_ON ) endOfBattery = true;else endOfBattery = false;rtl_printf("temp=%f, humidity=%f, error=%d\n", temperature, humidity, error);Mdelay(1000);}
}
基础代码:
#include "device.h"
#include "PinNames.h"#include "basic_types.h"
#include "diag.h"
#include "osdep_api.h"#include "i2c_api.h"
#include "pinmap.h"
#include "rtl_lib.h"
#include <stdbool.h>#define NO_ERROR 0x00
#define ACK_ERROR 0x01
#define CHECKSUM_ERROR 0x02
#define NULL_ERROR 0x03#define MBED_I2C_MTR_SDA PC_4
#define MBED_I2C_MTR_SCL PC_5#define MBED_I2C_SLAVE_ADDR0 0x40
#define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001#define MBED_I2C_BUS_CLK 100000 //hz
#define I2C_DATA_MAX_LENGTH 16uint8_t i2cdata_write[I2C_DATA_MAX_LENGTH];
uint8_t i2cdata_read[I2C_DATA_MAX_LENGTH];
int i2cdata_read_pos;volatile i2c_t i2cmaster;// Sensor Commands
typedef enum{TRIG_T_MEASUREMENT_HM = 0xE3, // command trig. temp meas. hold masterTRIG_RH_MEASUREMENT_HM = 0xE5, // command trig. humidity meas. hold masterTRIG_T_MEASUREMENT_POLL = 0xF3, // command trig. temp meas. no hold masterTRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold masterUSER_REG_W = 0xE6, // command writing user registerUSER_REG_R = 0xE7, // command reading user registerSOFT_RESET = 0xFE, // command soft resetSerialNumber_location_1 = 0xFA0F,SerialNumber_location_2 = 0xFCC9
}etSHT2xCommand;typedef enum {SHT2x_RES_12_14BIT = 0x00, // RH=12bit, T=14bitSHT2x_RES_8_12BIT = 0x01, // RH= 8bit, T=12bitSHT2x_RES_10_13BIT = 0x80, // RH=10bit, T=13bitSHT2x_RES_11_11BIT = 0x81, // RH=11bit, T=11bitSHT2x_RES_MASK = 0x81 // Mask for res. bits (7,0) in user reg.
} etSHT2xResolution;typedef enum {SHT2x_EOB_ON = 0x40, // end of batterySHT2x_EOB_MASK = 0x40, // Mask for EOB bit(6) in user reg.
} etSHT2xEob;static int SHT2x_GetSerialNumber(uint8_t u8SerialNumber[]);
static int SHT2x_WriteCommand8(uint8_t cmd);
static int SHT2x_WriteCommand16(uint16_t cmd);
static int SHT2x_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum);
static float SHT2x_CalcTemperature(uint16_t rawValue);
static float SHT2x_CalcHumidity(uint16_t rawValue);
int SHT2x_ReadUserRegister(uint8_t *pRegisterValue);
int SHT2x_WriteUserRegister(uint8_t *pRegisterValue);int SHT2x_Init(uint8_t u8SerialNumber[])
{uint8_t userRegister; //variable for user registerint error = NO_ERROR;DiagPrintf("SHT2x_Init \r\n");i2c_init((i2c_t*)&i2cmaster, MBED_I2C_MTR_SDA ,MBED_I2C_MTR_SCL);i2c_frequency((i2c_t*)&i2cmaster,MBED_I2C_BUS_CLK);if (u8SerialNumber == NULL ) return NULL_ERROR;// --- Reset sensor by command ---error |= SHT2x_SoftReset();// --- Read the sensors serial number (64bit) ---error |= SHT2x_GetSerialNumber(u8SerialNumber);// --- Set Resolution e.g. RH 10bit, Temp 13bit ---error |= SHT2x_ReadUserRegister(&userRegister); //get actual user reguserRegister = (userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT;error |= SHT2x_WriteUserRegister(&userRegister); //write changed user regreturn error;
}static int SHT2x_GetSerialNumber(uint8_t u8SerialNumber[])
{int error = NO_ERROR;SHT2x_WriteCommand16(SerialNumber_location_1); if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 8, 1) != 8)error |= NULL_ERROR;u8SerialNumber[5] = i2cdata_read[0];//SNB_3u8SerialNumber[4] = i2cdata_read[2];//SNB_2u8SerialNumber[3] = i2cdata_read[4];//SNB_1u8SerialNumber[2] = i2cdata_read[6];//SNB_0SHT2x_WriteCommand16(SerialNumber_location_2); if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 6, 1) != 6)error |= NULL_ERROR;u8SerialNumber[1] = i2cdata_read[0];//SNC_1u8SerialNumber[0] = i2cdata_read[1];//SNC_0u8SerialNumber[7] = i2cdata_read[3];//SNA_1u8SerialNumber[6] = i2cdata_read[4];//SNA_0return error;
}static int SHT2x_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
{uint8_t crc = 0; uint8_t byteCtr;int error = NO_ERROR;//calculates 8-Bit checksum with given polynomialfor (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr){ crc ^= (data[byteCtr]);for (uint8_t bit = 8; bit > 0; --bit){ if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;else crc = (crc << 1);}}if (crc != checksum) error |= CHECKSUM_ERROR;return error;
}//===========================================================================
int SHT2x_SoftReset()
//===========================================================================
{int error = NO_ERROR;SHT2x_WriteCommand8(SOFT_RESET); Mdelay(15); // wait till sensor has restartedreturn error;
}//===========================================================================
int SHT2x_ReadUserRegister(uint8_t *pRegisterValue)
//===========================================================================
{int error = NO_ERROR;SHT2x_WriteCommand8(USER_REG_R);if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 2, 1) != 2)error |= NULL_ERROR;error |= SHT2x_CheckCrc (i2cdata_read,1,i2cdata_read[1]);return error;
}//===========================================================================
int SHT2x_WriteUserRegister(uint8_t *pRegisterValue)
//===========================================================================
{int error = NO_ERROR;SHT2x_WriteCommand8(USER_REG_W);if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)pRegisterValue, 1, 1) != 1)error |= NULL_ERROR;return error;
}static int SHT2x_WriteCommand8(uint8_t cmd)
{int error = NO_ERROR;i2cdata_write[0] = (uint8_t)(cmd&0xFF);if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, &i2cdata_write[0], 1, 0) != 1)error |= NULL_ERROR;return error;
}static int SHT2x_WriteCommand16(uint16_t cmd)
{int error = NO_ERROR;i2cdata_write[0] = (uint8_t)(cmd >>8);i2cdata_write[1] = (uint8_t)(cmd&0xFF);if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, &i2cdata_write[0], 2, 0) != 2)error |= NULL_ERROR;return error;
}static float SHT2x_CalcTemperature(uint16_t rawValue)
{rawValue &= ~0x0003; // clear bits [1..0] (status bits)return -46.85 + 175.72/65536 *(float)rawValue; //T= -46.85 + 175.72 * ST/2^16
}static float SHT2x_CalcHumidity(uint16_t rawValue)
{rawValue &= ~0x0003; // clear bits [1..0] (status bits)return -6.0 + 125.0/65536 * (float)rawValue; // RH= -6 + 125 * SRH/2^16
}int SHT2x_GetTempAndHumi(float *temp, float *humi)
{int error = NO_ERROR;uint16_t rawValueTemp;uint16_t rawValueHumi;SHT2x_WriteCommand8(TRIG_T_MEASUREMENT_HM); //-- read two data bytes and one checksum byte --if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 3, 1) != 3)error |= NULL_ERROR;//-- verify checksum --error |= SHT2x_CheckCrc (i2cdata_read,2,i2cdata_read[2]);rawValueTemp = i2cdata_read[0] << 8 | i2cdata_read[1];SHT2x_WriteCommand8(TRIG_RH_MEASUREMENT_HM); //-- read two data bytes and one checksum byte --if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 3, 1) != 3)error |= NULL_ERROR;//-- verify checksum --error |= SHT2x_CheckCrc (i2cdata_read,2,i2cdata_read[2]);rawValueHumi = i2cdata_read[0] << 8 | i2cdata_read[1];//diag_printf("raw temp=0x%x, raw humidity=0x%x, error=%d\n", // rawValueTemp, rawValueHumi, error);//-- calculate humidity and temperature --if ( error == NO_ERROR ) {*temp = SHT2x_CalcTemperature(rawValueTemp);*humi = SHT2x_CalcHumidity(rawValueHumi);}return error;
}
【IoT】联网 WIFI 设计之瑞昱 RTL8710 使用基础相关推荐
- 【IoT】产品 WIFI 选型:瑞昱 RTL8710 与乐鑫 ESP8266 对比
在物联网 WIFI 应用领域,受限于成本及功耗,很多诸如智能空调.智能豆浆机等智能硬件产品上集成的 WIFI,都是以集成 WIFI 的单芯片 SoC 来实现,将通信协议 TCP/IP 写入 MCU 的 ...
- 瑞昱RTL8710对标乐鑫ESP8266 谁将成为物联网首选-新版
**瑞昱RTL8710对标乐鑫ESP8266 谁将成为物联网首选 一,乐鑫ESP8266 3 二,瑞昱RTL8710 4 三,瑞昱RTL8710与乐鑫ESP8266主要参数对比 5 3.1,性能上对比 ...
- 瑞昱RTL8710对标乐鑫ESP8266 谁将成为物联网首选
瑞昱RTL8710对标乐鑫ESP8266 谁将成为物联网首选 一,乐鑫ESP8266.......................................................... ...
- 瑞昱 RTL8710 与乐鑫 ESP8266 对比
在物联网 WIFI 应用领域,受限于成本及功耗,很多诸如智能空调.智能豆浆机等智能硬件产品上集成的 WIFI,都是以集成 WIFI 的单芯片 SoC 来实现,将通信协议 TCP/IP 写入 MCU 的 ...
- 瑞昱RTL8710、乐鑫ESP8266 物联网之争
据相关统计数据表明,2015年时,物联网WiFi芯片需求的总出货量突破3000万颗,是2014年物联网WiFi芯片出货量仅有1000万颗左右的三倍,同时伴随着智能硬件产业的发展壮大以及物联网产品的实实 ...
- 《初次使用瑞昱 rtl8710 》
初步使用rtl8710 首次接触RTL8710 这一款模块,模块硬件可以在官网等方式找资料 环境搭建 硬件工具: USB线(正常的安卓手机线都可以) 开发板一块 J-link在线仿真器(某宝一大堆) ...
- 【IoT】WiFi 模组主流供应商
1.芯片 WiFi 芯片厂家 瑞昱 RTL8710.乐鑫 ESP8266.德州仪器 TI cc3200.联发科 MT7681.高通 QCA4004. 2.模组 1)WIFI 主要特性 WIFI 通讯频 ...
- 免驱无线网卡插到电脑上突然驱动变成瑞昱网卡了无法正常联网
环境: 电脑:戴尔台式主机 系统:Windows 10 专业版 64位 网卡:S星UD6H(免驱版)高增益650M双频无线USB网卡 硬件版本:V2 问题描述: S星免驱无线网卡插到电脑上突然驱动变成 ...
- CS5212替代RTD2166瑞昱DP转VGA方案中文设计
CS5212中文设计方案,替代瑞昱RTD2166,pin对pin替代RTD2166,且外围器件少,设计简洁,版框尺寸小,整体方案成本更低. CS5212适用于多个细分市场和显示器应用程序,如笔记本电脑 ...
最新文章
- 2021清华大学年度人物候选 | 曹丰泽:我要证明,理想主义的路是走得通的
- Execute Process Task
- 后端技术:MyBatis 批量插入的 3 种写法
- 淘淘商城之技术选型、开发工具和环境、人员配置
- c# list集合根据某个字段去重_Python list、dataframe去重
- 中国双侧人工耳蜗行业市场供需与战略研究报告
- 在Angularjs中使用directive自定义指令实现attribute的继承
- 本地计算机上的mysql57_win10出现本地计算机上的MySQL57服务启动后停止
- vb6,sql与access 获取当前日期
- class文件与dex文件解析
- 一个简单的搜狗微信公众号案例
- 【MPI编程】矩阵向量乘法--解法二(高性能计算)
- Android 屏蔽锁屏界面上的通知显示
- MacM1-Miniconda相关合集
- 2021消防设施操作员(初级)岗位考试模拟题库应急疏散逃生知识部分
- 离线分析:Flume+Kafka+HBase+Hadoop通话数据统计
- C3D复现出现的问题及其解决方法
- saber 2016打不开帮助文档
- POJ2965 The Pilots Brothers‘ refrigerator
- 稻城亚丁,从你的全世界路过