Linh Kiện 69_Module NRF24L01 2.4Ghz – Cách Giao Tiếp Với VĐK ...

Chào các bạn! Hôm nay Linh kiện 69 xin chia sẻ với các bạn cách thức sử dụng module nRF24L01 2.4Ghz

Ảnh mặt trước của Module nRF24L01 2.4Ghz

Ảnh chụp nghiêng Module nRF24L01 2.4Ghz

Sơ đồ phần cứng của Module nRF24L01 2.4Ghz:

Thông số kĩ thuật của Module nRF24L01 2.4Ghz:

– Radio:

+ Hoạt động ở giải tần 2.4G.

+ Có 126 kênh.

+ Truyền và nhận dữ liệu.

+ Truyền tốc độ cao 1Mbps hoặc 2Mbps.

– Công suất phát:

+ Có thể cài đặt được 4 công suất nguồn phát: 0, – 6, – 12, – 18dBm.

– Thu:

+ Có bộ lọc nhiễu tại đầu thu.

+ Khuếch đại bị ảnh hưởng bởi nhiễu thấp (LNA).

– Nguồn cấp:

+ Hoạt động từ 1.9-3.6V.

+ Các chân IO chạy được cả 3.3 lẫn 5V.

– Giao tiếp:

+ 4 pin SPI.

+ Tốc độ tối đa 8Mbps.

+ 3-32 bytes trên 1 khung truyền nhận. Chú ý: Tốc độ truyền càng nhanh khoảng cách truyền càng gần, ngược lại tốc độ truyền càng chậm thì khoảng cách thu được tín hiệu càng xa. Tùy theo mục đích sử dụng các bạn cấu hình cho phù hợp

Module thu phát không dây nRF24L01 hoạt động theo giao thức SPI, SPI là chuẩn truyền thông nối tiếp tốc độ cao. Đây là  kiểu truyền thông Master-Slave, trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và Slave. SPI là một cách truyền song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select). Sơ đồ kết nối vi điều khiển:

Nguyên lí hoạt động:

1. Cấu hình địa chỉ truyền nhận

Đầu tiên ta cấu hình địa chỉ truyền nhận dữ liệu, từ 3 – 5 bytes tùy ý,  nhưng địa chỉ truyền như thế nào thì địa chỉ nhận của chip tương ứng phải giống như thế để có thể thu được tín hiệu. Trong chương trình mình dùng 5 byte cho địa chỉ truyền nhận.

#define TX_ADR_WIDTH 5 // 5 uints TX address width #define RX_ADR_WIDTH 5 // 5 uints RX address width unsigned char TX_ADDRESS[TX_ADR_WIDTH]={0x68,0x31,0x08,0x10,0x01}; unsigned char RX_ADDRESS[RX_ADR_WIDTH]={0x68,0x31,0x08,0x10,0x01}; Hàm cấu hình địa chỉ truyền nhận SPI_Write_Buf(WRITE_RE + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WRITE_RE+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); 2. Khung truyền dữ liệu

Khung dữ liệu từ 0-32 byte, hiện tại mình dùng 32 byte. Nếu bạn dùng số lượng byte khác thì có thể cấu hình trong biến ở đây mình truyền 32 bytes.

#define TX_PLOAD_WIDTH 32 // 32 uints TX payload #define RX_PLOAD_WIDTH 32 // 32 uints TX payload Hàm nRF24L01_TxPacket(unsigned char * tx_buf) gửi dữ liệu trong mảng tx_buf SPI_Write_Buf(WR_TX_PLOAD, tx_buf,TX_PLOAD_WIDTH);//gửi dữ liệu 1 bytes

Hàm cấu hình số bytes nhận trong void init_NRF24L01(void)

SPI_Write_Buf(WRITE_RE+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); Độ rộng bytes nhận 32 bytes (Nhận tối đa 32bytes).

3. Kênh truyền và địa chỉ nhận

