Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. from machine import Pin, SPI
  2. from os import uname
  3.  
  4.  
  5. class MFRC522:
  6.  
  7. OK = 0
  8. NOTAGERR = 1
  9. ERR = 2
  10.  
  11. REQIDL = 0x26
  12. REQALL = 0x52
  13. AUTHENT1A = 0x60
  14. AUTHENT1B = 0x61
  15.  
  16. def __init__(self, sck, mosi, miso, rst, cs):
  17.  
  18. self.sck = Pin(sck, Pin.OUT)
  19. self.mosi = Pin(mosi, Pin.OUT)
  20. self.miso = Pin(miso)
  21. self.rst = Pin(rst, Pin.OUT)
  22. self.cs = Pin(cs, Pin.OUT)
  23.  
  24. self.rst.value(0)
  25. self.cs.value(1)
  26.  
  27. board = uname()[0]
  28.  
  29. if board == 'WiPy' or board == 'LoPy' or board == 'FiPy':
  30. self.spi = SPI(0)
  31. self.spi.init(SPI.MASTER, baudrate=1000000, pins=(self.sck, self.mosi, self.miso))
  32. elif board == 'esp8266':
  33. self.spi = SPI(baudrate=100000, polarity=0, phase=0, sck=self.sck, mosi=self.mosi, miso=self.miso)
  34. self.spi.init()
  35. else:
  36. raise RuntimeError("Unsupported platform")
  37.  
  38. self.rst.value(1)
  39. self.init()
  40.  
  41. def _wreg(self, reg, val):
  42.  
  43. self.cs.value(0)
  44. self.spi.write(b'%c' % int(0xff & ((reg << 1) & 0x7e)))
  45. self.spi.write(b'%c' % int(0xff & val))
  46. self.cs.value(1)
  47.  
  48. def _rreg(self, reg):
  49.  
  50. self.cs.value(0)
  51. self.spi.write(b'%c' % int(0xff & (((reg << 1) & 0x7e) | 0x80)))
  52. val = self.spi.read(1)
  53. self.cs.value(1)
  54.  
  55. return val[0]
  56.  
  57. def _sflags(self, reg, mask):
  58. self._wreg(reg, self._rreg(reg) | mask)
  59.  
  60. def _cflags(self, reg, mask):
  61. self._wreg(reg, self._rreg(reg) & (~mask))
  62.  
  63. def _tocard(self, cmd, send):
  64.  
  65. recv = []
  66. bits = irq_en = wait_irq = n = 0
  67. stat = self.ERR
  68.  
  69. if cmd == 0x0E:
  70. irq_en = 0x12
  71. wait_irq = 0x10
  72. elif cmd == 0x0C:
  73. irq_en = 0x77
  74. wait_irq = 0x30
  75.  
  76. self._wreg(0x02, irq_en | 0x80)
  77. self._cflags(0x04, 0x80)
  78. self._sflags(0x0A, 0x80)
  79. self._wreg(0x01, 0x00)
  80.  
  81. for c in send:
  82. self._wreg(0x09, c)
  83. self._wreg(0x01, cmd)
  84.  
  85. if cmd == 0x0C:
  86. self._sflags(0x0D, 0x80)
  87.  
  88. i = 2000
  89. while True:
  90. n = self._rreg(0x04)
  91. i -= 1
  92. if ~((i != 0) and ~(n & 0x01) and ~(n & wait_irq)):
  93. break
  94.  
  95. self._cflags(0x0D, 0x80)
  96.  
  97. if i:
  98. if (self._rreg(0x06) & 0x1B) == 0x00:
  99. stat = self.OK
  100.  
  101. if n & irq_en & 0x01:
  102. stat = self.NOTAGERR
  103. elif cmd == 0x0C:
  104. n = self._rreg(0x0A)
  105. lbits = self._rreg(0x0C) & 0x07
  106. if lbits != 0:
  107. bits = (n - 1) * 8 + lbits
  108. else:
  109. bits = n * 8
  110.  
  111. if n == 0:
  112. n = 1
  113. elif n > 16:
  114. n = 16
  115.  
  116. for _ in range(n):
  117. recv.append(self._rreg(0x09))
  118. else:
  119. stat = self.ERR
  120.  
  121. return stat, recv, bits
  122.  
  123. def _crc(self, data):
  124.  
  125. self._cflags(0x05, 0x04)
  126. self._sflags(0x0A, 0x80)
  127.  
  128. for c in data:
  129. self._wreg(0x09, c)
  130.  
  131. self._wreg(0x01, 0x03)
  132.  
  133. i = 0xFF
  134. while True:
  135. n = self._rreg(0x05)
  136. i -= 1
  137. if not ((i != 0) and not (n & 0x04)):
  138. break
  139.  
  140. return [self._rreg(0x22), self._rreg(0x21)]
  141.  
  142. def init(self):
  143.  
  144. self.reset()
  145. self._wreg(0x2A, 0x8D)
  146. self._wreg(0x2B, 0x3E)
  147. self._wreg(0x2D, 30)
  148. self._wreg(0x2C, 0)
  149. self._wreg(0x15, 0x40)
  150. self._wreg(0x11, 0x3D)
  151. self.antenna_on()
  152.  
  153. def reset(self):
  154. self._wreg(0x01, 0x0F)
  155.  
  156. def antenna_on(self, on=True):
  157.  
  158. if on and ~(self._rreg(0x14) & 0x03):
  159. self._sflags(0x14, 0x03)
  160. else:
  161. self._cflags(0x14, 0x03)
  162.  
  163. def request(self, mode):
  164.  
  165. self._wreg(0x0D, 0x07)
  166. (stat, recv, bits) = self._tocard(0x0C, [mode])
  167.  
  168. if (stat != self.OK) | (bits != 0x10):
  169. stat = self.ERR
  170.  
  171. return stat, bits
  172.  
  173. def anticoll(self):
  174.  
  175. ser_chk = 0
  176. ser = [0x93, 0x20]
  177.  
  178. self._wreg(0x0D, 0x00)
  179. (stat, recv, bits) = self._tocard(0x0C, ser)
  180.  
  181. if stat == self.OK:
  182. if len(recv) == 5:
  183. for i in range(4):
  184. ser_chk = ser_chk ^ recv[i]
  185. if ser_chk != recv[4]:
  186. stat = self.ERR
  187. else:
  188. stat = self.ERR
  189.  
  190. return stat, recv
  191.  
  192. def select_tag(self, ser):
  193.  
  194. buf = [0x93, 0x70] + ser[:5]
  195. buf += self._crc(buf)
  196. (stat, recv, bits) = self._tocard(0x0C, buf)
  197. return self.OK if (stat == self.OK) and (bits == 0x18) else self.ERR
  198.  
  199. def auth(self, mode, addr, sect, ser):
  200. return self._tocard(0x0E, [mode, addr] + sect + ser[:4])[0]
  201.  
  202. def stop_crypto1(self):
  203. self._cflags(0x08, 0x08)
  204.  
  205. def read(self, addr):
  206.  
  207. data = [0x30, addr]
  208. data += self._crc(data)
  209. (stat, recv, _) = self._tocard(0x0C, data)
  210. return recv if stat == self.OK else None
  211.  
  212. def write(self, addr, data):
  213.  
  214. buf = [0xA0, addr]
  215. buf += self._crc(buf)
  216. (stat, recv, bits) = self._tocard(0x0C, buf)
  217.  
  218. if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):
  219. stat = self.ERR
  220. else:
  221. buf = []
  222. for i in range(16):
  223. buf.append(data[i])
  224. buf += self._crc(buf)
  225. (stat, recv, bits) = self._tocard(0x0C, buf)
  226. if not (stat == self.OK) or not (bits == 4) or not ((recv[0] & 0x0F) == 0x0A):
  227. stat = self.ERR
  228.  
  229. return stat
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement