สารบัญ:

RC522 และ PN532 RFID เบื้องต้น: 10 ขั้นตอน
RC522 และ PN532 RFID เบื้องต้น: 10 ขั้นตอน

วีดีโอ: RC522 และ PN532 RFID เบื้องต้น: 10 ขั้นตอน

วีดีโอ: RC522 และ PN532 RFID เบื้องต้น: 10 ขั้นตอน
วีดีโอ: สอนวิธีใช้งาน RFID Module RC522 : Arduino RFID Sensor (MFRC522) Tutorial 2024, กรกฎาคม
Anonim
RC522 และ PN532 RFID เบื้องต้น
RC522 และ PN532 RFID เบื้องต้น

หมายเหตุ: ตอนนี้ฉันมี Instructables ที่เสนอรหัส Arduino สำหรับ RC522 และ PN532

เมื่อก่อนฉันซื้อโมดูล RFID ที่แตกต่างกันสามโมดูลสำหรับการทดลอง ในโปรเจ็กต์ก่อนหน้านี้ ฉันได้ให้รายละเอียดเกี่ยวกับวิธีใช้โมดูล 125-kHz อย่างง่าย เพื่อทำฟังก์ชันความปลอดภัยพื้นฐาน โมดูลดังกล่าวใช้แท็กแบบอ่านอย่างเดียวเพื่อให้กระบวนการสแกนหา ID จัดเก็บหากต้องการ และเปรียบเทียบกับ ID ที่เก็บไว้ โมดูลอื่นๆ ที่ฉันซื้อทำงานที่ความถี่ 13.56 MHz และใช้แท็กที่สามารถอ่านและเขียนได้ ดังนั้นการใช้เพียงเพื่อรักษาความปลอดภัยขั้นพื้นฐานจึงเป็นเรื่องเสียเปล่า โมดูลทั่วไปทั้งสองนี้ใช้ชิป RC522 หรือชิป PN532 ซึ่งทั้งคู่ผลิตโดย NXP

หากคุณเคยอ่านโปรเจ็กต์อื่นๆ ของฉัน คุณจะรู้ว่าฉันชอบใช้ไมโครคอนโทรลเลอร์ PIC ราคาถูกและโปรแกรมในภาษาแอสเซมบลี ดังนั้นสิ่งที่ฉันกำลังมองหาคือลำดับขั้นตอนที่จำเป็นในการพูดคุยกับโมดูลและแท็ก RFID แม้ว่าจะมีตัวอย่างโปรแกรมออนไลน์มากมายสำหรับโมดูล แต่ส่วนใหญ่เขียนด้วยซอฟต์แวร์ 'C' สำหรับ Arduino และใช้อินเทอร์เฟซ SPI นอกจากนี้ คู่มือสำหรับชิปและแท็ก Mifare ยังมีการถอดรหัสเล็กน้อย โพสต์นี้มีเนื้อหาเกี่ยวกับข้อมูลที่ฉันหวังว่าจะมีเมื่อเริ่มโครงการเป็นหลัก ฉันยังรวมโปรแกรมซอฟต์แวร์ประกอบ PIC สำหรับดำเนินการคำสั่งพื้นฐานที่แต่ละโมดูลต้องการ แม้ว่าคุณจะไม่ได้ใช้ PIC และ/หรือภาษาแอสเซมบลี อย่างน้อยซอร์สโค้ดควรให้แนวคิดที่ดีเกี่ยวกับคำสั่งเฉพาะที่จำเป็นในการดำเนินการแต่ละขั้นตอน

ขั้นตอนที่ 1: อินเทอร์เฟซแบบอนุกรม

อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม
อินเทอร์เฟซแบบอนุกรม

