Nuvoton'un M032SG8AE işlemcisi ile USB üzerinden bilgisayara veri gönderme işlemini yapıyorum. Veri transfer yöntemlerinden interruptı kullanarak gerçekleştirdim. Ben isochronous olarak da veri göndermek istiyorum.
İşlemcinin HID_Transfer diye bir örnek projesi var. Bu projede interrupt ile göndermişler. Ben bazı ayarları değiştirdim. Öncelikle configDescriptor'da EP_INT olan yerleri EP_ISO yaptım. 40. ve 53. satırlar.
Sonrasında endpoint konfigürasyonlarını yine isochronous moduna aldım. EP2 ile bilgisayara veri göndereceğim için onu seçtim isochronous olarak.
Veri göndermek için ise şöyle bir fonksiyon yazdım.
Gönderdiğim veriyi görebilmek için ise USB Trace isimli bir uygulama indirdim. Mikroişlemcimin USB çevresel birimini bağladığım yeri port2 olarak görüyorum. VID-PID falan uyuşuyor. Fakat veri gönderme işlemini bir türlü yapamadım. Acaba nerede hata yapıyorum ?
İşlemcinin HID_Transfer diye bir örnek projesi var. Bu projede interrupt ile göndermişler. Ben bazı ayarları değiştirdim. Öncelikle configDescriptor'da EP_INT olan yerleri EP_ISO yaptım. 40. ve 53. satırlar.
C:
uint8_t gu8ConfigDescriptor[] =
{
LEN_CONFIG, /* bLength */
DESC_CONFIG, /* bDescriptorType */
/* wTotalLength */
(LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT*2) & 0x00FF,
(((LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT*2) & 0xFF00) >> 8),
0x01, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
USBD_MAX_POWER, /* MaxPower */
/* I/F descr: HID */
LEN_INTERFACE, /* bLength */
DESC_INTERFACE, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x02, /* bNumEndpoints */
0x03, /* bInterfaceClass */
0x00, /* bInterfaceSubClass */
0x00, /* bInterfaceProtocol */
0x00, /* iInterface */
/* HID Descriptor */
LEN_HID, /* Size of this descriptor in UINT8s. */
DESC_HID, /* HID descriptor type. */
0x10, 0x01, /* HID Class Spec. release number. */
0x00, /* H/W target country. */
0x01, /* Number of HID class descriptors to follow. */
DESC_HID_RPT, /* Descriptor type. */
/* Total length of report descriptor. */
sizeof(HID_DeviceReportDescriptor) & 0x00FF,
((sizeof(HID_DeviceReportDescriptor) & 0xFF00) >> 8),
/* EP Descriptor: interrupt in. */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress */
EP_ISO, /* bmAttributes */
/* wMaxPacketSize */
EP2_MAX_PKT_SIZE & 0x00FF,
((EP2_MAX_PKT_SIZE & 0xFF00) >> 8),
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval */
/* EP Descriptor: interrupt out. */
LEN_ENDPOINT, /* bLength */
DESC_ENDPOINT, /* bDescriptorType */
(INT_OUT_EP_NUM | EP_OUTPUT), /* bEndpointAddress */
EP_ISO, /* bmAttributes */
/* wMaxPacketSize */
EP3_MAX_PKT_SIZE & 0x00FF,
((EP3_MAX_PKT_SIZE & 0xFF00) >> 8),
HID_DEFAULT_INT_IN_INTERVAL /* bInterval */
};
C:
void HID_Init(void)
{
/* Init setup packet buffer */
/* Buffer range for setup packet -> [0 ~ 0x7] */
USBD->STBUFSEG = SETUP_BUF_BASE;
/*****************************************************/
/* EP0 ==> control IN endpoint, address 0 */
USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0);
/* Buffer range for EP0 */
USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE);
/* EP1 ==> control OUT endpoint, address 0 */
USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0);
/* Buffer range for EP1 */
USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE);
/*****************************************************/
/* EP2 ==> Isochronous IN endpoint, address 1 */
//USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | INT_IN_EP_NUM);
USBD_CONFIG_EP(EP2, USBD_CFG_TYPE_ISO | INT_IN_EP_NUM);
/* Buffer range for EP2 */
USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE);
/* EP3 ==> Isochronous OUT endpoint, address 2 */
//USBD_CONFIG_EP(EP3, USBD_CFG_TYPE_ISO | INT_OUT_EP_NUM);
USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_IN | INT_OUT_EP_NUM);
/* Buffer range for EP3 */
USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE);
/* trigger to receive OUT data */
USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE);
}
C:
void sending_data_to_pc(void)
{
int testData[64];
int i;
for(i = 0; i < 64; i++)
{
testData[i] = i;
}
USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP2)), (void *)testData, 64);
USBD_SET_PAYLOAD_LEN(EP2, 64);
USBD_Start();
}
Gönderdiğim veriyi görebilmek için ise USB Trace isimli bir uygulama indirdim. Mikroişlemcimin USB çevresel birimini bağladığım yeri port2 olarak görüyorum. VID-PID falan uyuşuyor. Fakat veri gönderme işlemini bir türlü yapamadım. Acaba nerede hata yapıyorum ?