【IoT】联网 WIFI 设计之瑞昱 RTL8710 使用基础

举报
产品人卫朋 发表于 2021/10/29 23:25:37 2021/10/29
【摘要】 1、瑞昱 RTL8710 主要特点 • 802.11 b/g/n ,CMOS MAC,物理层基带• 内置低功耗 32 位 CPU:可以兼作应用处理器• 内置 TCP/IP 协议栈• 内置 TR 开关、balun、LNA、功率放大器和匹配网络• 内置 PLL、稳压器和电源管理组件• MO、2x1 MIMO• A-MPDU 、A-MSDU...

1、瑞昱 RTL8710 主要特点


  
  1. 802.11 b/g/n ,CMOS MAC,物理层基带
  2. • 内置低功耗 32 位 CPU:可以兼作应用处理器
  3. • 内置 TCP/IP 协议栈
  4. • 内置 TR 开关、balun、LNA、功率放大器和匹配网络
  5. • 内置 PLL、稳压器和电源管理组件
  6. • MO、2x1 MIMO
  7. A-MPDU 、A-MSDU 的聚合和 0.4 s 的保护间隔
  8. • WiFi @ 2.4 GHz,支持 WPA/WPA2 安全模式
  9. • 支持 STA/AP/STA AP 工作模式
  10. • 支持 Smart Config 功能(包括 Android 和 iOS 设备)
  11. • HSPI 、UART、I2C、I2S、IR Remote Control、PWM、GPIO
  12. • 深度睡眠保持电流为 10 uA,关断电流小于 5 uA
  13. 2 ms 之内唤醒、连接并传递数据包
  14. 802.11b 模式下 20 dBm 的输出功率
  15. • 待机状态消耗功率小于1.0 mW (DTIM3)
  16. • 工作温度范围: -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 和密码:


  
  1. ATW3=SSID
  2. ATW4=passwd
  3. ATW5=cannel
  4. ATWB          (Start STA+AP)