ชิปทั้งสองที่ใช้ในโมดูลเหล่านี้สามารถเชื่อมต่อผ่าน SPI, I2C หรือ UART (HSSP) โมดูล PN532 มีสวิตช์ DIP ที่ใช้เพื่อเลือกอินเทอร์เฟซที่ต้องการ แต่โมดูล MFRC522 เป็นแบบเดินสายสำหรับอินเทอร์เฟซ SPI ฉันชอบที่จะใช้ UART ในตัวของ PIC ดังนั้นฉันจึงค้นหาทางออนไลน์เพื่อดูว่ามีวิธีทำให้โมดูล MFRC522 เข้าสู่โหมด UART ได้หรือไม่ สิ่งที่ฉันพบคือการตัดรอยบนกระดานหนึ่งอันจะช่วยได้ การตัดจะขจัด 3.3 โวลต์ออกจากพิน EA ของชิปได้อย่างมีประสิทธิภาพ ในทางเทคนิคแล้วพิน EA ควรเชื่อมต่อกับกราวด์ แต่มีเพียงไม่กี่คนที่สามารถดึงการบัดกรีนั้นออกได้เนื่องจากความหนาแน่นของพินชิป ไม่ต้องกังวลเพราะพิน EA ไม่มีการดึงขึ้นภายในและไม่ "ลอย" เหมือนอินพุตลอจิก TTL แบบเก่าทำ อ้างถึงแผนภาพชิปและรูปภาพส่วนของบอร์ดสำหรับจุดที่จะตัด ตรวจสอบให้แน่ใจว่าคุณได้ตัดเฉพาะการติดตามสั้นๆ ที่ไปยังพิน EA โดยตรง

ขั้นตอนที่ 2: ฮาร์ดแวร์

ฮาร์ดแวร์
ฮาร์ดแวร์

การเชื่อมต่อฮาร์ดแวร์สำหรับการสื่อสาร UART แสดงในแผนภาพด้านบน การเชื่อมต่อ UART สำหรับ MFRC522 ไม่ได้ทำเครื่องหมายไว้บนบอร์ด แต่ดังที่แสดงในแผนผัง พิน SDA รับข้อมูล UART และพิน MISO จะส่งข้อมูล UART โมดูล PN532 มีเครื่องหมาย UART ที่ด้านล่างของบอร์ด

โมดูลทั้งสองทำงานบน 3.3 โวลต์ และระดับลอจิก 5 โวลต์จากพิน PIC TX จะต้องถูกจำกัดด้วย การเชื่อมต่อ LCD เป็นการตั้งค่ามาตรฐาน 4 บิตที่ใช้ในโครงการก่อนหน้านี้ของฉัน รูปแบบเริ่มต้นสำหรับข้อความทั้งหมดถูกตั้งค่าสำหรับ LCD มาตรฐาน 1602 (16 อักขระ 2 บรรทัด) ฉันยังมีจอ LCD 40 ตัวคูณ 2 บรรทัดที่ฉันใช้สำหรับการดัมพ์ข้อมูลดิบระหว่างการดีบัก ดังนั้นฉันจึงรวมการกำหนดไว้ในซอฟต์แวร์ที่ช่วยให้ฉันใช้ประโยชน์จากพื้นที่แสดงผลเพิ่มเติมได้

ขั้นตอนที่ 3: บล็อกข้อมูล

แท็ก Mifare Classic 1k ที่ใช้สำหรับโครงการนี้มีการกำหนดค่าเป็น 16 ส่วน สี่บล็อกข้อมูลต่อเซกเตอร์ 16 ไบต์ต่อบล็อกข้อมูล จากบล็อกข้อมูล 64 บล็อก มีเพียง 47 บล็อกเท่านั้นที่ใช้งานได้จริง บล็อกข้อมูล 0 มีข้อมูลผู้ผลิตและบล็อก 3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59 และ 63 เรียกว่าบล็อกตัวอย่าง บล็อกตัวอย่างเป็นส่วนสุดท้ายในแต่ละส่วนและประกอบด้วยสองคีย์และบิตการเข้าถึงบล็อก คีย์และบิตการเข้าถึงบล็อกใช้กับเฉพาะบล็อกข้อมูลในภาคนั้น ดังนั้นคุณจึงสามารถมีคีย์และกฎการเข้าถึงที่แตกต่างกันสำหรับแต่ละเซกเตอร์ คีย์เริ่มต้นถูกตั้งค่าเป็น "FF FF FF FF FFh" สำหรับโครงการพื้นฐานนี้ ฉันใช้บล็อกข้อมูลเพียงบล็อกเดียวและเก็บคีย์เริ่มต้นและบิตการเข้าถึงไว้ มีเอกสารมากมายที่เกี่ยวข้องกับการ์ดเหล่านี้ ดังนั้นเพียงแค่ค้นหา "Mifare" ทางออนไลน์หรือไปที่เว็บไซต์ NXP หากคุณต้องการสำรวจในเชิงลึกมากขึ้น

