{
switch(Uart.state) {
case STATE_UNSYNCD:
- LED_A_OFF();
if(!bit) {
// we went low, so this could be the beginning
// of an SOF
Uart.bitCnt = 0;
Uart.shiftReg = 0;
Uart.state = STATE_RECEIVING_DATA;
- LED_A_ON(); // Indicate we're receiving
}
break;
Uart.posCnt++;
if(Uart.posCnt > 10) {
Uart.state = STATE_UNSYNCD;
+ LED_A_OFF();
}
break;
break;
}
- // This row make the error blew circular buffer in hf 14b snoop
- //if (Uart.state == STATE_ERROR_WAIT) LED_A_OFF(); // Error
-
return FALSE;
}
} else {
if(Demod.posCount > 100) {
Demod.state = DEMOD_UNSYNCD;
+ LED_C_OFF();
}
}
Demod.posCount++;
if(v > 0) {
if(Demod.posCount > 10) {
Demod.state = DEMOD_UNSYNCD;
+ LED_C_OFF();
}
} else {
Demod.bitCount = 0;
Demod.output[Demod.len] = b;
Demod.len++;
Demod.state = DEMOD_AWAITING_START_BIT;
- } else if(s == 0x000) {
- // This is EOF
- LED_C_OFF();
- Demod.state = DEMOD_UNSYNCD;
- return TRUE;
} else {
Demod.state = DEMOD_UNSYNCD;
+ LED_C_OFF();
+ if(s == 0x000) {
+ // This is EOF
+ return TRUE;
+ }
}
}
Demod.posCount = 0;
default:
Demod.state = DEMOD_UNSYNCD;
+ LED_C_OFF();
break;
}
- if (Demod.state == DEMOD_UNSYNCD) LED_C_OFF(); // Not synchronized...
return FALSE;
}
//-----------------------------------------------------------------------------
/*
* Memory usage for this function, (within BigBuf)
- * 0-4095 : Demodulated samples receive (4096 bytes) - DEMOD_TRACE_SIZE
- * 4096-6143 : Last Received command, 2048 bytes (reader->tag) - READER_TAG_BUFFER_SIZE
- * 6144-8191 : Last Received command, 2048 bytes(tag->reader) - TAG_READER_BUFFER_SIZE
- * 8192-9215 : DMA Buffer, 1024 bytes (samples) - DEMOD_DMA_BUFFER_SIZE
+ * Last Received command (reader->tag) - MAX_FRAME_SIZE
+ * Last Received command (tag->reader) - MAX_FRAME_SIZE
+ * DMA Buffer, 1024 bytes (samples) - DMA_BUFFER_SIZE
+ * Demodulated samples received - all the rest
*/
void RAMFUNC SnoopIso14443(void)
{
// We won't start recording the frames that we acquire until we trigger;
// a good trigger condition to get started is probably when we see a
// response from the tag.
- int triggered = TRUE;
+ int triggered = TRUE; // TODO: set and evaluate trigger condition
FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
BigBuf_free();
uint8_t parity[MAX_PARITY_SIZE];
LED_A_ON();
+ bool TagIsActive = FALSE;
+ bool ReaderIsActive = FALSE;
+
// And now we loop, receiving samples.
for(;;) {
int behindBy = (lastRxCounter - AT91C_BASE_PDC_SSC->PDC_RCR) &
samples += 2;
- if(Handle14443UartBit(ci & 1)) {
+ if (!TagIsActive) { // no need to try decoding reader data if the tag is sending
+ if(Handle14443UartBit(ci & 0x01)) {
if(triggered && tracing) {
GetParity(Uart.output, Uart.byteCnt, parity);
LogTrace(Uart.output,Uart.byteCnt,samples, samples,parity,TRUE);
/* false-triggered by the commands from the reader. */
DemodReset();
}
- if(Handle14443UartBit(cq & 1)) {
+ if(Handle14443UartBit(cq & 0x01)) {
if(triggered && tracing) {
GetParity(Uart.output, Uart.byteCnt, parity);
LogTrace(Uart.output,Uart.byteCnt,samples, samples, parity, TRUE);
/* false-triggered by the commands from the reader. */
DemodReset();
}
+ ReaderIsActive = (Uart.state != STATE_UNSYNCD);
+ }
- if(Handle14443SamplesDemod(ci, cq)) {
+ if(!ReaderIsActive) { // no need to try decoding tag data if the reader is sending - and we cannot afford the time
+ if(Handle14443SamplesDemod(ci & 0xFE, cq & 0xFE)) {
//Use samples as a time measurement
if(tracing)
// And ready to receive another response.
DemodReset();
}
+ TagIsActive = (Demod.state != DEMOD_UNSYNCD);
+ }
+
WDT_HIT();
if(!tracing) {
reg [5:0] corr_i_cnt;
reg [5:0] corr_q_cnt;
// And a couple of registers in which to accumulate the correlations.
-reg signed [15:0] corr_i_accum;
-reg signed [15:0] corr_q_accum;
+// we would add at most 32 times adc_d, the result can be held in 13 bits.
+// Need one additional bit because it can be negative as well
+reg signed [13:0] corr_i_accum;
+reg signed [13:0] corr_q_accum;
reg signed [7:0] corr_i_out;
reg signed [7:0] corr_q_out;
begin
if(snoop)
begin
- corr_i_out <= {corr_i_accum[12:6], after_hysteresis_prev};
- corr_q_out <= {corr_q_accum[12:6], after_hysteresis};
+ // highest 7 significant bits of tag signal (signed), 1 bit reader signal:
+ corr_i_out <= {corr_i_accum[13:7], after_hysteresis_prev};
+ corr_q_out <= {corr_q_accum[13:7], after_hysteresis};
end
else
begin
- // Only correlations need to be delivered.
+ // highest 8 significant bits of tag signal
corr_i_out <= corr_i_accum[13:6];
corr_q_out <= corr_q_accum[13:6];
end
end
end
- if(corr_i_cnt[5:2] == 4'b000 || corr_i_cnt[5:2] == 4'b1000)
+ // set ssp_frame signal for corr_i_cnt = 0..3 and corr_i_cnt = 32..35
+ // (two frames with 8 Bits each)
+ if(corr_i_cnt[5:2] == 4'b0000 || corr_i_cnt[5:2] == 4'b1000)
ssp_frame = 1'b1;
else
ssp_frame = 1'b0;