如何為編程愛好者設計一款好玩的智能硬件(十)——無線2.4G通信模塊研究·一篇說完


 

六、溫濕度傳感器DHT11驅動封裝(下):如何為編程愛好者設計一款好玩的智能硬件(六)——初嘗試·把溫濕度給收集了(下)!

七、點陣字符型液晶顯示模塊LCD1602驅動封裝(上):如何為編程愛好者設計一款好玩的智能硬件(七)——LCD1602點陣字符型液晶顯示模塊驅動封裝(上)

八、LCD1602點陣字符型液晶顯示模塊驅動封裝(中):如何為編程愛好者設計一款好玩的智能硬件(八)——LCD1602點陣字符型液晶顯示模塊驅動封裝(中)

九、LCD1602點陣字符型液晶顯示模塊驅動封裝(下)如何為編程愛好者設計一款好玩的智能硬件(九)——LCD1602點陣字符型液晶顯示模塊驅動封裝(下)

 

十、nRF24L01無線2.4G一篇說完

 

  承接上文,本節將從零開始帶你認識無線2.4G模塊,了解其控制和通信指令,從而封裝一個nRF24L01底層的驅動函數,並最終寫一個3-3通信的小實驗驗證我們的封裝。在Quick Know部分你將快速瀏覽到nRF24L01的基本信息;在Thorough Understand部分你將深入nRF24L01細節了解其通信屬性;在最后一部分你將看到我關於nRF24L01的底層驅動封裝,並基於這個封裝做了個簡陋的3對3無線互傳實驗。


 

 
QUICK KNOW


1、芯片簡介:

  NRF24L01 是 NORDIC 公司最近生產的一款無線通信通信芯片,采用 FSK 調制,內部集成 NORDIC 自己的 Enhanced Short Burst 協議。可以實現點對點或是 1 對 6 的無線通信。無線通信速度可以達到 2M(bps)。NORDIC 公司提供通信模塊的 GERBER 文件,可以直接加工生產。嵌入式工程師或是單片機愛好者只需要為單片機系統預留 5 個GPIO,1 個中斷輸入引腳,就可以很容易實現無線通信的功能,非常適合用來為 MCU 系統構建無線通信功能。


2、數據接口主要是SPI接口:

CSN:芯片的片選線,CSN 為低電平芯片工作。
SCK:芯片控制的時鍾線(SPI 時鍾)
MISO:芯片控制數據線(Master input slave output)
MOSI:芯片控制數據線(Master output slave input)
IRQ:中斷信號。無線通信過程中 MCU 主要是通過 IRQ 與 NRF24L01 進行通信。
CE: 芯片的模式控制線。在 CSN 為低的情況下,CE 協同 NRF24L01 的 CONFIG 寄存器共同決定 NRF24L01 的狀態(參照 NRF24L01 的狀態機)。
 

 

3、NRF24L01狀態及狀態機:

Power Down Mode:掉電模式
Tx Mode:發射模式
Rx Mode:接收模式
Standby-1 Mode:待機 1 模式
Standby-2 Mode:待機 2 模式

 

4、對24L01的固件編程的基本思路如下:

1) 置CSN為低,使能芯片,配置芯片各個參數。配置參數在Power Down狀態中完成。
2) 如果是Tx模式,填充TxFIFO。
3) 配置完成以后,通過 CE 與 CONFIG 中的 PWR_UP 與 PRIM_RX 參數確定 24L01要切換到的狀態。
Tx Mode:PWR_UP=1; PRIM_RX=0; CE=1 (保持超過 10us 就可以);
Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;
4) IRQ 引腳會在以下三種情況變低:
Tx FIFO 發完並且收到 ACK(使能 ACK 情況下)
Rx FIFO 收到數據
達到最大重發次數
將 IRQ 接到外部中斷輸入引腳,通過中斷程序進行處理。

 

5、Tx與Rx的配置過程 :

  Tx模式初始化過程

1)寫 Tx 節點的地址 TX_ADDR
2)寫 Rx 節點的地址(主要是為了使能 Auto Ack) RX_ADDR_P0
3)使能 AUTO ACK EN_AA
4)使能 PIPE 0 EN_RXADDR
5)配置自動重發次數 SETUP_RETR
6)選擇通信頻率 RF_CH
7)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
8 ) 選擇通道 0 有效數據寬度 Rx_Pw_P0
9)配置 24L01 的基本參數以及切換工作模式 CONFIG

 

 

 

 

 

 

 

 

 