ขั้นตอนที่ 4: การใช้งานทั่วไป

แม้ว่าทั้งสองโมดูลจะมีลักษณะเฉพาะในลักษณะที่เข้าถึงได้และวิธีการเข้าถึงแท็ก แต่ก็มีกระบวนการทั่วไปที่จำเป็นเพื่อให้งานสำเร็จลุล่วง สำหรับโครงการนี้ เราถือว่าแท็กเป็นประเภท Mifare Classic 1k และเราอนุญาตเพียงแท็กเดียวเท่านั้นในฟิลด์เสาอากาศ ขั้นตอนพื้นฐานมีการกำหนดไว้ด้านล่าง

· เริ่มต้นโมดูล: โดยทั่วไป จำเป็นต้องมีสิ่งต่างๆ เช่น การเขียนค่าเพื่อลงทะเบียนในชิป การส่งคำสั่ง "ปลุก" และการเปิดเครื่องไปยังเสาอากาศ ในแอปพลิเคชันที่ทำงานด้วยแบตเตอรี่ คุณจะต้องเปิดและปิดเสาอากาศเพื่อประหยัดแบตเตอรี่ แต่สำหรับแอปพลิเคชันง่ายๆ นี้ เราจะเปิดเครื่องเพียงครั้งเดียวแล้วเปิดทิ้งไว้

· ล้างค่าสถานะการเข้ารหัสลับ (522 เท่านั้น): เมื่อตรวจสอบความถูกต้องของแท็กแล้ว จะมีการตั้งค่าสถานะเพื่อแจ้งให้ผู้ใช้ทราบว่าการสื่อสารกับแท็กจะถูกเข้ารหัส ผู้ใช้ต้องล้างแฟล็กนี้ก่อนการสแกนครั้งต่อไป แม้ว่าแท็กที่กำลังสแกนจะเป็นแท็กเดียวกันก็ตาม

· สแกนหาแท็ก: โดยทั่วไปแล้วโมดูลจะถามว่า "มีใครอยู่ที่นั่นไหม" และแท็กตอบกลับว่า "ฉันอยู่ที่นี่" หากโมดูลไม่ได้รับการตอบสนองอย่างรวดเร็ว โมดูลจะหยุดฟัง นั่นหมายความว่าเราจำเป็นต้องส่งคำสั่งสแกนไปยังโมดูลซ้ำๆ จนกว่าจะพบแท็ก

· รับแท็ก หมายเลขประจำตัวผู้ใช้ (UID): แท็กจะตอบสนองต่อคำขอสแกนด้วยข้อมูลที่จำกัดบางอย่าง เช่น ประเภทของแท็กที่เป็น นั่นหมายความว่าเราอาจต้องส่งคำสั่งอื่นเพื่อรับ UID UID คือสี่ไบต์สำหรับแท็ก Mifare Classic 1k หากอาจยาวกว่าสำหรับแท็กอื่นๆ แต่โปรเจ็กต์นี้ไม่ได้กล่าวถึง

· เลือกแท็ก (522 เท่านั้น): UID ใช้เพื่อเลือกแท็กที่ผู้ใช้ต้องการรับรองความถูกต้องสำหรับการอ่านและเขียน ขึ้นอยู่กับความเป็นไปได้ที่อาจมีมากกว่าหนึ่งแท็กในฟิลด์เสาอากาศ นั่นไม่ใช่กรณีสำหรับแอปพลิเคชันง่ายๆ ของเรา แต่เราต้องเลือกแท็กอยู่ดี

· ตรวจสอบความถูกต้องของแท็ก: จำเป็นต้องทำขั้นตอนนี้หากต้องการอ่านหรือเขียนแท็ก หากสิ่งที่เราต้องการทำคือแยกความแตกต่างระหว่างแท็กสำหรับแอปพลิเคชันความปลอดภัยอย่างง่าย UID ก็เพียงพอแล้ว การตรวจสอบสิทธิ์กำหนดให้เราต้องรู้ UID และเรารู้รหัสการเข้ารหัสลับสำหรับส่วนข้อมูลของแท็กที่เราต้องการเข้าถึง สำหรับโปรเจ็กต์นี้ เรายึดติดกับคีย์เริ่มต้น แต่โปรเจ็กต์ที่ตามมาของฉันจะเปลี่ยนคีย์เพื่อให้แท็กสามารถใช้เป็นกระเป๋าเงินอิเล็กทรอนิกส์ได้

