static void tx_ack() { // wait for ack timeslot last_frame_end += TAG_ACK_WAIT; legic_prng_forward(TAG_ACK_WAIT/TAG_BIT_PERIOD - 1); while(GetCountSspClk() < last_frame_end) { }; // transmit ack (ack is not encrypted) tx_bit(true); legic_prng_forward(1); // disable subcarrier LOW(GPIO_SSC_DOUT); }
unsigned char spi_slow_wr(register unsigned char data) { register int cnt; for (cnt = 0; cnt < 8; cnt++) { tx_bit(data & MSB); delay1u5(); cts_bit(1); /* SPI clock ON */ data = (data << 1) | rx_bit(); /* SPI data input */ delay1u5(); cts_bit(0); /* SPI clock OFF */ } return(data); }
static void tx_frame(uint32_t frame, uint8_t len) { // wait for next tx timeslot last_frame_end += TAG_FRAME_WAIT; legic_prng_forward(TAG_FRAME_WAIT/TAG_BIT_PERIOD - 1); while(GetCountSspClk() < last_frame_end) { }; // transmit frame, MSB first for(uint8_t i = 0; i < len; ++i) { bool bit = (frame >> i) & 0x01; tx_bit(bit ^ legic_prng_get_bit()); legic_prng_forward(1); }; // disable subcarrier LOW(GPIO_SSC_DOUT); }