int8_t PN532_I2C::writeCommand(const uint8_t *header, uint8_t hlen, const uint8_t *body, uint8_t blen) { command = header[0]; _wire->beginTransmission(PN532_I2C_ADDRESS); write(PN532_PREAMBLE); write(PN532_STARTCODE1); write(PN532_STARTCODE2); uint8_t length = hlen + blen + 1; // length of data field: TFI + DATA write(length); write(~length + 1); // checksum of length write(PN532_HOSTTOPN532); uint8_t sum = PN532_HOSTTOPN532; // sum of TFI + DATA DMSG("write: "); for (uint8_t i = 0; i < hlen; i++) { if (write(header[i])) { sum += header[i]; DMSG_HEX(header[i]); } else { DMSG("\nToo many data to send, I2C doesn't support such a big packet\n"); // I2C max packet: 32 bytes return PN532_INVALID_FRAME; } } for (uint8_t i = 0; i < blen; i++) { if (write(body[i])) { sum += body[i]; DMSG_HEX(body[i]); } else { DMSG("\nToo many data to send, I2C doesn't support such a big packet\n"); // I2C max packet: 32 bytes return PN532_INVALID_FRAME; } } uint8_t checksum = ~sum + 1; // checksum of TFI + DATA write(checksum); write(PN532_POSTAMBLE); _wire->endTransmission(); DMSG('\n'); return readAckFrame(); }
int8_t PN532_HSU::writeCommand(const uint8_t *header, uint8_t hlen, const uint8_t *body, uint8_t blen) { /** dump serial buffer */ if(_serial->available()){ DMSG("Dump serial buffer: "); } while(_serial->available()){ uint8_t ret = _serial->read(); DMSG_HEX(ret); } command = header[0]; _serial->write(PN532_PREAMBLE); _serial->write(PN532_STARTCODE1); _serial->write(PN532_STARTCODE2); uint8_t length = hlen + blen + 1; // length of data field: TFI + DATA _serial->write(length); _serial->write(~length + 1); // checksum of length _serial->write(PN532_HOSTTOPN532); uint8_t sum = PN532_HOSTTOPN532; // sum of TFI + DATA DMSG("\r\nWrite: "); _serial->write(header, hlen); for (uint8_t i = 0; i < hlen; i++) { sum += header[i]; DMSG_HEX(header[i]); } _serial->write(body, blen); for (uint8_t i = 0; i < blen; i++) { sum += body[i]; DMSG_HEX(body[i]); } uint8_t checksum = ~sum + 1; // checksum of TFI + DATA _serial->write(checksum); _serial->write(PN532_POSTAMBLE); return readAckFrame(); }
int8_t PN532_SPI::writeCommand(const uint8_t *header, uint8_t hlen, const uint8_t *body, uint8_t blen) { command = header[0]; writeFrame(header, hlen, body, blen); uint8_t timeout = PN532_ACK_WAIT_TIME; while (!isReady()) { delay(1); timeout--; if (0 == timeout) { DMSG_STR("Time out when waiting for ACK"); return -2; } } if (readAckFrame()) { DMSG_STR("Invalid ACK"); return PN532_INVALID_ACK; } return 0; }