void SWJ_Sequence (uint32_t count, uint8_t *data) { uint32_t val; uint32_t n; val = 0; n = 0; while (count--) { if (n == 0) { val = *data++; n = 8; } if (val & 1) { PIN_SWDIO_TMS_SET(); } else { PIN_SWDIO_TMS_CLR(); } SW_CLOCK_CYCLE(); val >>= 1; n--; } }
uint8_t SWD_Transfer (uint32_t request, uint32_t *data) { uint32_t ack; uint32_t bit; uint32_t val; uint32_t parity; uint32_t n; /* Packet Request */ parity = 0; SW_WRITE_BIT(1); /* Start Bit */ bit = request >> 0; SW_WRITE_BIT(bit); /* APnDP Bit */ parity += bit; bit = request >> 1; SW_WRITE_BIT(bit); /* RnW Bit */ parity += bit; bit = request >> 2; SW_WRITE_BIT(bit); /* A2 Bit */ parity += bit; bit = request >> 3; SW_WRITE_BIT(bit); /* A3 Bit */ parity += bit; SW_WRITE_BIT(parity); /* Parity Bit */ SW_WRITE_BIT(0); /* Stop Bit */ SW_WRITE_BIT(1); /* Park Bit */ /* Turnaround */ TMS_RD(); for (n = 1; n; n--) { SW_CLOCK_CYCLE(); } /* Acknowledge response */ bit = SW_READ_BIT(); ack = bit << 0; bit = SW_READ_BIT(); ack |= bit << 1; bit = SW_READ_BIT(); ack |= bit << 2; switch(ack) { case DAP_TRANSFER_OK: if (request & DAP_TRANSFER_RnW) /* read data */ { val = 0; parity = 0; for (n = 32; n; n--) { bit = SW_READ_BIT(); /* Read RDATA[0:31] */ parity += bit; val >>= 1; val |= bit << 31; } bit = SW_READ_BIT(); /* Read Parity */ if ((parity ^ bit) & 1) { ack = DAP_TRANSFER_ERROR; } if (data) *data = val; /* Turnaround */ for (n = 1; n; n--) { SW_CLOCK_CYCLE(); } TMS_WR(); } else /* write data */ { /* Turnaround */ for (n = 1; n; n--) { SW_CLOCK_CYCLE(); }