RC522寫塊0複製S50卡

2021-08-17 14:35:51 字數 1561 閱讀 1477

覺得自己做事總是三分熱度,今天網上看見個不了解的東西去做,一做遇到問題又擱置在那裡,這樣真不好。對於rc522這個模組,大學的時候擼了一下,記得當時有個上位機可以讀寫卡片,配的51的程式,說實話用了stm32後完全忘了怎麼用51了,一直也沒把那個程式成功移植在stm32上面,畢業後中途弄過一次,也沒繼續做下去,最近心血來潮,想起來複製一下小區的門禁卡,程式終於移植成功。

既然是複製門禁卡,所以不可避免的要對s50卡的塊0進行讀寫,這過程中也遇到很多問題,上面提到移植的程式就不說了,下面就記錄和分享下對塊0的讀寫過程吧。

s50卡的基本特性就不說了,正常的s50卡的塊0包含卡號以及廠商的基本資訊,是固化在扇區0的塊0中的,不可修改,但是有一種卡是可以修改的——uid卡,所以你首先得有一張uid卡。最開始我買了一些uid卡,然後我按照正常對s50卡進行讀寫操作來修改塊0,但是總是寫入失敗,包括後面把那個成功移植到stm32的程式用上位機來操作,還是寫入失敗,正如其他網友所說的,都要懷疑買到的卡是假的uid卡了,最後從網上了解到,對改卡塊0操作是有特殊命令的,下面對一篇博文提到的特殊命令做一下解釋,在這之前也有解釋這個的網友,我看得還是雲裡霧裡,經過我多次嘗試,成功寫入了塊0資料。

原文大意如下:

1. 不可以進行 3 pass authenticaiton

2. 發 pcdhalt()

3. 發 0x40 in 7-bit

4. 發 0x43

首先安照正常s50卡的操作順序進行尋卡->防衝撞->選卡,接下來不要驗證密碼,然後休眠。下面傳送第一條特殊指令,他是16進製制的0x40,必須只傳送7位,很多朋友就是不清楚這裡如何傳送0x40以及如何只傳送7位,只需要呼叫下面兩個函式就可以了。

第乙個是設定傳送7個位,需要設定bitframingreg為0x07,第二個是寫指令函式,不要說你不會呼叫這兩函式,不會的就要好好看下程式中是怎樣用到這兩函式的。然後傳送第二條指令0x43,要發8位,設定bitframingreg為0x00(好像不設定這個也可以,預設的8位),接下來傳送buf[ ]=,同樣用mfrc522_tocard()函式(這串指令我也沒懂什麼意思,就當做是特殊指令吧,如果有人理解這個可以給我說下),這裡傳送的指令都會應答0x0a(我的好像是0xa0,或許是大小端問題吧),如果沒收到說明沒有弄對,建議乙個乙個測試。

通過上述特殊指令後就是寫塊0了,奇怪的是按照上面說的正常寫塊0,我是沒有成功(或許這樣是可以的,我看原理都是一樣的),我還是單獨呼叫的mfrc522_tocard()函式寫塊0,上面是18個位元組,但是正常的塊0是16位元組,所以這裡有個重點,先把要複製的卡的塊0位元組讀出,用calulatecrc()函式計算出2位校驗位放在16位元組後面組成18位元組一起寫入到塊0,不可以隨便填寫塊0的資料,因為有校驗。到此,塊0就可以成功寫入。

只要按照上面的步驟一步一步來,就可以成功寫塊0,這樣要注意的是上面僅僅是寫塊0,相當於只是把卡號複製成功,對於有些門禁讀卡器要驗證其他扇區這樣做也是打不開門的,後面的就不多說了,本篇文章只用於學習研究,對造成的後果概不負責。

RC522 模組驅動程式

本文主要講述了基於 spi匯流排的 rc522 驅動程式的設計。描述了主控如何與從裝置通過 spi匯流排進行資料的讀寫。一 在spi 驅動中,有兩個重要的結構 spi device spi driver。1 spi device 的構建與註冊 spi device 板資訊用 spi board in...

RC522 模組驅動程式

本文主要講述了基於spi匯流排的rc522驅動程式的設計。描述了主控如何與從裝置通過spi匯流排進行資料的讀寫。一 在spi驅動中,有兩個重要的結構 spi device spi driver。1 spi device的構建與註冊 spi device板資訊用spi board info結構體來描述...

RC522複製門禁卡(二)

經過一天的奮戰,改了一下例程,做成了key1一鍵讀取s50所有扇區資料,key2可以一鍵寫入給另乙個s50。需要注意跳過每個扇區的第四塊,這是當前扇區的控制塊,就算寫的資料一樣,也會導致s50資料不可讀。之前不清楚這個,報廢了三塊s50門禁卡,都不能讀資料了。讀取家裡門禁卡資料並寫入乙個新的s50卡...