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ài
Chọn SYS bật serial debug
Bật SPI2 chế độ full master, tốc độ spi tầm 10Mhz trở lại
Cấ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
1 2 3 4 5 6 |
uint8_t spi_transmit(uint8_t byte) { uint8_t rv; HAL_SPI_TransmitReceive(&hspi2,(uint8_t *)&byte,(uint8_t *)&rv,1,100); return rv; } |
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à 0
Cụ 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
1 2 3 4 5 6 7 |
void RFID_write(unsigned char reg, unsigned char data) { 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
1 2 3 4 5 6 7 8 9 |
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; } |
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
1 2 3 4 5 6 7 8 9 10 11 12 |
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); } |
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: 0x3D
RFID_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 0x0030
RFID_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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void MFRC522_AntennaOn(void) { unsigned char i; i = RFID_read(0x14); if (!(i & 0x03)) { SetBitMask(0x14, 0x03); } } void MFRC522_AntennaOff(void) { ClearBitMask(0x14, 0x03); } |
Còn nữa …
cái cài đặt thanh ghi nó ghi chỗ nào datasheet bạn nhỉ 😀
a ra phần 2 đi a e rất quan tâm đến con này
It is not surprising that online blackjack players are envious of slots players. Usually the juiciest bonuses are reserved for wagering on online slots. Omni Casino, which prides itself on listening to the players, is offering a Super Bonus Match Play for its blackjack aficionados. => 우리카지노 계열 대한민국 최고의 카지노사이트
▶ 우리카지노 ◀
MFRC522_CS_EN;
MFRC522_CS_EN;
hàm này ở đâu bạn nhỉ
MFRC522_CS_EN; Ham này kéo chân CS xuống thâp đó bạn.