· อ่านหรือเขียนแท็ก: การอ่านจะคืนค่าทั้งหมด 16 ไบต์ของ Data Block ที่ร้องขอเสมอ การเขียนต้องการให้เขียนทั้ง 16 ไบต์พร้อมกัน หากคุณต้องการอ่านหรือเขียนบล็อกอื่นในภาคข้อมูลเดียวกัน แท็กก็ไม่จำเป็นต้องตรวจสอบสิทธิ์อีกครั้ง หากคุณต้องการอ่านหรือเขียนบล็อคในภาคข้อมูลอื่น แท็กจะต้องได้รับการตรวจสอบสิทธิ์อีกครั้งโดยใช้คีย์สำหรับเซกเตอร์นั้น

ขั้นตอนที่ 5: ลำดับการเข้าถึงโมดูล MFRC522

รูทีนการเริ่มต้นประกอบด้วยขั้นตอนพื้นฐานเหล่านี้ที่พบในแอปพลิเคชันส่วนใหญ่ที่ฉันดู:

·ส่งข้อมูลจำลอง (ดูย่อหน้าถัดไป)

· ซอฟต์รีเซ็ต

· ตั้งค่าเกนของตัวรับสัญญาณ RF (หากต้องการอย่างอื่นที่ไม่ใช่ค่าเริ่มต้น)

· ตั้งค่าเปอร์เซ็นต์การมอดูเลต ASK เป็น 100%

·ตั้งค่าเมล็ดพันธุ์สำหรับการคำนวณ CRC

· เปิดเสาอากาศ

· รับเวอร์ชันเฟิร์มแวร์ (ไม่จำเป็น)

ด้วยเหตุผลที่ไม่สามารถอธิบายได้ โมดูลของฉันเปิดเครื่องและคิดว่าได้รับคำสั่งเขียนโดยไม่มีไบต์ข้อมูล ฉันไม่รู้ว่านี่เป็นเพียงปัญหากับโมดูลของฉันหรือไม่ แต่ฉันไม่เห็นการอ้างอิงถึงโมดูลนี้ที่อื่น ฉันทดลองทั้งการรีเซ็ตฮาร์ดแวร์และซอฟต์แวร์และไม่ได้แก้ไขปัญหา วิธีแก้ปัญหาของฉันคือเพิ่มการเรียกอ่านจำลองเพื่อลงทะเบียน “0” (ไม่ได้กำหนด) ที่จุดเริ่มต้นของรูทีนการเริ่มต้นโมดูล หากโมดูลเห็นว่านี่เป็นข้อมูลสำหรับคำสั่งเขียนที่ไม่รู้จัก ก็ดูเหมือนจะไม่มีผลร้ายใดๆ หากเห็นว่าเป็นคำสั่งอ่าน แสดงว่าไม่มีอะไรมีประโยชน์เกิดขึ้น มันทำให้ฉันรำคาญที่ฉันไม่สามารถระบุปัญหาได้อย่างเต็มที่ โดยเฉพาะอย่างยิ่งเมื่อการรีเซ็ตฮาร์ดแวร์ของโมดูลเพียงอย่างเดียวไม่สามารถแก้ไขปัญหาได้

ชิป RC522 ประกอบด้วยรีจิสเตอร์จำนวนมาก ซึ่งส่วนใหญ่มีทั้งแบบอ่านและเขียน ในการดำเนินการเขียน หมายเลขทะเบียนจะถูกส่งไปยังโมดูลตามด้วยค่าที่จะเขียน ในการดำเนินการอ่าน หมายเลขทะเบียนได้เพิ่ม 0x80 เข้าไปและจะถูกส่งไปยังโมดูล การตอบสนองต่อคำสั่งเขียนเป็นการสะท้อนของการลงทะเบียนที่เข้าถึง การตอบสนองต่อคำสั่ง read คือเนื้อหาของรีจิสเตอร์ ซอฟต์แวร์ใช้ประโยชน์จากความรู้นั้นเพื่อตรวจสอบว่าคำสั่งถูกดำเนินการอย่างถูกต้อง