Rx 模式初始化過程

1)寫 Rx 節點的地址 RX_ADDR_P0
2)使能 AUTO ACK EN_AA
3)使能 PIPE 0 EN_RXADDR
4)選擇通信頻率 RF_CH
5) 選擇通道 0 有效數據寬度 Rx_Pw_P0
6)配置發射參數(低噪放大器增益、發射功率、無線速率) RF_SETUP
7)配置 24L01 的基本參數以及切換工作模式 CONFIG

 

 

 

 

 

 

 

 

6、原理圖:

 

 

 

THOROUGH UNDERSTAND

1、Introduction:

  The nRF24L01+ is a single chip 2.4GHz transceiver with an embedded baseband protocol engine(Enhanced ShockBurst™), suitable for ultra low power wireless applications. The nRF24L01+ is designed for operation in the world wide ISM frequency band at 2.400 - 2.4835GHz.

  To design a radio system with the nRF24L01+, you simply need an MCU (microcontroller) and a few external passive components.

  You can operate and configure the nRF24L01+ through a Serial Peripheral Interface (SPI). The register map, which is accessible through the SPI, contains all configuration registers in the nRF24L01+ and is accessible in all operation modes of the chip.

  The embedded baseband protocol engine (Enhanced ShockBurst™) is based on packet communication and supports various modes from manual operation to advanced autonomous protocol operation. Internal FIFOs ensure a smooth data flow between the radio front end and the system’s MCU. Enhanced Shock-Burst™ reduces system cost by handling all the high speed link layer operations.

  The radio front end uses GFSK modulation. It has user configurable parameters like frequency channel,output power and air data rate. nRF24L01+ supports an air data rate of 250 kbps, 1 Mbps and 2Mbps. The high air data rate combined with two power saving modes make the nRF24L01+ very suitable for ultra low power designs.

  nRF24L01+ is drop-in compatible with nRF24L01 and on-air compatible with nRF2401A, nRF2402,nRF24E1 and nRF24E2. Intermodulation and wideband blocking values in nRF24L01+ are much improved in comparison to the nRF24L01 and the addition of internal filtering to nRF24L01+ has improved the margins for meeting RF regulatory standards.

  Internal voltage regulators ensure a high Power Supply Rejection Ratio (PSRR) and a wide power supply range.

 

 

2、Features:

 • Radio
  􀁘 Worldwide 2.4GHz ISM band operation
  􀁘 126 RF channels
  􀁘 Common RX and TX interface
  􀁘 GFSK modulation
  􀁘 250kbps, 1 and 2Mbps air data rate
  􀁘 1MHz non-overlapping channel spacing at 1Mbps
  􀁘 2MHz non-overlapping channel spacing at 2Mbps
• Transmitter
  􀁘 Programmable output power: 0, -6, -12 or -18dBm
  􀁘 11.3mA at 0dBm output power
• Receiver
  􀁘 Fast AGC for improved dynamic range
  􀁘 Integrated channel filters
  􀁘 13.5mA at 2Mbps
  􀁘 -82dBm sensitivity at 2Mbps
  􀁘 -85dBm sensitivity at 1Mbps
  􀁘 -94dBm sensitivity at 250kbps
• RF Synthesizer
  􀁘 Fully integrated synthesizer
  􀁘 No external loop filer, VCO varactor diode or resonator
  􀁘 Accepts low cost ±60ppm 16MHz crystal
• Enhanced ShockBurst™
  􀁘 1 to 32 bytes dynamic payload length
  􀁘 Automatic packet handling
  􀁘 Auto packet transaction handling
  􀁘 6 data pipe MultiCeiver™ for 1:6 star networks
• Power Management
  􀁘 Integrated voltage regulator
  􀁘 1.9 to 3.6V supply range
  􀁘 Idle modes with fast start-up times for advanced power management
  􀁘 26μA Standby-I mode, 900nA power down mode
  􀁘 Max 1.5ms start-up from power down mode
  􀁘 Max 130us start-up from standby-I mode