然后连接网络:


  
  1. ATW0=SSID     (连接的id
  2. ATW1=12345678 (连接的密码)
  3. ATW2=         (这一项可不用)
  4. ATWC          (Join a network)

ping 网络:

ATWI=168.254.0.101
 

3、代码实现读取温度值

业务逻辑:


  
  1. void main(void)
  2. {
  3.     gpio_t gpio_led;
  4.     int led_status;
  5.     int i2clocalcnt;
  6.     int error;
  7.     uint8_t userRegister;           //variable for user register
  8.     int endOfBattery;           //variable for end of battery
  9.     uint8_t sht2x_serialnumber[8];
  10.     
  11.     float temperature = 1.123f;
  12.     float humidity = 2.456f;
  13.     
  14.     DBG_8195A("sleep 10 sec. to wait for UART console\n");
  15.     Mdelay(10000);
  16.     
  17.     DBG_8195A("start i2c example - SHT2x\n");
  18.     
  19.     error = SHT2x_Init(sht2x_serialnumber);
  20.     if ( error == NO_ERROR ) {
  21.         DiagPrintf("SHT2x init ok, Serial Number = 0x %02x %02x %02x %02x %02x %02x %02x %02x\r\n"
  22.                    sht2x_serialnumber[7],sht2x_serialnumber[6],sht2x_serialnumber[5],sht2x_serialnumber[4],
  23.                    sht2x_serialnumber[3],sht2x_serialnumber[2],sht2x_serialnumber[1],sht2x_serialnumber[0]);
  24.     } else {
  25.         DiagPrintf("SHT2x init FAILED! \r\n");
  26.         for(;;);
  27.     }
  28.     
  29.     while(1){
  30.         error |= SHT2x_GetTempAndHumi(&temperature, &humidity);
  31.         
  32.         // --- check end of battery status (eob)---
  33.         // note: a RH / Temp. measurement must be executed to update the status of eob
  34.         error |= SHT2x_ReadUserRegister(&userRegister);  //get actual user reg
  35.         if( (userRegister & SHT2x_EOB_MASK) == SHT2x_EOB_ON ) 
  36.             endOfBattery = true;
  37.         else 
  38.             endOfBattery = false;
  39.         
  40.         rtl_printf("temp=%f, humidity=%f, error=%d\n"
  41.                    temperature, humidity, error);
  42.         
  43.         Mdelay(1000);
  44.     }
  45. }

基础代码:


  
  1. #include "device.h"
  2. #include "PinNames.h"
  3.  
  4. #include "basic_types.h"
  5. #include "diag.h" 
  6. #include "osdep_api.h"
  7.  
  8. #include "i2c_api.h"
  9. #include "pinmap.h"
  10. #include "rtl_lib.h"
  11. #include <stdbool.h>
  12.  
  13. #define NO_ERROR            0x00
  14. #define ACK_ERROR           0x01
  15. #define CHECKSUM_ERROR      0x02
  16. #define NULL_ERROR          0x03
  17.  
  18. #define MBED_I2C_MTR_SDA    PC_4
  19. #define MBED_I2C_MTR_SCL    PC_5
  20.  
  21. #define MBED_I2C_SLAVE_ADDR0    0x40
  22. #define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
  23.  
  24. #define MBED_I2C_BUS_CLK        100000  //hz
  25. #define I2C_DATA_MAX_LENGTH     16
  26.  
  27. uint8_t i2cdata_write[I2C_DATA_MAX_LENGTH];
  28. uint8_t i2cdata_read[I2C_DATA_MAX_LENGTH];
  29. int i2cdata_read_pos;
  30.  
  31. volatile i2c_t   i2cmaster;
  32.  
  33. // Sensor Commands
  34. typedef enum{
  35.     TRIG_T_MEASUREMENT_HM    = 0xE3, // command trig. temp meas. hold master
  36.     TRIG_RH_MEASUREMENT_HM   = 0xE5, // command trig. humidity meas. hold master
  37.     TRIG_T_MEASUREMENT_POLL  = 0xF3, // command trig. temp meas. no hold master
  38.     TRIG_RH_MEASUREMENT_POLL = 0xF5, // command trig. humidity meas. no hold master
  39.     USER_REG_W               = 0xE6, // command writing user register
  40.     USER_REG_R               = 0xE7, // command reading user register
  41.     SOFT_RESET               = 0xFE, // command soft reset
  42.     SerialNumber_location_1  = 0xFA0F,
  43.     SerialNumber_location_2  = 0xFCC9
  44. }etSHT2xCommand;
  45.  
  46. typedef enum {
  47.     SHT2x_RES_12_14BIT       = 0x00, // RH=12bit, T=14bit
  48.     SHT2x_RES_8_12BIT        = 0x01, // RH= 8bit, T=12bit
  49.     SHT2x_RES_10_13BIT       = 0x80, // RH=10bit, T=13bit
  50.     SHT2x_RES_11_11BIT       = 0x81, // RH=11bit, T=11bit
  51.     SHT2x_RES_MASK           = 0x81  // Mask for res. bits (7,0) in user reg.
  52. } etSHT2xResolution;
  53.  
  54. typedef enum {
  55.     SHT2x_EOB_ON             = 0x40, // end of battery
  56.     SHT2x_EOB_MASK           = 0x40, // Mask for EOB bit(6) in user reg.
  57. } etSHT2xEob;
  58.  
  59. static int SHT2x_GetSerialNumber(uint8_t u8SerialNumber[]);
  60. static int SHT2x_WriteCommand8(uint8_t cmd);
  61. static int SHT2x_WriteCommand16(uint16_t cmd);
  62. static int SHT2x_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum);
  63. static float SHT2x_CalcTemperature(uint16_t rawValue);
  64. static float SHT2x_CalcHumidity(uint16_t rawValue);
  65. int SHT2x_ReadUserRegister(uint8_t *pRegisterValue);
  66. int SHT2x_WriteUserRegister(uint8_t *pRegisterValue);
  67.  
  68. int SHT2x_Init(uint8_t u8SerialNumber[])
  69. {
  70.     uint8_t userRegister;           //variable for user register
  71.     int error = NO_ERROR;
  72.     
  73.     DiagPrintf("SHT2x_Init \r\n");
  74.     
  75.     i2c_init((i2c_t*)&i2cmaster, MBED_I2C_MTR_SDA ,MBED_I2C_MTR_SCL);
  76.     i2c_frequency((i2c_t*)&i2cmaster,MBED_I2C_BUS_CLK);
  77.     
  78.     if (u8SerialNumber == NULL
  79.         return NULL_ERROR;
  80.     // --- Reset sensor by command ---
  81.     error |= SHT2x_SoftReset();
  82.     // --- Read the sensors serial number (64bit) ---
  83.     error |= SHT2x_GetSerialNumber(u8SerialNumber);
  84.     // --- Set Resolution e.g. RH 10bit, Temp 13bit ---
  85.     error |= SHT2x_ReadUserRegister(&userRegister);  //get actual user reg
  86.     userRegister = (userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT;
  87.     error |= SHT2x_WriteUserRegister(&userRegister); //write changed user reg
  88.     
  89.     return error;
  90. }
  91.  
  92. static int SHT2x_GetSerialNumber(uint8_t u8SerialNumber[])
  93. {
  94.     int error = NO_ERROR;
  95.     
  96.     SHT2x_WriteCommand16(SerialNumber_location_1);  
  97.     if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 8, 1) != 8)
  98.         error |= NULL_ERROR;
  99.     u8SerialNumber[5] = i2cdata_read[0];//SNB_3
  100.     u8SerialNumber[4] = i2cdata_read[2];//SNB_2
  101.     u8SerialNumber[3] = i2cdata_read[4];//SNB_1
  102.     u8SerialNumber[2] = i2cdata_read[6];//SNB_0
  103.     
  104.     SHT2x_WriteCommand16(SerialNumber_location_2);  
  105.     if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 6, 1) != 6)
  106.         error |= NULL_ERROR;
  107.     u8SerialNumber[1] = i2cdata_read[0];//SNC_1
  108.     u8SerialNumber[0] = i2cdata_read[1];//SNC_0
  109.     u8SerialNumber[7] = i2cdata_read[3];//SNA_1
  110.     u8SerialNumber[6] = i2cdata_read[4];//SNA_0
  111.     
  112.     return error;
  113. }
  114.  
  115. static int SHT2x_CheckCrc(uint8_t data[], uint8_t nbrOfBytes, uint8_t checksum)
  116. {
  117.     uint8_t crc = 0;    
  118.     uint8_t byteCtr;
  119.     int error = NO_ERROR;
  120.     //calculates 8-Bit checksum with given polynomial
  121.     for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
  122.     { 
  123.         crc ^= (data[byteCtr]);
  124.         for (uint8_t bit = 8; bit > 0; --bit)
  125.         { 
  126.             if (crc & 0x80
  127.                 crc = (crc << 1) ^ POLYNOMIAL;
  128.             else 
  129.                 crc = (crc << 1);
  130.         }
  131.         }
  132.     if (crc != checksum) 
  133.         error |= CHECKSUM_ERROR;
  134.     
  135.     return error;
  136. }
  137.  
  138. //===========================================================================
  139. int SHT2x_SoftReset()
  140. //===========================================================================
  141. {
  142.     int error = NO_ERROR;
  143.     
  144.     SHT2x_WriteCommand8(SOFT_RESET);  
  145.     Mdelay(15); // wait till sensor has restarted
  146.     
  147.     return error;
  148. }
  149.  
  150. //===========================================================================
  151. int SHT2x_ReadUserRegister(uint8_t *pRegisterValue)
  152. //===========================================================================
  153. {
  154.     int error = NO_ERROR;
  155.     
  156.     SHT2x_WriteCommand8(USER_REG_R);
  157.     if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 2, 1) != 2)
  158.         error |= NULL_ERROR;
  159.     error |= SHT2x_CheckCrc (i2cdata_read,1,i2cdata_read[1]);
  160.     
  161.     return error;
  162. }
  163.  
  164. //===========================================================================
  165. int SHT2x_WriteUserRegister(uint8_t *pRegisterValue)
  166. //===========================================================================
  167. {
  168.     int error = NO_ERROR;
  169.     
  170.     SHT2x_WriteCommand8(USER_REG_W);
  171.     if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)pRegisterValue, 1, 1) != 1)
  172.         error |= NULL_ERROR;
  173.     return error;
  174. }
  175.  
  176. static int SHT2x_WriteCommand8(uint8_t cmd)
  177. {
  178.     int error = NO_ERROR;
  179.     
  180.     i2cdata_write[0] = (uint8_t)(cmd&0xFF);
  181.       if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, &i2cdata_write[0], 1, 0) != 1)
  182.         error |= NULL_ERROR;
  183.     return error;
  184. }
  185.  
  186. static int SHT2x_WriteCommand16(uint16_t cmd)
  187. {
  188.     int error = NO_ERROR;
  189.     
  190.     i2cdata_write[0] = (uint8_t)(cmd >>8);
  191.     i2cdata_write[1] = (uint8_t)(cmd&0xFF);
  192.       if (i2c_write((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, &i2cdata_write[0], 2, 0) != 2)
  193.         error |= NULL_ERROR;
  194.     return error;
  195. }
  196.  
  197. static float SHT2x_CalcTemperature(uint16_t rawValue)
  198. {
  199.     rawValue &= ~0x0003;           // clear bits [1..0] (status bits)
  200.     return -46.85 + 175.72/65536 *(float)rawValue; //T= -46.85 + 175.72 * ST/2^16
  201. }
  202.  
  203. static float SHT2x_CalcHumidity(uint16_t rawValue)
  204. {
  205.     rawValue &= ~0x0003;          // clear bits [1..0] (status bits)
  206.     return -6.0 + 125.0/65536 * (float)rawValue; // RH= -6 + 125 * SRH/2^16
  207. }
  208.  
  209. int SHT2x_GetTempAndHumi(float *temp, float *humi)
  210. {
  211.     int error = NO_ERROR;
  212.     uint16_t rawValueTemp;
  213.     uint16_t rawValueHumi;
  214.     
  215.     SHT2x_WriteCommand8(TRIG_T_MEASUREMENT_HM);  
  216.     //-- read two data bytes and one checksum byte --
  217.     if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 3, 1) != 3)
  218.         error |= NULL_ERROR;
  219.     //-- verify checksum --
  220.     error |= SHT2x_CheckCrc (i2cdata_read,2,i2cdata_read[2]);
  221.     rawValueTemp = i2cdata_read[0] << 8 | i2cdata_read[1];
  222.     
  223.     SHT2x_WriteCommand8(TRIG_RH_MEASUREMENT_HM);  
  224.     //-- read two data bytes and one checksum byte --
  225.     if (i2c_read((i2c_t*)&i2cmaster, MBED_I2C_SLAVE_ADDR0, (char*)&i2cdata_read[0], 3, 1) != 3)
  226.         error |= NULL_ERROR;
  227.     //-- verify checksum --
  228.     error |= SHT2x_CheckCrc (i2cdata_read,2,i2cdata_read[2]);
  229.     rawValueHumi = i2cdata_read[0] << 8 | i2cdata_read[1];
  230.     
  231.     //diag_printf("raw temp=0x%x, raw humidity=0x%x, error=%d\n", 
  232.     //          rawValueTemp, rawValueHumi, error);
  233.     
  234.     //-- calculate humidity and temperature --
  235.     if ( error == NO_ERROR ) {
  236.         *temp = SHT2x_CalcTemperature(rawValueTemp);
  237.         *humi = SHT2x_CalcHumidity(rawValueHumi);
  238.     }
  239.     
  240.     return error;
  241. }


 

文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/liwei16611/article/details/86571312

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。