ขั้นตอนที่ 6: ลำดับการเข้าถึงโมดูล PN532

รูทีนการเริ่มต้นประกอบด้วยขั้นตอนที่จำเป็นเหล่านี้:

· ส่งสตริงการเริ่มต้น: นี่เป็นข้อมูลเฉพาะสำหรับอินเทอร์เฟซ UART คู่มือระบุว่าอินเทอร์เฟซ UART จะปลุกบนขอบที่เพิ่มขึ้นที่ห้าที่ตรวจพบบนอินเทอร์เฟซ ขอแนะนำให้ส่ง 0x55, 0x55, 0x00, 0x00, 0x00, 0x00 โดยส่วนใหญ่แล้ว จะต้องมีจำนวนอักขระที่เพียงพอและมีขอบที่เพิ่มขึ้น และต้องไม่ดูเหมือนคำนำคำสั่ง (00 00 FF)

· ปลุกโมดูล: ฝังอยู่ในคู่มือผู้ใช้ แสดงว่าโมดูลเริ่มต้นเข้าสู่สถานะสลีปที่เรียกว่า "LowVbat" หากต้องการออกจากสถานะนี้ เราต้องส่งคำสั่ง "SAMConfiguration"

PN532 คาดหวังให้ส่งคำสั่งในรูปแบบข้อความที่กำหนดซึ่งรวมถึงคำนำ ข้อความ และ postamble ข้อความตอบกลับมีรูปแบบเดียวกัน ข้อความคำสั่งและข้อความตอบกลับมีทั้ง TFI (Frame Identifier) และเวอร์ชันคำสั่ง คำสั่งใช้ TFI ของ 0xD4 และการตอบสนองใช้ 0xD5 เวอร์ชันคำสั่งแตกต่างกันไป แต่การตอบสนองจะเพิ่มเวอร์ชันคำสั่งเสมอและส่งคืนเป็นไบต์หลัง TFI ความสอดคล้องดังกล่าวช่วยให้สามารถสแกนข้อความตอบกลับเพื่อค้นหาข้อมูลที่เกี่ยวข้องได้อย่างง่ายดาย

แต่ละข้อความคำสั่ง (ตามคำนำ) ประกอบด้วยความยาวของข้อความ ส่วนเสริมของ 2 ของความยาวของข้อความ, TFI, คำสั่ง, ข้อมูล, การตรวจสอบและ postamble ซอฟต์แวร์สร้างแต่ละคำสั่งแล้วเรียกรูทีนที่คำนวณเช็คซัมและผนวก postamble

รูปแบบข้อความสำหรับการตอบกลับจะคล้ายกับรูปแบบคำสั่ง การตอบสนองโดยทั่วไปจะรวม ACK (00 00 FF 00 FF 00) ตามด้วยการตอบสนองเฉพาะของคำสั่ง การตอบสนองคำสั่งแต่ละรายการเริ่มต้นด้วยคำนำ 00 00 FF การตอบสนองควรมีไบต์ TFI ของ D5 ตามด้วยหมายเลขคำสั่งที่เพิ่มขึ้น 1 สำหรับคำสั่ง "SAMConfiguration" ของเรา (14) ซึ่งจะเป็น 15 คำสั่ง "SAMConfiguration" ได้รับการตอบสนองนี้: 00 00 FF 00 FF 00 00 00 FF 02 FE D5 15 16 00.

มีคำสั่งเฉพาะโมดูลอื่นๆ ที่สามารถส่งได้ แต่ไม่จำเป็นสำหรับแอปพลิเคชันนี้ อย่างไรก็ตาม ฉันได้รวมรูทีนที่สามารถเรียกเพื่อดึงหมายเลขเวอร์ชันเฟิร์มแวร์ได้ การตอบสนองโดยทั่วไป (หลัง ACK และคำนำ) จะเป็น: 06 FA D5 03 32 01 06 07 E8 00 “01 06 07” หมายถึงเฟิร์มแวร์หมายเลขเวอร์ชัน 1.6.7

ขั้นตอนที่ 7: ลำดับการเข้าถึงแท็ก