• Host Interface
  􀁘 4-pin hardware SPI
  􀁘 Max 10Mbps
  􀁘 3 separate 32 bytes TX and RX FIFOs
  􀁘 5V tolerant inputs
• Compact 20-pin 4x4mm QFN package

 

3、Operational Modes:

  You can configure the nRF24L01+ in power down, standby, RX or TX mode. This section describes these modes in detail.

 

  • Power Down Mode

  In power down mode nRF24L01+ is disabled using minimal current consumption. All register values available are maintained and the SPI is kept active, enabling change of configuration and the uploading/downloading of data registers. Power down mode is entered by setting the PWR_UP bit in the CONFIG register low.

 

  • Standby-I mode

  By setting the PWR_UP bit in the CONFIG register to 1, the device enters standby-I mode. Standby-I mode is used to minimize average current consumption while maintaining short start up times. In this mode only part of the crystal oscillator is active. Change to active modes only happens if CE is set high and when CE is set low, the nRF24L01 returns to standby-I mode from both the TX and RX modes.

 

  • Standby-II mode

  In standby-II mode extra clock buffers are active and more current is used compared to standby-I mode. nRF24L01+ enters standby-II mode if CE is held high on a PTX device with an empty TX FIFO. If a new packet is uploaded to the TX FIFO, the PLL immediately starts and the packet is transmitted after the normal PLL settling delay (130μs).Register values are maintained and the SPI can be activated during both standby modes.

 

  • RX mode(important one !!!)

  The RX mode is an active mode where the nRF24L01+ radio is used as a receiver. To enter this mode, the nRF24L01+ must have the PWR_UP bit, PRIM_RX bit and the CE pin set high.

  In RX mode the receiver demodulates the signals from the RF channel, constantly presenting the demodulated data to the baseband protocol engine. The baseband protocol engine constantly searches for a valid packet. If a valid packet is found (by a matching address and a valid CRC) the payload of the packet is presented in a vacant slot in the RX FIFOs. If the RX FIFOs are full, the received packet is discarded.

  The nRF24L01+ remains in RX mode until the MCU configures it to standby-I mode or power down mode. However, if the automatic protocol features (Enhanced ShockBurst™) in the baseband protocol engine are enabled, the nRF24L01+ can enter other modes in order to execute the protocol.

  In RX mode a Received Power Detector (RPD) signal is available. The RPD is a signal that is set high when a RF signal higher than -64 dBm is detected inside the receiving frequency channel. The internal RPD signal is filtered before presented to the RPD register. The RF signal must be present for at least 40μs before the RPD is set high.

 

  • TX mode (also the important mode!!!)

  The TX mode is an active mode for transmitting packets. To enter this mode, the nRF24L01+ must have the PWR_UP bit set high, PRIM_RX bit set low, a payload in the TX FIFO and a high pulse on the CE for more than 10μs.

  The nRF24L01+ stays in TX mode until it finishes transmitting a packet. If CE = 0, nRF24L01+ returns to standby-I mode. If CE = 1, the status of the TX FIFO determines the next action. If the TX FIFO is not empty the nRF24L01+ remains in TX mode and transmits the next packet. If the TX FIFO is empty the nRF24L01+ goes into standby-II mode. The nRF24L01+ transmitter PLL operates in open loop when in TX mode. It is important never to keep the nRF24L01+ in TX mode for more than 4ms at a time. If the Enhanced ShockBurst™ features are enabled, nRF24L01+ is never in TX mode longer than 4ms.

 

