Giao Tiếp Với Module Thẻ Từ RFID RC522

RFID RC522

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

STM32RFID
B15MOSI
B14MISO
B13SCK
C15CS (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

stm32f103 rc522 rfid

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à SetBitMaskClearBitMask để 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 Gamma

Từ khóa » Thư Viện Rfid Rc522