หลังจากที่โมดูลพร้อมแล้ว เราสามารถส่งคำสั่งเฉพาะสำหรับแท็กได้ ในการอ่านหรือเขียนข้อมูลแท็ก เราจำเป็นต้องมีหมายเลขประจำตัว (UID) จากนั้น UID และคีย์จะถูกนำมาใช้เพื่ออนุญาตเซกเตอร์ข้อมูลแท็กเฉพาะสำหรับการอ่าน/เขียน การอ่าน/เขียนข้อมูลแท็กทำได้บน 16 ไบต์ในบล็อกข้อมูลที่ระบุเสมอ ซึ่งหมายความว่าแอปพลิเคชันทั่วไปจะอ่านบล็อคข้อมูล แก้ไขข้อมูลตามต้องการ แล้วเขียนข้อมูลใหม่กลับไปที่แท็ก

ขั้นตอนที่ 8: ซอฟต์แวร์

ซอฟต์แวร์ตัวจัดการขัดจังหวะจะถูกเรียกเมื่อใดก็ตามที่ PIC UART ได้รับข้อมูลหนึ่งไบต์ ในโครงการ UART ก่อนหน้านี้บางโครงการของฉัน ฉันสามารถสำรวจการตั้งค่าสถานะขัดจังหวะ RX แทนที่จะต้องใช้ตัวจัดการการขัดจังหวะ นั่นไม่ใช่กรณีของซอฟต์แวร์นี้ โดยเฉพาะอย่างยิ่งสำหรับ PN532 ซึ่งสื่อสารด้วยอัตราบอดที่สูงกว่า RC522 มาก อินเทอร์เฟซ UART ของ RC522 ถูกจำกัดไว้ที่ 9600 บอด ในขณะที่ค่าเริ่มต้นสำหรับ PN532 คือ 115k และสามารถตั้งค่าได้สูงถึง 1.288 เมกะไบต์ ไบต์ที่ได้รับจะถูกเก็บไว้ในพื้นที่บัฟเฟอร์และส่วนหลักของซอฟต์แวร์จะดึงข้อมูลเหล่านี้ตามต้องการ

แฟล็ก New_Msg ระบุว่าได้รับไบต์แล้ว และ Byte_Count ระบุจำนวนไบต์ ฉันได้รวมรูทีน "Disp_Buff" ไว้ในซอฟต์แวร์ที่สามารถเรียกให้แสดงเนื้อหาของบัฟเฟอร์รับระหว่างการดีบักได้ ข้อความส่งคืนบางส่วนจะล้นจอแสดงผลทั่วไป 1602 แต่ฉันมีจอแอลซีดีขนาด 40 ตัวคูณ 2 บรรทัดที่พบในเว็บไซต์อิเล็กทรอนิกส์ส่วนเกินออนไลน์ คุณสามารถตั้งค่าการกำหนด "Max_Line" สำหรับขนาด LCD ของคุณได้ ถ้าถึง "Max_Line" รูทีน "Disp_Buff" จะดำเนินต่อไปโดยเขียนไปที่บรรทัดที่สอง คุณสามารถเพิ่มโค้ดเล็กๆ น้อยๆ ลงในรูทีนนั้นเพื่อดำเนินการต่อในบรรทัดที่ 3 และ 4 หากคุณมี LCD 4 บรรทัด สำหรับ PN532 มีแฟล็กที่สามารถตั้งค่าเพื่อให้รูทีนดัมพ์ไบต์ที่ได้รับทั้งหมดหรือเพียงแค่ดัมพ์ข้อมูล 16 ไบต์จากการตอบกลับการอ่าน

ไม่จำเป็นต้องล้างบัฟเฟอร์การรับหรือ Byte_Count เนื่องจากการล้างค่าสถานะ New_Msg จะทำให้ Byte_Count ถูกล้างโดยตัวจัดการการขัดจังหวะและนั่นคือสิ่งที่ใช้เป็นดัชนีในบัฟเฟอร์ New_Msg มักจะถูกล้างก่อนแต่ละขั้นตอนคำสั่งเพื่อให้สามารถระบุและตรวจสอบผลลัพธ์เฉพาะของคำสั่งนั้นได้อย่างง่ายดาย ใน RC522 นั้นหมายความว่าบัฟเฟอร์การรับมักจะมีเพียง 1 ถึง 4 ไบต์ ในบางกรณี เช่น การอ่านบล็อคข้อมูล คำสั่ง Read_FIFO จะต้องออกหลายครั้งเพื่อย้ายไบต์จาก FIFO ไปยังบัฟเฟอร์การรับ ผลลัพธ์ของคำสั่งทั้งหมดสำหรับ PN532 จะสิ้นสุดในบัฟเฟอร์การรับ ดังนั้นจึงดำเนินการตามขั้นตอนการสแกนเพื่อค้นหาไบต์เฉพาะที่ต้องการ

