Giao Tiếp Với Module Thẻ Từ RFID RC522
Có thể bạn quan tâm
Chào các bạn, hôm này mình sẽ hướng dẫn các bạn tìm hiểu và lập trình giao tiếp với module thẻ từ RFID RC522, vi điều khiển được sử dụng trong bài này kit stm32f103c8t6 và Cubemx để khởi tạo code
Kết nối
STM32 | RFID |
B15 | MOSI |
B14 | MISO |
B13 | SCK |
C15 | CS (SDA) |
Khởi tạo code trên cubeMX
Chọn RCC chọn thạch anh ngoàiChọn SYS bật serial debugBật SPI2 chế độ full master, tốc độ spi tầm 10Mhz trở lạiCấu hình output chân C15
Sinh code và mở project lên
Lập trình
Có thể chia phần lập trình ra làm 2 nhóm chính
- Nhóm chương trình giao tiếp với module RC522 (PCD)
- Nhóm chương trình giao tiếp với miếng thẻ từ (PICC) ( thông qua mạch RC522)
Phần 1: Giao tiếp với module RC522
Trước tiên phải tải datasheet về đã: https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf
Module RFID mặc định ra chân SPI nên chúng ta sẽ sử dụng bộ SPI2 để giao tiếp với nó nhé
Hàm truyền nhận spi cơ bản
C uint8_t spi_transmit(uint8_t byte) { uint8_t rv; HAL_SPI_TransmitReceive(&hspi2,(uint8_t *)&byte,(uint8_t *)&rv,1,100); return rv; }123456 | uint8_t spi_transmit(uint8_t byte){uint8_t rv;HAL_SPI_TransmitReceive(&hspi2,(uint8_t*)&byte,(uint8_t*)&rv,1,100);returnrv;} |
Hàm này không có gì phải giải thích, chỉ đơn giản là dùng bộ SPI để gửi 1byte đi và nhận về 1 byte
Các hàm đọc ghi module RFID
Quá trình giao tiếp về cơ bản là đọc và ghi giá trị vào các thanh ghi của module RFID, để đọc và ghi thì chúng ta cần biết địa chỉ của thanh ghi tương ứng cũng như chức năng tương ứng của thanh ghi đó. Nói chung, quá trình giao tiếp luôn bắt đầu bằng việc gửi đi địa chỉ của 1 thanh ghi nào đó. Địa chỉ thanh ghi được mã hóa bằng 6 bits
Quá trình đọc
Do trong giao thức SPI, byte dữ liệu trả về luôn muộn hơn byte gửi đi nên byte đọc về thứ 1 sẽ là byte rác. Và để đọc được byte cuối cùng thì gửi nhét thêm 1 byte rác (mặc định là 0x00)
Quá trình ghi
Để ghi dữ liệu vào thanh ghi nào đó, ta gửi địa chỉ của nó đi sau đó gửi kèm theo dữ liệu. Tùy thuộc vào địa chỉ đó yêu cầu mấy byte dữ liệu ta gửi đúng số byte dữ liệu tương ứng
Module RFID phân biệt lệnh đọc hay ghi bằng bit 0 của địa chỉ thanh ghi, do địa chỉ thanh ghi chỉ chiếm 6 bis nên vẫn còn thừa 2 bits, module này yêu cầu chúng ta phải dịch trái địa chỉ thanh ghi lên cao, chừa lại bit cao nhất (bit 7) để nó phân biệt lệnh này là đọc hay ghi và bit cuối (bits 0 ) nó bắt phải là 0Cụ thể: bit 0 là 1 thì đây là đọc, ngược lại bit 0 là 0 thì đây là ghi
Hàm ghi dữ liệu vào 1 thanh ghi
C void RFID_write(unsigned char reg, unsigned char data) { MFRC522_CS_EN; spi_transmit((reg<<1)&0x7E); spi_transmit(data); MFRC522_CS_DIS; }1234567 | voidRFID_write(unsignedcharreg,unsignedchardata){MFRC522_CS_EN;spi_transmit((reg<<1)&0x7E);spi_transmit(data);MFRC522_CS_DIS;} |
Phép &0x7E có tác dụng xóa bit 0 về 0 và xóa bit 7 về 0 (thể hiện đây là lệnh ghi vào )
Hàm đọc dữ liệu vào 1 thanh ghi
C unsigned char RFID_read(unsigned char reg) { unsigned char data; MFRC522_CS_EN; spi_transmit(((reg<<1)&0x7E)|0x80); data = spi_transmit(0x00); MFRC522_CS_DIS; return data; }123456789 | unsignedcharRFID_read(unsignedcharreg){unsignedchardata;MFRC522_CS_EN;spi_transmit(((reg<<1)&0x7E)|0x80);data=spi_transmit(0x00);MFRC522_CS_DIS;returndata;} |
Phép |0x80 có tác dụng set bit 7 lên cao thể hiện đây là đọc ra
Đôi khi chúng ta chỉ cần đọc và ghi 1 bit của cả thanh ghi, để làm được việc này chúng ta cần đọc toàn bộ dự liệu của thanh ghi đó ra rồi dùng toán tử OR và AND để set giá trị mong muốn lên bit cần sửa đổi. Do vậy mình tạo thêm 2 hàm tên là SetBitMask và ClearBitMask để phục vụ việc thao tác lên 1 bit trên thanh ghi
C void SetBitMask(unsigned char reg,unsigned char mask) { unsigned char tmp = 0x0; tmp = RFID_read(reg); RFID_write(reg,tmp | mask); } void ClearBitMask(unsigned char reg,unsigned char mask) { unsigned char tmp = 0x0; tmp = RFID_read(reg); RFID_write(reg, tmp & ~mask); }123456789101112 | voidSetBitMask(unsignedcharreg,unsignedcharmask){unsignedchartmp=0x0;tmp=RFID_read(reg);RFID_write(reg,tmp|mask);}voidClearBitMask(unsignedcharreg,unsignedcharmask){unsignedchartmp=0x0;tmp=RFID_read(reg);RFID_write(reg,tmp&~mask);} |
Vậy là xong 2 hàm đọc ghi cơ bản, bây giờ tiến hành sử dụng 2 hàm này để thực hiện giao tiếp với module RC522
Hàm khởi tạo module
Đương nhiên rồi, moudule nào muốn hoạt động được thì cũng phải khởi tạo các chế độ hoạt động cho nó, một số thanh ghi cần quan tâm, cụ thể chi tiết nó là gì thì các bạn đọc datasheet nhé
Thanh ghi ModeReg register (0x11)
Giá trị cài đặt: 0x3DRFID_write(0x11,0x3D);
Thanh ghi TReloadReg (0x2C 0x2D) đây là thanh ghi 16bit nên cần phải ghi 2 lần.Giá trị cần ghi 0x0030RFID_write(0x2D,30); RFID_write(0x2C,0);
Thanh ghi TModeReg (0x2A 0x2B) đây cũng là thanh ghi 16 bit nên có cần ghi 2 lần
RFID_write(0x2A,0x8D);RFID_write(0x2B,0x3E);
Thanh ghi TxASKReg (0x15)
RFID_write(0x15,0x40);
Đây là các cài đặt cơ bản cho module RFID, các bạn muốn hiểu rõ cụ thể nó ra làm sao thì tham khảo chi tiết chức năng các thanh ghi này trong datasheet nhé !
Thanh ghi điều khiển angten TxControlReg (0x14)
2 bit đầu tiên của thanh ghi này nếu được set=1 thì sẽ kích hoạt ang ten, ngược lại thì tắt
C void MFRC522_AntennaOn(void) { unsigned char i; i = RFID_read(0x14); if (!(i & 0x03)) { SetBitMask(0x14, 0x03); } } void MFRC522_AntennaOff(void) { ClearBitMask(0x14, 0x03); }12345678910111213 | voidMFRC522_AntennaOn(void){unsignedchari;i=RFID_read(0x14);if(!(i&0x03)){SetBitMask(0x14,0x03);}}voidMFRC522_AntennaOff(void){ClearBitMask(0x14,0x03);} |
Còn nữa …
Related posts:
Lập trình LED dây UCS1903 với stm32f103c8t6Tìm hiểu màn hình LCD 5110 và cách giao tiếp với vi điều khiểnBit Band trên STM32Hiệu chỉnh GammaTừ khóa » Thư Viện Rfid Rc522
-
Hướng Dẫn Sử Dụng MFRC522 RFID Reader Với Arduino
-
Miguelbalboa/rfid: Arduino RFID Library For MFRC522 - GitHub
-
MFRC522 - Arduino Library List
-
Hướng Dẫn Sử Dụng MFRC522 RFID Reader Với Arduino - KME
-
RFID | Cộng đồng Arduino Việt Nam
-
Lập Trình Và Sử Dụng Modul đọc Thẻ RFID-RC522
-
Module đọc RFID RC522 - Blog Mecsu
-
MFRC522 - Arduino Reference
-
Module đọc Thẻ Từ RFID RC522 -TH013 | Shopee Việt Nam
-
STM32F103C8T6 – Giao Tiếp RFID RC522
-
Hướng Dẫn Sử Dụng Module RFID Reader With Cards Kit 13.56MHz
-
Mạch RFID RC522 S50 - Nshop
-
Mạch RFID RC522 NFC 13.56Mhz - Nshop