– nRF24L01 có 126 kênh truyền. Ban có thể lựa chọn kênh truyền nào bạn muốn bằng hàm.

SPI_RW_Reg(WRITE_RE + RF_CH, 0);

– Trong 1 kênh truyền, nRF24L01 có thể nhận được 6 luồng dữ liệu. Do đó bạn phải lựa chọn 1 trong 6 luồng đó.

SPI_RW_Reg(WRITE_RE + EN_AA, 0x01); // 0x01 Luồng P0 // 0x02 Luồng P1 // 0x03 Luồng P2 // 0x04 Luồng P3 // 0x05 Luồng P4 // 0x06 Luồng P5

4. Cấu hình tốc độ truyền công suất phát

– Hàm cấu hình công suất phát.

SPI_RW_Reg(WRITE_RE + RF_SETUP, 0x07);

Cấu hình tốc độ truyền 1Mpbs, công suất phát 0dmb

Để cấu hình tốc độ truyền theo công suất phát theo riêng mình các bạn chỉ cần sửa giá trị 0x07 thành giá trị khác dựa theo bảng sau

5. Mã CRC, truyền nhận

– Truyền:

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // Enable CRC, 2 byte CRC

– Nhận:

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F); // Enable CRC, 2 byte CRC

Các bạn nhìn theo bảng CONFIG Bit thứ 0 để cấu hình mode truyền hoặc nhận. Bằng “1” ứng với PRX cấu hình nhận, bằng “0” ứng với PTX cấu hình truyền. Bit thứ 1: “0” chế độ tiết kiệm năng lượng hay trạng thái nghỉ, bằng “1” cho phép NRF24L01 hoạt động. 6. Cách gửi dữ liệu:

Sau khi cấu hình các trạng thái hoạt động của nRF24L01 thông qua hàm:

void init_NRF24L01(void)

Để gửi dữ liệu đi bạn làm theo các bước sau.

– Cho dữ liệu vào buffer, biến TxBuf[32]

– Chọn nRF24L01 ở chế độ phát, gọi hàm void SetTX_Mode(void);

– Gọi hàm void nRF24L01_TxPacket(unsigned char * tx_buf) để truyền dữ liệu trong TxBuf[32] đi

7.  Cách nhận dữ liệu của Module nRF24L01 2.4Ghz:

– Chọn nRF24L01 ở chế độ thu, gọi hàm void SetRX_Mode(void);

– Độ dữ liệu trong bộ đệm sau khi gọi hàm

unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);

* Kết luận:

Mình sẽ nói một cách đơn giản để bạn có định hướng:

Khi giao tiếp với nRF, các bước bạn phải làm như sau:

+ Chân CSN phải đang ở trạng thái cao, sau đó kéo về 0 để nRF đang hiểu là ta đang giao tiếp với nó.

+ Gửi byte cho nRF, byte đầu tiên bạn gửi phải là 1 byte lệnh (command byte) (các loại byte lệnh bạn đọc trong datasheet nhé), cùng lúc đó, nRL sẽ gửi về cho bạn giá trị của thanh ghi status (luôn luôn là như vậy), các byte sau đó thì tùy loại cmd thì nRF sẽ phản hồi lại tùy vào cmd bạn sử dụng.

+ Kéo chân CSN lên mức cao để kết thúc việc giao tiếp.

Xem thêm tại: http://linhkien69.vn/module-nrf24l01-24ghz-cach-giao-tiep-voi-vdk-arm-cortexm3_n57981_g723.aspx#sthash.Ib7zZkdI.dpuf

Linh Kiện 69 chúc các bạn học tập và làm việc thành công!

21.007216 105.844667 25 Trần Đại Nghĩa, Bách Khoa, Hai Bà Trưng, Hà Nội, Việt Nam

Chia sẻ:

  • Twitter
  • Facebook
Thích Đang tải...

Từ khóa » Nguyên Lý Nrf24l01