ลูปหลักในซอฟต์แวร์จะสแกนหาแท็ก จากนั้นตรวจสอบความถูกต้องของแท็กเพื่ออ่าน/เขียน สำหรับซอฟต์แวร์ทดสอบที่รวมอยู่ในที่นี้ ตัวแปร Junk_Num จะถูกแก้ไขในแต่ละครั้งผ่านลูปหลัก และถูกใช้ระหว่างการเขียนไปยังแท็ก ค่าที่เขียนสลับกันระหว่างค่า Junk_Num และส่วนเติมเต็ม 1 ของ Junk_Num ในที่สุด 16 ค่าที่เขียนจะถูกอ่านและแสดง มีการแสดงข้อความสำหรับแต่ละขั้นตอนพร้อมการเรียกรูทีนการหน่วงเวลาเพื่อให้มีเวลาอ่านแต่ละข้อความ มีข้อความแสดงข้อผิดพลาดให้ด้วย แต่ปกติแล้วจะเกิดขึ้นก็ต่อเมื่อแท็กถูกลบระหว่างการดำเนินการเท่านั้น

ส่วนหนึ่งของการเริ่มต้นซอฟต์แวร์คือส่วนของโค้ดที่ดำเนินการเมื่อเปิดเครื่องเท่านั้น และข้ามไปหากตรวจพบการรีเซ็ตซอฟต์แวร์ ข้อความแสดงข้อผิดพลาดโดยทั่วไปจะสิ้นสุดลงด้วยการรีเซ็ตซอฟต์แวร์เพื่อออกจากลูปหลัก การรีเซ็ตเกิดขึ้นในรูทีน "Tilt" ซึ่งช่วยให้ Watchdog Timer ใช้งานได้ง่าย จากนั้นจะเข้าสู่ลูปอนันต์เพื่อรอการหมดเวลา

ขั้นตอนที่ 9: ซอฟต์แวร์เฉพาะ MFRC522

ชิป RC522 ต้องการคำแนะนำระดับต่ำมากกว่าชิป PN532 เพื่อให้สามารถสื่อสารกับแท็กได้สำเร็จ มันเหมือนกับการเขียนโปรแกรมในภาษาแอสเซมบลีกับการเขียนโปรแกรมใน "C" ความแตกต่างที่สำคัญอีกประการหนึ่งคือ RC522 ต้องการให้การสื่อสารกับแท็กได้รับช่องทางผ่านบัฟเฟอร์ FIFO กิจวัตร “Write_FIFO” และ “Read_FIFO” จะจัดการงานเหล่านั้น ซอฟต์แวร์ MFRC522 ประกอบด้วยส่วนสำหรับคำสั่งระดับล่างจำนวนมากซึ่งสร้างฟังก์ชันหลัก

การคำนวณ checksum ของคำสั่ง tag สำหรับ RC522 นั้นแตกต่างจาก PN532 อย่างมาก หลังจากสร้างคำสั่ง tag ใน FIFO แล้ว คำสั่งโมดูลจะถูกส่งไปคำนวณเช็คซัม ผลลัพธ์ 16 บิตจะไม่ถูกผนวกเข้ากับคำสั่ง tag โดยอัตโนมัติ แต่จะพร้อมสำหรับการอ่านจากรีจิสเตอร์ 8 บิตสองตัว การคำนวณเช็คซัมจะล้างข้อมูลใน FIFO ดังนั้นลำดับที่ต้องการจะเป็นดังนี้:

· สร้างคำสั่งใน FIFO

·สั่งการคำนวณเช็คซัม

· สร้างคำสั่งใน FIFO อีกครั้ง

· อ่านการลงทะเบียน CRC และเขียนเช็คซัมไบต์ไปยัง FIFO

