【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 等多种认证算法。
详细信息参考:
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 register
-
int endOfBattery; //variable for end of battery
-
uint8_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 eob
-
error |= SHT2x_ReadUserRegister(&userRegister); //get actual user reg
-
if( (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 16
-
-
uint8_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 master
-
TRIG_RH_MEASUREMENT_HM = 0xE5, // command trig. humidity meas. hold master
-
TRIG_T_MEASUREMENT_POLL = 0xF3, // command trig. temp meas. no hold master
-
TRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold master
-
USER_REG_W = 0xE6, // command writing user register
-
USER_REG_R = 0xE7, // command reading user register
-
SOFT_RESET = 0xFE, // command soft reset
-
SerialNumber_location_1 = 0xFA0F,
-
SerialNumber_location_2 = 0xFCC9
-
}etSHT2xCommand;
-
-
typedef enum {
-
SHT2x_RES_12_14BIT = 0x00, // RH=12bit, T=14bit
-
SHT2x_RES_8_12BIT = 0x01, // RH= 8bit, T=12bit
-
SHT2x_RES_10_13BIT = 0x80, // RH=10bit, T=13bit
-
SHT2x_RES_11_11BIT = 0x81, // RH=11bit, T=11bit
-
SHT2x_RES_MASK = 0x81 // Mask for res. bits (7,0) in user reg.
-
} etSHT2xResolution;
-
-
typedef enum {
-
SHT2x_EOB_ON = 0x40, // end of battery
-
SHT2x_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 register
-
int 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 reg
-
userRegister = (userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT;
-
error |= SHT2x_WriteUserRegister(&userRegister); //write changed user reg
-
-
return 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_3
-
u8SerialNumber[4] = i2cdata_read[2];//SNB_2
-
u8SerialNumber[3] = i2cdata_read[4];//SNB_1
-
u8SerialNumber[2] = i2cdata_read[6];//SNB_0
-
-
SHT2x_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_1
-
u8SerialNumber[0] = i2cdata_read[1];//SNC_0
-
u8SerialNumber[7] = i2cdata_read[3];//SNA_1
-
u8SerialNumber[6] = i2cdata_read[4];//SNA_0
-
-
return 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 polynomial
-
for (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 restarted
-
-
return 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;
-
}
文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/liwei16611/article/details/86571312
- 点赞
- 收藏
- 关注作者
评论(0)