{"id":315299,"date":"2020-12-22T09:00:57","date_gmt":"2020-12-22T09:00:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315299"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315299","title":{"rendered":"INTEL (Altera) USB Byte Blaster \u043d\u0430 STM32"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p> \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0435\u0441\u043b\u0438 \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\/\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p> \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043d\u0435 \u043d\u0430\u0434\u043e\u0435\u043b\u043e \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043f\u043b\u0430\u0442\u0430\u0445 \u0440\u0430\u0437\u044a\u0435\u043c JTAG, \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p> \u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Verilog \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 &#171;\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u0447\u0438\u043a\u0438 \u0431\u0435\u0433\u0430\u044e\u0442&#187; \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e SignalTap II Logic Analizer, \u0448\u0442\u0443\u043a\u0430 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f, \u044f \u0434\u0443\u043c\u0430\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u0443\u0437\u043d\u0430\u044e\u0442 \u043f\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e29\/0ed\/f0d\/e290edf0df9c668173b79e5d871f545e.jpg\" width=\"1083\" height=\"567\"><figcaption><\/figcaption><\/figure>\n<p> \u041d\u043e \u043a\u0430\u043a \u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c  \u0441\u0430\u043c\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u0435\u0437 JTAG?<\/p>\n<p> \u042f \u0443\u0436 \u043c\u043e\u043b\u0447\u0443 \u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a \u0432 CPLD \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430.<\/p>\n<p> \u0410 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 STM32F103RCT6 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 \u043d\u0435\u043c USB Byte Blaster. \u0418 \u0432\u043e\u0437\u044c\u043c\u0435\u043c CPLD EPM3064.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aea\/968\/af4\/aea968af4cdd2bd3c0ebc373b8b9b3c3.jpg\" width=\"773\" height=\"500\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443 \u0447\u0442\u043e \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0432\u043e\u0434\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>PC12-&gt;TDI<\/p>\n<p>PC13-&gt;TMS<\/p>\n<p>PC14-&gt;TCK<\/p>\n<p>PC15-&gt;TDO<\/p>\n<p>USB \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430, \u043e\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e:<\/p>\n<details class=\"spoiler\">\n<summary>USB Descriptor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* USB Standard Device Descriptor *\/ const BYTE USB_DeviceDescriptor[] = {   USB_DEVICE_DESC_SIZE,              \/* bLength *\/   USB_DEVICE_DESCRIPTOR_TYPE,        \/* bDescriptorType *\/   WBVAL(0x0110), \/* 1.10 *\/          \/* bcdUSB *\/     0x00,                   \/\/ Class Code     0x00,                   \/\/ Subclass code     0x00,                   \/\/ Protocol code     USB_MAX_PACKET0,          \/\/ Max packet size for EP0, see usbcfg.h   WBVAL(0x09FB),                     \/* idVendor *\/   WBVAL(0x6001),                     \/* idProduct *\/   WBVAL(0x0400), \/* 1.00 *\/          \/* bcdDevice *\/     0x01,                   \/\/ Manufacturer string index     0x02,                   \/\/ Product string index     0x03,                   \/\/ Device serial number string index     0x01                    \/\/ Number of possible configurations\t };  \/* USB Configuration Descriptor *\/ \/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor *\/ const BYTE USB_ConfigDescriptor[] = {     \/* Configuration Descriptor *\/   USB_CONFIGUARTION_DESC_SIZE,       \/* bLength *\/   USB_CONFIGURATION_DESCRIPTOR_TYPE, \/* bDescriptorType *\/ \/* Configuration 1 *\/   WBVAL(                            \/* wTotalLength *\/     (1*USB_CONFIGUARTION_DESC_SIZE) +     (1*USB_INTERFACE_DESC_SIZE) +     (2*USB_ENDPOINT_DESC_SIZE)   ),     1,                      \/\/ Number of interfaces in this cfg     1,                      \/\/ Index value of this configuration     0,                      \/\/ Configuration string index   USB_CONFIG_SELF_POWERED, \/*|*\/       \/* bmAttributes *\/   USB_CONFIG_POWER_MA(80),          \/* bMaxPower *\/      \/* Interface Descriptor *\/   USB_INTERFACE_DESC_SIZE,           \/* bLength *\/   USB_INTERFACE_DESCRIPTOR_TYPE,     \/* bDescriptorType *\/ \/* Interface 0, Alternate Setting 0, MSC Class *\/   0x00,                              \/* bInterfaceNumber *\/   0x00,                              \/* bAlternateSetting *\/   0x02,                              \/* bNumEndpoints *\/     0xFF,                   \/\/ Class code     0xFF,                   \/\/ Subclass code     0xFF,                   \/\/ Protocol code     0,                      \/\/ Interface string index          \/* Endpoint Descriptor *\/ \/* Bulk In Endpoint *\/   USB_ENDPOINT_DESC_SIZE,            \/* bLength *\/   USB_ENDPOINT_DESCRIPTOR_TYPE,      \/* bDescriptorType *\/   USB_ENDPOINT_IN(BLST_EP_IN &amp; 0x0F),                \/* bEndpointAddress *\/   USB_ENDPOINT_TYPE_BULK,            \/* bmAttributes *\/   WBVAL(BLST_MAX_PACKET),                     \/* wMaxPacketSize *\/     10,                         \/\/Interval        USB_ENDPOINT_DESC_SIZE,            \/* bLength *\/   USB_ENDPOINT_DESCRIPTOR_TYPE,      \/* bDescriptorType *\/   USB_ENDPOINT_OUT(BLST_EP_OUT &amp; 0x0F),               \/* bEndpointAddress *\/   USB_ENDPOINT_TYPE_BULK,            \/* bmAttributes *\/   WBVAL(BLST_MAX_PACKET),                     \/* wMaxPacketSize *\/     10                          \/\/Interval\t \/* Terminator *\/   ,0                                  \/* bLength *\/ };  \/\/Language code string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={ sizeof(sd000),USB_STRING_DESCRIPTOR_TYPE,{0x0409}};  \/\/Manufacturer string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[6];}sd001={ sizeof(sd001),USB_STRING_DESCRIPTOR_TYPE, {'A','l','t','e','r','a'}};  \/\/Product string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[11];}sd002={ sizeof(sd002),USB_STRING_DESCRIPTOR_TYPE, {'U','S','B','-','B','l','a','s','t','e','r'}};  \/\/Serial string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[8];}sd003={ sizeof(sd003),USB_STRING_DESCRIPTOR_TYPE, {'0','0','0','0','0','0','0','0'}};  \/\/Array of configuration descriptors ROM BYTE *ROM USB_CD_Ptr[]= {     (ROM BYTE *)&amp;USB_ConfigDescriptor }; \/\/Array of string descriptors ROM BYTE *ROM USB_SD_Ptr[]= {     (ROM BYTE *)&amp;sd000,     (ROM BYTE *)&amp;sd001,     (ROM BYTE *)&amp;sd002,     (ROM BYTE *)&amp;sd003 };  \/* USB String Descriptor (optional) *\/ const BYTE *USB_StringDescriptor = (const BYTE *)USB_SD_Ptr;<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0443 &#171;\u043d\u0430\u0447\u0438\u043d\u043a\u0443&#187; Byte Blaster&#8217;a:<\/p>\n<details class=\"spoiler\">\n<summary>blaster.c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">BYTE fifo_wp,fifo_rp; BYTE InFIFO[256];  BYTE nCS = 0;  DWORD PacketPos = 0; BYTE InPacket[64]; BYTE OutPacket[128]; BYTE ep1_ready = 1;  void EP2CallBack(void) { \tProcBlasterData(); }  void ProcBlasterData(void) { \tint bufptr = 0; \tstatic BYTE jtag_byte = 0, read = 0, aser_byte = 0; \tDWORD recv_byte; \tBYTE acc0, acc1; \t \trecv_byte = USB_ReadEP(BLST_EP_OUT, OutPacket);  \tbufptr = 0; \t \tif(!recv_byte) return; \tLED_RD_ON(); \t \tdo \t{ \t\tif (jtag_byte) \t\t{ \t\t\tif (!read) \t\t\t{ \t\t\t\tdo \t\t\t\t{  \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tJTAG_Write(acc0); \t\t\t\t\tjtag_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (jtag_byte &amp;&amp; recv_byte); \t\t\t} \t\t\telse \t\t\t{ \t\t\t\tdo \t\t\t\t{  \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tacc1 = JTAG_RW(acc0); \t\t\t\t\tenqueue(acc1); \t\t\t\t\tjtag_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (jtag_byte&amp;&amp;recv_byte); \t\t\t}  \t\t} \t\telse if (aser_byte) \t\t{ \t\t\tif (!read) \t\t\t{  \t\t\t\tdo \t\t\t\t{  \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tJTAG_Write(acc0); \t\t\t\t\taser_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (aser_byte&amp;&amp;recv_byte); \t\t\t} \t\t\telse \t\t\t{ \t\t\t\tdo { \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tacc1 = ASer_RW(acc0); \t\t\t\t\tenqueue(acc1); \t\t\t\t\taser_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (aser_byte&amp;&amp;recv_byte); \t\t\t} \t\t} \t\telse \t\t{ \t\t\tdo \t\t\t{ \t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t_bitcopy(bitmask(acc0, 6), read); \t\t\t\tif (bitmask(acc0, 7)) \t\t\t\t{\t\t\/\/EnterSerialMode \t\t\t\t\tLTCK(0);\t\t\/\/bug fix \t\t\t\t\t \t\t\t\t\tif (nCS &amp; 0x8)  \t\t\t\t\t{\t\/\/nCS=1:JTAG \t\t\t\t\t\tjtag_byte = acc0 &amp; 0x3F; \t\t\t\t\t} \t\t\t\t\telse  \t\t\t\t\t{\t\t\/\/nCS=0:ActiveSerial \t\t\t\t\t\taser_byte = acc0 &amp; 0x3F; \t\t\t\t\t} \t\t\t\t\t\/* Always JTAG Made *\/ \t\t\t\t\trecv_byte--; \t\t\t\t\tbreak; \t\t\t\t} \t\t\t\telse \t\t\t\t{\t\t\t\/\/BitBangMode \t\t\t\t\tOUTP(acc0); \t\t\t\t\tif (read) { \t\t\t\t\t\tacc1 = 0; \t\t\t\t\t\tif (PADO) acc1 |= 0x02; \t\t\t\t\t\tif (PTDO) acc1 |= 0x01; \t\t\t\t\t\tenqueue(acc1); \t\t\t\t\t} \t\t\t\t\trecv_byte--; \t\t\t\t} \t\t\t} while (recv_byte); \t\t} \t} while (recv_byte);  \t\/* Disable RD LED *\/ \tLED_RD_OFF(); \treturn; }  void EP1CallBack(void) { \tep1_ready = 1;  \treturn; }  void OUTP(BYTE b) { \tunsigned int uiPortState = GPIOC-&gt;ODR; \t\/* \tTCK - 0 \t\t\tTMS - 1 \t\t\tnCE - 2 \t\t\tnCS - 3 \tx - 5,6 \t\t\tTDI - 4,7 \t*\/ \tif(b &amp; (1 &lt;&lt; 3)) \/* nCS *\/ \t\tnCS = 0x08; \telse \t\tnCS = 0; \t \tif(b &amp; (1 &lt;&lt; 0)) \/* TCK *\/ \t\tuiPortState |= (1 &lt;&lt; 14); \telse \t\tuiPortState &amp;= ~(1 &lt;&lt; 14);  \tif(b &amp; (1 &lt;&lt; 1)) \/* TMS *\/ \t\tuiPortState |= (1 &lt;&lt; 13); \telse \t\tuiPortState &amp;= ~(1 &lt;&lt; 13);  \tif(b &amp; (1 &lt;&lt; 4)) \/* TDI *\/ \t\tuiPortState |= (1 &lt;&lt; 12); \telse \t\tuiPortState &amp;= ~(1 &lt;&lt; 12); \t \tGPIOC-&gt;ODR = uiPortState; \t \/\/\tNop(); \t \treturn; }  void JTAG_Write(BYTE a)  { \tint i; \t \tfor(i = 0;i &lt; 8;i ++) \t{ \t\tbitcopy(a &amp; (0x01 &lt;&lt; i),LTDI); \t\ttck(); \t} }  BYTE JTAG_RW(BYTE a) { \tBYTE bRet=0; \tint i = 0; \t \tfor(i = 0;i &lt; 8;i++) \t{ \t\tbitcopy(a &amp; (0x01 &lt;&lt; i),LTDI); \t\tif(PTDO) bRet |= (0x01 &lt;&lt; i); \t\ttck(); \t} \t \treturn bRet; }  BYTE ASer_RW(BYTE a) { \tBYTE bRet=0; \tint i = 0; \t \tfor(i = 0;i &lt; 8;i++) \t{ \t\tbitcopy(a &amp; (0x01 &lt;&lt; 1),LTDI); \t\tif(PADO) bRet|= (0x01 &lt;&lt; 1); \t\ttck(); \t}\t\t \t \treturn bRet; }  extern USB_EP_DATA EP0Data; BYTE bBuffer[10];  void USB_EP0BlasterReq(USB_SETUP_PACKET *SetupPacket) { \tBYTE bIndex;  \tif (SetupPacket-&gt;bmRequestType.BM.Dir == 0) \t{\t\/\/0utput \t\t\/\/Responce by sending zero-length packet \t\t\/\/I don't know if this way is right, but working:) \t\tUSB_WriteEP(0x80, NULL, 0); \t\treturn; \t}  \tif (SetupPacket-&gt;bRequest == 0x90) \t{ \t\tbIndex = (SetupPacket-&gt;wIndex.WB.L &lt;&lt; 1) &amp; 0x7E; \t\tbBuffer[0] = eeprom_read(bIndex); \t\tbBuffer[1] = eeprom_read(bIndex + 1); \t} \telse \t{ \t\tbBuffer[0] = 0x36; \t\tbBuffer[1] = 0x83; \t}  \tEP0Data.pData = bBuffer; \tEP0Data.Count = 2; \t\/\/\t\tUSB_WriteEP(0x80, bBuffer, 2);  \treturn; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u0432 \u0444\u0438\u043d\u0430\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0438 \u0432 \u0442\u0430\u0439\u043c\u0435\u0440\u0435, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 main() \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>main.c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">  while (1)  \t{ \t\tif(USB_Configuration) \t\t{ \t\t\tif(ep1_ready) \t\t\t{ \t\t\t\tacc0 = fifo_used(); \t\t\t\tif (62 &lt;= acc0)  \t\t\t\t{\t\t\/\/send full packet to host \t\t\t\t\tLED_WR_ON(); \t\t\t\t\tep1_ready = 0; \t\t\t\t\tdequeue(&amp;InPacket[2], 62); \t\t\t\t\tUSB_WriteEP(BLST_EP_IN, InPacket, 64); \t\t\t\t\tChargeTimer_ms(10); \t\t\t\t} \t\t\t\telse if(acc0 || IsTimerArrived()) \t\t\t\t{ \t\t\t\t\tif(acc0) \t\t\t\t\t\tLED_WR_ON(); \t\t\t\t\telse\t\t\t\t\t\t \t\t\t\t\t\tLED_WR_OFF(); \t\t\t\t\tep1_ready = 0; \t\t\t\t\tif(acc0) \t\t\t\t\t\tdequeue(&amp;InPacket[2], acc0); \t\t\t\t\tUSB_WriteEP(BLST_EP_IN, InPacket, acc0 + 2); \t\t\t\t\tChargeTimer_ms(10); \t\t\t\t} \t\t\t} \t\t}   } \/\/ end while<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1b7\/69c\/c5c\/1b769cc5ccfd2f6f0978c023a02da443.jpg\" width=\"1067\" height=\"800\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a USB.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/970\/97a\/fa7\/97097afa79d7f15b7c529ba9e6cef0f3.png\" width=\"346\" height=\"120\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u044d\u0442\u043e \u0436\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 &#171;\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439&#187; Byte Blaster.<\/p>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0fa\/5a5\/135\/0fa5a513577958737585f3e56bf06dc5.png\" width=\"605\" height=\"445\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c JTAG Chain Debugger:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c3\/28e\/959\/8c328e95908df7d7b47b51cbce6eca1e.png\" width=\"836\" height=\"791\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442!!! \u041c\u043e\u0436\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c CPLD \u043f\u0440\u044f\u043c \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a FPGA, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 FPGA \u0438 SignalTap II. \u0423 \u043c\u0435\u043d\u044f \u0432\u0441\u0451. <\/p>\n<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0423\u0441\u043f\u0435\u0445\u043e\u0432 \u0432 \u0434\u0435\u043b\u0430\u0445 \u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f!<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/534358\/\"> https:\/\/habr.com\/ru\/post\/534358\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p> \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0435\u0441\u043b\u0438 \u0432 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430, \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\/\u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p> \u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043d\u0435 \u043d\u0430\u0434\u043e\u0435\u043b\u043e \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043f\u043b\u0430\u0442\u0430\u0445 \u0440\u0430\u0437\u044a\u0435\u043c JTAG, \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0430 \u043f\u043b\u0430\u0442\u0435 \u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p> \u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Verilog \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 &#171;\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u0447\u0438\u043a\u0438 \u0431\u0435\u0433\u0430\u044e\u0442&#187; \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e SignalTap II Logic Analizer, \u0448\u0442\u0443\u043a\u0430 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0430\u044f, \u044f \u0434\u0443\u043c\u0430\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0441\u0440\u0430\u0437\u0443 \u0443\u0437\u043d\u0430\u044e\u0442 \u043f\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p> \u041d\u043e \u043a\u0430\u043a \u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c  \u0441\u0430\u043c\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u0435\u0437 JTAG?<\/p>\n<p> \u042f \u0443\u0436 \u043c\u043e\u043b\u0447\u0443 \u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043e\u043a \u0432 CPLD \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430.<\/p>\n<p> \u0410 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 STM32F103RCT6 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 \u043d\u0435\u043c USB Byte Blaster. \u0418 \u0432\u043e\u0437\u044c\u043c\u0435\u043c CPLD EPM3064.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u044f \u0438\u043c\u0435\u044e \u0432\u0432\u0438\u0434\u0443 \u0447\u0442\u043e \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0432\u044b\u0432\u043e\u0434\u0430\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>PC12-&gt;TDI<\/p>\n<p>PC13-&gt;TMS<\/p>\n<p>PC14-&gt;TCK<\/p>\n<p>PC15-&gt;TDO<\/p>\n<p>USB \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430, \u043e\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e:<\/p>\n<details class=\"spoiler\">\n<summary>USB Descriptor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/* USB Standard Device Descriptor *\/ const BYTE USB_DeviceDescriptor[] = {   USB_DEVICE_DESC_SIZE,              \/* bLength *\/   USB_DEVICE_DESCRIPTOR_TYPE,        \/* bDescriptorType *\/   WBVAL(0x0110), \/* 1.10 *\/          \/* bcdUSB *\/     0x00,                   \/\/ Class Code     0x00,                   \/\/ Subclass code     0x00,                   \/\/ Protocol code     USB_MAX_PACKET0,          \/\/ Max packet size for EP0, see usbcfg.h   WBVAL(0x09FB),                     \/* idVendor *\/   WBVAL(0x6001),                     \/* idProduct *\/   WBVAL(0x0400), \/* 1.00 *\/          \/* bcdDevice *\/     0x01,                   \/\/ Manufacturer string index     0x02,                   \/\/ Product string index     0x03,                   \/\/ Device serial number string index     0x01                    \/\/ Number of possible configurations\t };  \/* USB Configuration Descriptor *\/ \/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor *\/ const BYTE USB_ConfigDescriptor[] = {     \/* Configuration Descriptor *\/   USB_CONFIGUARTION_DESC_SIZE,       \/* bLength *\/   USB_CONFIGURATION_DESCRIPTOR_TYPE, \/* bDescriptorType *\/ \/* Configuration 1 *\/   WBVAL(                            \/* wTotalLength *\/     (1*USB_CONFIGUARTION_DESC_SIZE) +     (1*USB_INTERFACE_DESC_SIZE) +     (2*USB_ENDPOINT_DESC_SIZE)   ),     1,                      \/\/ Number of interfaces in this cfg     1,                      \/\/ Index value of this configuration     0,                      \/\/ Configuration string index   USB_CONFIG_SELF_POWERED, \/*|*\/       \/* bmAttributes *\/   USB_CONFIG_POWER_MA(80),          \/* bMaxPower *\/      \/* Interface Descriptor *\/   USB_INTERFACE_DESC_SIZE,           \/* bLength *\/   USB_INTERFACE_DESCRIPTOR_TYPE,     \/* bDescriptorType *\/ \/* Interface 0, Alternate Setting 0, MSC Class *\/   0x00,                              \/* bInterfaceNumber *\/   0x00,                              \/* bAlternateSetting *\/   0x02,                              \/* bNumEndpoints *\/     0xFF,                   \/\/ Class code     0xFF,                   \/\/ Subclass code     0xFF,                   \/\/ Protocol code     0,                      \/\/ Interface string index          \/* Endpoint Descriptor *\/ \/* Bulk In Endpoint *\/   USB_ENDPOINT_DESC_SIZE,            \/* bLength *\/   USB_ENDPOINT_DESCRIPTOR_TYPE,      \/* bDescriptorType *\/   USB_ENDPOINT_IN(BLST_EP_IN &amp; 0x0F),                \/* bEndpointAddress *\/   USB_ENDPOINT_TYPE_BULK,            \/* bmAttributes *\/   WBVAL(BLST_MAX_PACKET),                     \/* wMaxPacketSize *\/     10,                         \/\/Interval        USB_ENDPOINT_DESC_SIZE,            \/* bLength *\/   USB_ENDPOINT_DESCRIPTOR_TYPE,      \/* bDescriptorType *\/   USB_ENDPOINT_OUT(BLST_EP_OUT &amp; 0x0F),               \/* bEndpointAddress *\/   USB_ENDPOINT_TYPE_BULK,            \/* bmAttributes *\/   WBVAL(BLST_MAX_PACKET),                     \/* wMaxPacketSize *\/     10                          \/\/Interval\t \/* Terminator *\/   ,0                                  \/* bLength *\/ };  \/\/Language code string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={ sizeof(sd000),USB_STRING_DESCRIPTOR_TYPE,{0x0409}};  \/\/Manufacturer string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[6];}sd001={ sizeof(sd001),USB_STRING_DESCRIPTOR_TYPE, {'A','l','t','e','r','a'}};  \/\/Product string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[11];}sd002={ sizeof(sd002),USB_STRING_DESCRIPTOR_TYPE, {'U','S','B','-','B','l','a','s','t','e','r'}};  \/\/Serial string descriptor ROM struct{BYTE bLength;BYTE bDscType;WORD string[8];}sd003={ sizeof(sd003),USB_STRING_DESCRIPTOR_TYPE, {'0','0','0','0','0','0','0','0'}};  \/\/Array of configuration descriptors ROM BYTE *ROM USB_CD_Ptr[]= {     (ROM BYTE *)&amp;USB_ConfigDescriptor }; \/\/Array of string descriptors ROM BYTE *ROM USB_SD_Ptr[]= {     (ROM BYTE *)&amp;sd000,     (ROM BYTE *)&amp;sd001,     (ROM BYTE *)&amp;sd002,     (ROM BYTE *)&amp;sd003 };  \/* USB String Descriptor (optional) *\/ const BYTE *USB_StringDescriptor = (const BYTE *)USB_SD_Ptr;<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u0443 &#171;\u043d\u0430\u0447\u0438\u043d\u043a\u0443&#187; Byte Blaster&#8217;a:<\/p>\n<details class=\"spoiler\">\n<summary>blaster.c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">BYTE fifo_wp,fifo_rp; BYTE InFIFO[256];  BYTE nCS = 0;  DWORD PacketPos = 0; BYTE InPacket[64]; BYTE OutPacket[128]; BYTE ep1_ready = 1;  void EP2CallBack(void) { \tProcBlasterData(); }  void ProcBlasterData(void) { \tint bufptr = 0; \tstatic BYTE jtag_byte = 0, read = 0, aser_byte = 0; \tDWORD recv_byte; \tBYTE acc0, acc1; \t \trecv_byte = USB_ReadEP(BLST_EP_OUT, OutPacket);  \tbufptr = 0; \t \tif(!recv_byte) return; \tLED_RD_ON(); \t \tdo \t{ \t\tif (jtag_byte) \t\t{ \t\t\tif (!read) \t\t\t{ \t\t\t\tdo \t\t\t\t{  \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tJTAG_Write(acc0); \t\t\t\t\tjtag_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (jtag_byte &amp;&amp; recv_byte); \t\t\t} \t\t\telse \t\t\t{ \t\t\t\tdo \t\t\t\t{  \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tacc1 = JTAG_RW(acc0); \t\t\t\t\tenqueue(acc1); \t\t\t\t\tjtag_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (jtag_byte&amp;&amp;recv_byte); \t\t\t}  \t\t} \t\telse if (aser_byte) \t\t{ \t\t\tif (!read) \t\t\t{  \t\t\t\tdo \t\t\t\t{  \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tJTAG_Write(acc0); \t\t\t\t\taser_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (aser_byte&amp;&amp;recv_byte); \t\t\t} \t\t\telse \t\t\t{ \t\t\t\tdo { \t\t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t\tacc1 = ASer_RW(acc0); \t\t\t\t\tenqueue(acc1); \t\t\t\t\taser_byte--; \t\t\t\t\trecv_byte--; \t\t\t\t} while (aser_byte&amp;&amp;recv_byte); \t\t\t} \t\t} \t\telse \t\t{ \t\t\tdo \t\t\t{ \t\t\t\tacc0 = OutPacket[bufptr++]; \t\t\t\t_bitcopy(bitmask(acc0, 6), read); \t\t\t\tif (bitmask(acc0, 7)) \t\t\t\t{\t\t\/\/EnterSerialMode \t\t\t\t\tLTCK(0);\t\t\/\/bug fix \t\t\t\t\t \t\t\t\t\tif (nCS &amp; 0x8)  \t\t\t\t\t{\t\/\/nCS=1:JTAG \t\t\t\t\t\tjtag_byte = acc0 &amp; 0x3F; \t\t\t\t\t} \t\t\t\t\telse  \t\t\t\t\t{\t\t\/\/nCS=0:ActiveSerial \t\t\t\t\t\taser_byte = acc0 &amp; 0x3F; \t\t\t\t\t} \t\t\t\t\t\/* Always JTAG Made *\/ \t\t\t\t\trecv_byte--; \t\t\t\t\tbreak; \t\t\t\t} \t\t\t\telse \t\t\t\t{\t\t\t\/\/BitBangMode \t\t\t\t\tOUTP(acc0); \t\t\t\t\tif (read) { \t\t\t\t\t\tacc1 = 0; \t\t\t\t\t\tif (PADO) acc1 |= 0x02; \t\t\t\t\t\tif (PTDO) acc1 |= 0x01; \t\t\t\t\t\tenqueue(acc1); \t\t\t\t\t} \t\t\t\t\trecv_byte--; \t\t\t\t} \t\t\t} while (recv_byte); \t\t} \t} while (recv_byte);  \t\/* Disable RD LED *\/ \tLED_RD_OFF(); \treturn; }  void EP1CallBack(void) { \tep1_ready = 1;  \treturn; }  void OUTP(BYTE b) { \tunsigned int uiPortState = GPIOC-&gt;ODR; \t\/* \tTCK - 0 \t\t\tTMS - 1 \t\t\tnCE - 2 \t\t\tnCS - 3 \tx - 5,6 \t\t\tTDI - 4,7 \t*\/ \tif(b &amp; (1 &lt;&lt; 3)) \/* nCS *\/ \t\tnCS = 0x08; \telse \t\tnCS = 0; \t \tif(b &amp; (1 &lt;&lt; 0)) \/* TCK *\/ \t\tuiPortState |= (1 &lt;&lt; 14); \telse \t\tuiPortState &amp;= ~(1 &lt;&lt; 14);  \tif(b &amp; (1 &lt;&lt; 1)) \/* TMS *\/ \t\tuiPortState |= (1 &lt;&lt; 13); \telse \t\tuiPortState &amp;= ~(1 &lt;&lt; 13);  \tif(b &amp; (1 &lt;&lt; 4)) \/* TDI *\/ \t\tuiPortState |= (1 &lt;&lt; 12); \telse \t\tuiPortState &amp;= ~(1 &lt;&lt; 12); \t \tGPIOC-&gt;ODR = uiPortState; \t \/\/\tNop(); \t \treturn; }  void JTAG_Write(BYTE a)  { \tint i; \t \tfor(i = 0;i &lt; 8;i ++) \t{ \t\tbitcopy(a &amp; (0x01 &lt;&lt; i),LTDI); \t\ttck(); \t} }  BYTE JTAG_RW(BYTE a) { \tBYTE bRet=0; \tint i = 0; \t \tfor(i = 0;i &lt; 8;i++) \t{ \t\tbitcopy(a &amp; (0x01 &lt;&lt; i),LTDI); \t\tif(PTDO) bRet |= (0x01 &lt;&lt; i); \t\ttck(); \t} \t \treturn bRet; }  BYTE ASer_RW(BYTE a) { \tBYTE bRet=0; \tint i = 0; \t \tfor(i = 0;i &lt; 8;i++) \t{ \t\tbitcopy(a &amp; (0x01 &lt;&lt; 1),LTDI); \t\tif(PADO) bRet|= (0x01 &lt;&lt; 1); \t\ttck(); \t}\t\t \t \treturn bRet; }  extern USB_EP_DATA EP0Data; BYTE bBuffer[10];  void USB_EP0BlasterReq(USB_SETUP_PACKET *SetupPacket) { \tBYTE bIndex;  \tif (SetupPacket-&gt;bmRequestType.BM.Dir == 0) \t{\t\/\/0utput \t\t\/\/Responce by sending zero-length packet \t\t\/\/I don't know if this way is right, but working:) \t\tUSB_WriteEP(0x80, NULL, 0); \t\treturn; \t}  \tif (SetupPacket-&gt;bRequest == 0x90) \t{ \t\tbIndex = (SetupPacket-&gt;wIndex.WB.L &lt;&lt; 1) &amp; 0x7E; \t\tbBuffer[0] = eeprom_read(bIndex); \t\tbBuffer[1] = eeprom_read(bIndex + 1); \t} \telse \t{ \t\tbBuffer[0] = 0x36; \t\tbBuffer[1] = 0x83; \t}  \tEP0Data.pData = bBuffer; \tEP0Data.Count = 2; \t\/\/\t\tUSB_WriteEP(0x80, bBuffer, 2);  \treturn; } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u0432 \u0444\u0438\u043d\u0430\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u041c\u043e\u0436\u043d\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0438 \u0432 \u0442\u0430\u0439\u043c\u0435\u0440\u0435, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 main() \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>main.c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">  while (1)  \t{ \t\tif(USB_Configuration) \t\t{ \t\t\tif(ep1_ready) \t\t\t{ \t\t\t\tacc0 = fifo_used(); \t\t\t\tif (62 &lt;= acc0)  \t\t\t\t{\t\t\/\/send full packet to host \t\t\t\t\tLED_WR_ON(); \t\t\t\t\tep1_ready = 0; \t\t\t\t\tdequeue(&amp;InPacket[2], 62); \t\t\t\t\tUSB_WriteEP(BLST_EP_IN, InPacket, 64); \t\t\t\t\tChargeTimer_ms(10); \t\t\t\t} \t\t\t\telse if(acc0 || IsTimerArrived()) \t\t\t\t{ \t\t\t\t\tif(acc0) \t\t\t\t\t\tLED_WR_ON(); \t\t\t\t\telse\t\t\t\t\t\t \t\t\t\t\t\tLED_WR_OFF(); \t\t\t\t\tep1_ready = 0; \t\t\t\t\tif(acc0) \t\t\t\t\t\tdequeue(&amp;InPacket[2], acc0); \t\t\t\t\tUSB_WriteEP(BLST_EP_IN, InPacket, acc0 + 2); \t\t\t\t\tChargeTimer_ms(10); \t\t\t\t} \t\t\t} \t\t}   } \/\/ end while<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043a USB.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u044d\u0442\u043e \u0436\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 &#171;\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439&#187; Byte Blaster.<\/p>\n<p>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c JTAG Chain Debugger:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442!!! \u041c\u043e\u0436\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c CPLD \u043f\u0440\u044f\u043c \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/p>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a FPGA, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 FPGA \u0438 SignalTap II. \u0423 \u043c\u0435\u043d\u044f \u0432\u0441\u0451. <\/p>\n<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u0423\u0441\u043f\u0435\u0445\u043e\u0432 \u0432 \u0434\u0435\u043b\u0430\u0445 \u0438 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f!<\/p>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-315299","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=315299"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315299\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}