· ส่งคำสั่ง Transceive หรือ Authenticate

คำสั่ง Transceive จะส่งบัฟเฟอร์ FIFO จากนั้นจะเปลี่ยนเป็นโหมดรับโดยอัตโนมัติเพื่อรอการตอบกลับจากแท็ก คำสั่ง Transceive ต้องตามด้วยการตั้งค่าของบิต StartSend ใน BitFramingRegister เพื่อส่งข้อมูลจริง คำสั่ง Authenticate ไม่มีข้อกำหนดดังกล่าว

โดยทั่วไปแล้ว แอปพลิเคชั่นโค้ด Arduino “C” ที่พร้อมใช้งานออนไลน์จะใช้ตัวบันทึกสถานะอินเตอร์รัปต์และการลงทะเบียนการหมดเวลาเพื่อให้แน่ใจว่าได้รับการตอบสนองที่ถูกต้องในเวลาที่เหมาะสม ในความคิดของฉันที่เกินความสามารถสำหรับแอปพลิเคชันที่สำคัญที่ไม่ใช่เวลานี้ แต่ฉันใช้ซอฟต์แวร์หมดเวลาสั้น ๆ เพื่อรอการตอบกลับแล้วตรวจสอบว่าถูกต้อง คู่มือสำหรับแท็ก Mifare ให้รายละเอียดเกี่ยวกับเวลาสำหรับการทำธุรกรรมต่างๆ และเวลาได้รับอนุญาตสำหรับจำนวนไบต์ที่คาดไว้ที่จะได้รับ การหน่วงเวลาเหล่านี้สร้างขึ้นในรูทีนย่อยคำสั่งระดับต่ำส่วนใหญ่

ขั้นตอนที่ 10: PN532 ซอฟต์แวร์เฉพาะ

หลังจากที่โมดูลเริ่มต้นแล้ว ขั้นตอนที่จำเป็นในการค้นหาและรับรองความถูกต้องของแท็กจะสำเร็จโดยการเขียนคำสั่งที่เหมาะสมตามด้วยข้อมูลที่จำเป็น คำสั่งสแกนส่งคืน UID ซึ่งใช้สำหรับการรับรองความถูกต้อง หลังจากนั้น การอ่านและเขียนแท็กจะส่งหรือส่งคืน 16 ไบต์สำหรับบล็อกข้อมูลที่ระบุ

ลำดับการเริ่มต้นนั้นมีรายละเอียดก่อนหน้านี้ และรูทีนซอฟต์แวร์เดียวกันจะส่งคำสั่ง SAMConfiguration เพื่อให้โมดูลออกจากสถานะ "LowVbat" คำสั่งพื้นฐานที่เหลือ เช่น Scan, Authenticate, Read/Write Tag ถูกสร้างขึ้นตามลำดับในกิจวัตรที่เกี่ยวข้อง เช็คซัมคำนวณโดยเพียงแค่เพิ่มไบต์คำสั่ง ทำส่วนเสริม แล้วเพิ่ม 1 เพื่อให้เป็นส่วนเสริมของ 2 ผลลัพธ์ 8 บิตจะถูกต่อท้ายสตริงคำสั่งก่อน postamble

ไม่มี FIFO เหมือนใน RC522 ดังนั้นข้อความตอบกลับทั้งหมดจะได้รับโดยอัตโนมัติ รูทีน "Find_Response" จะสแกนบัฟเฟอร์ข้อมูลที่ได้รับสำหรับ TFI (0xD5) รูทีนใช้ประโยชน์จากการรู้ว่าข้อความที่คาดไว้ควรเป็นอย่างไร และละเว้นการตอบสนอง ACK ธรรมดาที่ไม่มีข้อมูล เมื่อพบ TFI แล้ว คำตอบที่ต้องการจะเป็นค่าชดเชยที่ทราบ คำสั่ง echo และไบต์สถานะคำสั่งจะถูกบันทึกโดยรูทีน "Read_Buff" สำหรับการตรวจสอบในภายหลัง

แค่นี้แหละสำหรับโพสต์นี้ ตรวจสอบโครงการอิเล็กทรอนิกส์อื่นๆ ของฉันได้ที่: www.boomerrules.wordpress.com

แนะนำ: