CryptoAuthLib
Atmel CryptoAuthentication Library
|
definitions for bit-banged SWI More...
Go to the source code of this file.
Data Structures | |
struct | SWIBuses |
Macros | |
#define | MAX_SWI_BUSES 10 |
AT88CK9000 has 10 sets of GPIO pin dedicated for SWI. More... | |
Macros for Bit-Banged SWI Timing | |
Times to drive bits at 230.4 kbps. | |
#define | BIT_DELAY_1L delay_us(3) |
#define | BIT_DELAY_1H delay_us(3) |
should be 4.34 us, is 4.42 us More... | |
#define | BIT_DELAY_5 delay_us(24) |
#define | BIT_DELAY_7 delay_us(32) |
#define | RX_TX_DELAY delay_us(14) |
#define | START_PULSE_TIME_OUT (255) |
#define | ZERO_PULSE_TIME_OUT (26) |
Functions | |
void | swi_set_pin (uint8_t id) |
Set SWI signal pin. Other functions will use this pin. More... | |
void | swi_enable (void) |
Configure GPIO pin for SWI signal as output. More... | |
void | swi_disable (void) |
Configure GPIO pin for SWI signal as input. More... | |
void | swi_set_signal_pin (uint8_t is_high) |
Set signal pin Low or High. More... | |
void | swi_send_wake_token (void) |
Send a Wake Token. More... | |
void | swi_send_bytes (uint8_t count, uint8_t *buffer) |
Send a number of bytes. More... | |
void | swi_send_byte (uint8_t byte) |
Send one byte. More... | |
ATCA_STATUS | swi_receive_bytes (uint8_t count, uint8_t *buffer) |
Receive a number of bytes. More... | |
Variables | |
SWIBuses | swi_buses_default |
definitions for bit-banged SWI
#define BIT_DELAY_1H delay_us(3) |
should be 4.34 us, is 4.42 us
#define BIT_DELAY_1L delay_us(3) |
delay macro for width of one pulse (start pulse or zero pulse) should be 4.34 us, is 4.67 us
#define BIT_DELAY_5 delay_us(24) |
time to keep pin high for five pulses plus stop bit (used to bit-bang CryptoAuth 'zero' bit) should be 26.04 us, is 26.42 us
#define BIT_DELAY_7 delay_us(32) |
time to keep pin high for seven bits plus stop bit (used to bit-bang CryptoAuth 'one' bit) should be 34.72 us, is 34.75 us
#define MAX_SWI_BUSES 10 |
AT88CK9000 has 10 sets of GPIO pin dedicated for SWI.
#define RX_TX_DELAY delay_us(14) |
turn around time when switching from receive to transmit should be 15 us, is 15.4 us
#define START_PULSE_TIME_OUT (255) |
One loop iteration for edge detection takes about 0.6 us on this hardware. Lets set the timeout value for start pulse detection to the uint8_t maximum. This value is decremented while waiting for the falling edge of a start pulse.
#define ZERO_PULSE_TIME_OUT (26) |
We measured a loop count of 8 for the start pulse. That means it takes about 0.6 us per loop iteration. Maximum time between rising edge of start pulse and falling edge of zero pulse is 8.6 us. Therefore, a value of 26 (around 15 us) gives ample time to detect a zero pulse and also leaves enough time to detect the following start pulse. The values above were established using the WinAVR 2010 compiler. The code runs faster when compiled with the compiler version of Atmel Studio 6. In this case a timeout value of 26 leads to a timeout of 10 us which is still greater than 8.6 us. This value is decremented while waiting for the falling edge of a zero pulse.
void swi_disable | ( | void | ) |
Configure GPIO pin for SWI signal as input.
void swi_enable | ( | void | ) |
Configure GPIO pin for SWI signal as output.
ATCA_STATUS swi_receive_bytes | ( | uint8_t | count, |
uint8_t * | buffer | ||
) |
Receive a number of bytes.
[in] | count | number of bytes to receive |
[out] | buffer | pointer to receive buffer |
Receive bits and store in buffer.
Make sure that the variable below is big enough. Change it to uint16_t if 255 is too small, but be aware that the loop resolution decreases on an 8-bit controller in that case.
Detect start bit.
Wait for falling edge.
Wait for rising edge.
For an Atmel microcontroller this might be faster than "pulse_count++".
Trying to measure the time of start bit and calculating the timeout for zero bit detection is not accurate enough for an 8 MHz 8-bit CPU. So let's just wait the maximum time for the falling edge of a zero bit to arrive after we have detected the rising edge of the start bit.
Detect possible edge indicating zero bit.
For an Atmel microcontroller this might be faster than "pulse_count++".
Wait for rising edge of zero pulse before returning. Otherwise we might interpret its rising edge as the next start pulse.
Update byte at current buffer index.
received "one" bit
Indicate that we timed out after having received at least one byte.
void swi_send_byte | ( | uint8_t | byte | ) |
Send one byte.
[in] | byte | byte to send |
void swi_send_bytes | ( | uint8_t | count, |
uint8_t * | buffer | ||
) |
Send a number of bytes.
[in] | count | number of bytes to send. |
[in] | buffer | pointer to buffer containing bytes to send |
Wait turn around time.
< Send Logic 1 (7F)
< Send Logic 0 (7D)
void swi_send_wake_token | ( | void | ) |
Send a Wake Token.
void swi_set_pin | ( | uint8_t | id | ) |
Set SWI signal pin. Other functions will use this pin.
[in] | id | definition of GPIO pin to be used |
void swi_set_signal_pin | ( | uint8_t | is_high | ) |
Set signal pin Low or High.
[in] | is_high | 0: Low, else: High. |
SWIBuses swi_buses_default |