The following table describes how to configure the operational modes

 

 4、Air data rate:

  The air data rate is the modulated signaling rate the nRF24L01+ uses when transmitting and receiving data. It can be 250kbps, 1Mbps or 2Mbps. Using lower air data rate gives better receiver sensitivity than higher air data rate. But, high air data rate gives lower average current consumption and reduced probability of on-air collisions.(high rate low right data transmission

  The air data rate is set by the RF_DR bit in the RF_SETUP register. A transmitter and a receiver must be programmed with the same air data rate to communicate with each other.

  nRF24L01+ is fully compatible with nRF24L01. For compatibility with nRF2401A, nRF2402, nRF24E1, and nRF24E2 the air data rate must be set to 250kbps or 1Mbps.

 

5、RF channel frequency:

  The RF channel frequency determines the center of the channel used by the nRF24L01+. The channel occupies a bandwidth of less than 1MHz at 250kbps and 1Mbps and a bandwidth of less than 2MHz at 2Mbps. nRF24L01+ can operate on frequencies from 2.400GHz to 2.525GHz. The programming resolution of the RF channel frequency setting is 1MHz.

  At 2Mbps the channel occupies a bandwidth wider than the resolution of the RF channel frequency setting. To ensure non-overlapping channels in 2Mbps mode, the channel spacing must be 2MHz or more. At 1Mbps and 250kbps the channel bandwidth is the same or lower than the resolution of the RF frequency.

  The RF channel frequency is set by the RF_CH register according to the following formula:

F0= 2400 + RF_CH [MHz]

  You must program a transmitter and a receiver with the same RF channel frequency to communicate with each other.

 

6、數據包處理方式:

nRF24L01 有如下幾種數據包處理方式
  􀁺 ShockBurstTM 與nRF2401 nRF24E1 nRF2402 nRF24E2 數據傳輸率為1Mbps 時相同
  􀁺 增強型ShockBurstTM 模式

 

7、ShockBurstTM 模式:

  ShockBurst 模式下,nRF24L01可以與成本較低的低速MCU相連,高速信號處理是由芯片內部的射頻協議處理的,nRF24L01提供SPI 接口數據率取決於單片機本身接口速度。ShockBurst 模式通過允許與單片機低速通信而無線部分高速通信,減小了通信的平均消耗電流。

  在ShockBurstTM 接收模式下當接收到有效的地址和數據時,IRQ通知MCU,隨后MCU可將接收到的數據從RX FIFO 寄存器中讀出。

  在ShockBurstTM 發送模式下,nRF24L01自動生成前導碼及CRC。數據發送完畢后IRQ通知MCU,減少了MCU的查詢時間,也就意味着減少了MCU 的工作量同時減少了軟件的開發時間。nRF24L01 內部有三個不同的RX FIFO 寄存器,6 個通道共享此寄存器和三個不同的TX FIFO 寄存器。在掉電模式下、待機模式下和數據傳輸的過程中MCU 可以隨時訪問FIFO 寄存器,這就允許SPI接口可以以低速進行數據傳送並且可以應用於MCU 硬件上沒有SPI 接口的情況下。

 

8、增強型的ShockBurstTM 模式:

  增強型 ShockBurstTM 模式可以使得雙向鏈接協議執行起來更為容易、有效。典型的雙向鏈接為發送方要求終端設備在接收到數據后有應答信號,以便於發送方檢測有無數據丟失,一旦數據丟失則通過重
新發送功能將丟失的數據恢復。增強型的ShockBurstTM 模式可以同時控制應答及重發功能而無需增加MCU工作量。

 

9、MultiCeiver™:

  MultiCeiver™ is a feature used in RX mode that contains a set of six parallel data pipes with unique addresses. A data pipe is a logical channel in the physical RF channel. Each data pipe has its own physical address (data pipe address) decoding in the nRF24L01+.

  nRF24L01+ configured as PRX (primary receiver) can receive data addressed to six different data pipes in one frequency channel as shown in Figure up. Each data pipe has its own unique address and can be configured for individual behavior.

  Up to six nRF24L01+s configured as PTX can communicate with one nRF24L01+ configured as a PRX. All data pipe addresses are searched for simultaneously(同時地). Only one data pipe can receive a packet at a time. All data pipes can perform Enhanced ShockBurst™ functionality.

  The following settings are common to all data pipes:

• CRC enabled/disabled (CRC always enabled when Enhanced ShockBurst™ is enabled)
• CRC encoding scheme
• RX address width
• Frequency channel
• Air data rate
• LNA gain

  注:The data pipes are enabled with the bits in the EN_RXADDR register. By default only data pipe 0 and 1 are enabled. Each data pipe address is configured in the RX_ADDR_PX registers. 

   注: Always ensure that none of the data pipes have the same address.

 

  數據通道0是唯一的一個可以配置為40 位自身地址的數據通道1~5數據通道都為8位自身地址和32位公用地址。The LSByte must be unique for all six pipes. Flowing figure is an example of how data pipes 0-5 are addressed.

 

  nRF24L01在確認收到數據后記錄地址並以此地址為目標地址發送應答信號。在發送端數據通道0被用做接收應答信號,因此,數據通道0的接收地址要與發送端地址相等,以確保接收到正確的應答信號。

  nRF24L01配置為增強型的ShockBurstTM發送模式下時,只要MCU有數據要發送nRF24L01就會啟動ShockBurstTM模式來發送數據。在發送完數據后,nRF24L01轉到接收模式並等待終端的應答信號。如果沒有收到應答信號,nRF24L01將重發相同的數據包,直到收到應答信號或重發次數超過SETUP_RETR_ARC寄存器中設置的值為止(如果重發次數超過了設定值則產生MAX_RT中斷)。只要收到確認信號,nRF24L01 就認為最后一包數據已經發送成功(接收方已經收到數據),把TX FIFO中的數據清除掉並產生TX_DS(中斷IRQ引腳置高)。

 

 

START PROGRAMMING

  

  上面看了那么多文字,想來頭疼,遂!

最終效果視頻

三個51單片機開發板每個都接一個無線2.4G模塊

上位機通過串口向任何一個模塊發送指令"1",該模塊會向其他模塊發送該信息

其他模塊收到該信息則單片機控制一個燈閃爍表示收到數據

三個模塊配置為發送地址和接收地址全部一樣,所以可以互相通信

 

1、工程概覽

為了方便,這里的delay文件是借用前幾次的(不要看)

2.4G模塊封裝全在nRF24L01.C和.H文件中(重點)

test.C文件中主要是main函數,實現通信邏輯(了解)

 

 

2、封裝講解

  在.H中前面主要是對nRF24L01通信引腳(6個的宏定義-便於移植到其他平台),每個封裝類似,如下:

1 #define nRF24L01_CE_PIN                        nRF24L01_CE
2 #define nRF24L01_CE_PIN_SET                nRF24L01_CE=1
3 #define nRF24L01_CE_PIN_CLEAR            nRF24L01_CE=0
4 //#define nRF24L01_CE_PIN_IN    
5 //#define nRF24L01_CE_PIN_OUT
6 #define nRF24L01_CE_PIN_WRITE            nRF24L01_CE
7 #define nRF24L01_CE_PIN_READ            nRF24L01_CE

  因為這幾個引腳沒有既是輸出又要做輸入的引腳,所以注釋掉了第4、5兩行,但是對於CC2541這樣的單片機,雖然省了引腳屬性切換,但是還是要在初始化的地方進行屬性設置的!由於51的引腳操作簡單,所以set、clear、read、write都比較簡單。

 

  接着是nRF24L01的一些寄存器指令和寄存器地址,這里只貼部分:  

 1 //NRF24L01寄存器指令
 2 #define READ_REG        0x00      // 讀寄存器指令
 3 #define WRITE_REG       0x20     // 寫寄存器指令
 4 #define RD_RX_PLOAD     0x61      // 讀取接收數據指令
 5 #define WR_TX_PLOAD     0xA0      // 寫待發數據指令
 6 #define FLUSH_TX        0xE1     // 沖洗發送 FIFO指令
 7 #define FLUSH_RX        0xE2      // 沖洗接收 FIFO指令
 8 #define REUSE_TX_PL     0xE3      // 定義重復裝載數據指令
 9 #define NOP             0xFF      // 保留
10 //SPI(nRF24L01)寄存器地址
11 #define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
12 #define EN_AA           0x01  // 自動應答功能設置
13 #define EN_RXADDR       0x02  // 可用信道設置
14 #define SETUP_AW        0x03  // 收發地址寬度設置
15 #define SETUP_RETR      0x04  // 自動重發功能設置 

 

  最后是.C內封裝的函數,上面幾個是基本通信函數(其中第一個是最基本的通信函數,負責傳送8bit數據)。下面幾個就是nRF24L01的功能函數,分別負責初始化、檢測是否正常、設置為接收模式、設置為發送模式、接收數據和發送數據。一會在main函數中你會看到一些關於它們的基本組合用法。

 1 t_uc nRF24L01_SPI_SendByte(t_uc dat);//傳送一字節的超底層的通信函數
 2 t_uc nRF24L01_SPI_ReadReg(t_uc reg);//NRF24L01的SPI時序,讀取指定寄存器的內容
 3 t_uc nRF24L01_SPI_WriteReg(t_uc reg, t_uc value);//NRF24L01的SPI時序,寫入指定寄存器的內容
 4 t_uc nRF24L01_SPI_ReadBuf(t_uc reg, t_uc *pBuf, t_uc Len);
 5 t_uc nRF24L01_SPI_WriteBuf(t_uc reg, t_uc *pBuf, t_uc Len);
 6 
 7 
 8 void nRF24L01_Init(void);
 9 t_uc nRF24L01_Check(void);
10 void nRF24L01_Set_RX_Mode(void);//數據接收模式
11 void nRF24L01_Set_TX_Mode(void);//數據發送模式
12 t_uc nRF24L01_RxPacket(unsigned char *rx_buf);//數據讀取后放入rx_buf接收緩沖區中
13 void nRF24L01_TxPacket(unsigned char *tx_buf);//發送tx_buf中數據

 

3、主函數描述

  主函數便是調用封裝的幾個函數實現簡單的無線通信功能。雖然main函數代碼看起來爛了點,但是我發現自己修改一下反而不利於理解,索性就拿這個原汁原味的廠家給的demo中的main函數介紹了:

 1 void main()
 2 {
 3     LED = 1;                //初始燈6熄滅
 4     uart_flag = 0;            //串口標志初始為0
 5     nRF24L01_Init();        //初始化24L01
 6     UART_Init();            //初始化串口
 7 
 8     while(nRF24L01_Check())                    //檢查不到24l01則報警
 9     {
10         LED = 0;
11         delay_ms(200);
12         LED = 1;
13         delay_ms(200);
14     }
15     while(1)
16     {
17         nRF24L01_Set_RX_Mode();                            //接收模式
18         while(!nRF24L01_RxPacket(Rx_Buf))     //等待接收數據,返回1則接收到數據,在等待接收數據期間,可以隨時變成發送模式
19         {
20             if(uart_flag == 1)                //當串口接受標志為1表示有數據過來
21             {
22                 ES = 0;                               //關串口中斷
23 
24                 nRF24L01_Set_TX_Mode();                         //發送模式
25                 Tx_Buf1[0] = a - '0';                    //將串口數據給發送緩沖區
26                 nRF24L01_TxPacket(Tx_Buf1);        //發送命令數據24L01
27                 UART_Send_Byte('O');            //向串口發送已經傳送
28                 UART_Send_Byte('K');
29                 UART_Send_Byte(':');
30                 UART_Send_Byte(a);
31                 UART_Send_Byte('\n');
32                 LED = 0;
33                 delay_ms(300);
34                 LED = 1;
35                 delay_ms(300);                    //發送后LED1閃一下
36 
37                 ES = 1;                            //允許串口中斷
38                 uart_flag = 0;                      //中斷標志位置0
39                 break;                            //退出最近的循環,從而變回接收模式,這句關鍵
40             }
41         }
42         if(Rx_Buf[0] == 1)                               //若接收到對應的數據則實現對應功能
43         {
44             Rx_Buf[0] = 0;                //清空數據
45             LED = 0;
46             delay_ms(300);
47             LED = 1;
48             delay_ms(300);                //接收到數據 后閃爍
49         }
50     }
51 }

 

 

小結&計划

  至此,算是馬馬虎虎封裝了一傳感器、一個顯示器、一個通信模塊。是不是我們可以着手做一個組合型的更有意思的東西了?還太早!因為我們無論是串口還是2.4還是藍牙,都僅僅實現通信,並沒有采取必要措施保證通信的可靠與穩定,所以接下來一段時間我們將會在底層通信物理層上繼續封裝高層穩定的通信協議~敬請期待!

 

 

鏈接

希望這些資料對大家有幫助

大家順手點個贊支持一下(⊙o⊙)哦

大晚上的,不容易丫!

http://pan.baidu.com/s/1jG2HotK

 

 

@beautifulzzzz

  2015-10-9 持續更新中~

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM