Драйвер для usb взять из кубика
я работаю в режиме хоста, в роли девайса выступает устройство, на котором стоит atmel+камера, и гонится картинка по usb
Изначально работал в режиме FS и не испытывал никаких проблем
Решили, что нужно HS, сделали новую плату, usb физику использовали 3320
И теперь появились проблемы при передаче, выражаются они вот в чем:
В какой-то момент я не могу получить пакет от девайса
Причем, в callback я изменяю статус о том, что данные приняты, и в функции по отправке я жду появление данного статуса
И в какой то момент функция зависает в ожидании статуса.
То есть callback даже не вызывается, и следовательно прерывание по приему тоже не происходит
Может кто сталкивался с такой проблемой?Или проблема в самом девайсе?
CODE
int write_and_read(
USBH_HandleTypeDef *d,
void *rx_buff, size_t rx_buff_size,
void *tx_buff, size_t tx_buff_size) {
status = 0x0;
status_rx = 0x0;
SCB_CleanInvalidateDCache();
int r = write(d, tx_buff, tx_buff_size, true);
if (r < PB_PVS_SUCCESS)
return r;
timer_start(&timer_usb, 50);
while((!(timer_check(&timer_usb)) == TIMER_STATE_TIMEOUT)) {
if(status)
break;
};
if(!status)
return PB_PVS_ERROR_LIBUSB;
r = read(d, rx_buff, rx_buff_size, true);
SCB_CleanInvalidateDCache();
if (r < PB_PVS_SUCCESS) {
debug("read_error");
return r;
}
timer_start(&timer_usb, 50);
while(!(status_rx)) {
//в данном месте висит функция
};
return PB_PVS_SUCCESS;
};
int write(
USBH_HandleTypeDef *d, void *buff, size_t buff_size,
const bool pack) {
uint8_t *data = (uint8_t *)buff;
int res = PB_PVS_SUCCESS;
USBH_PVS_Stop(d);
const int r_usb = USBH_PVS_Transmit(d, data, buff_size);
if(r_usb != USBH_OK)
res = PB_PVS_ERROR_LIBUSB;
return res;
}
int read(
USBH_HandleTypeDef *d, void *buff, size_t buff_size,
const bool unpack) {
int res;
uint8_t *data = (uint8_t *)buff;
USBH_PVS_Stop(d);
const int r_usb = USBH_PVS_Receive(d, data, buff_size);
if(!r_usb) {
res = PB_PVS_SUCCESS;
}
if (r_usb != USBH_OK) {
res = PB_PVS_ERROR_LIBUSB;
}
return res;
}
USBH_HandleTypeDef *d,
void *rx_buff, size_t rx_buff_size,
void *tx_buff, size_t tx_buff_size) {
status = 0x0;
status_rx = 0x0;
SCB_CleanInvalidateDCache();
int r = write(d, tx_buff, tx_buff_size, true);
if (r < PB_PVS_SUCCESS)
return r;
timer_start(&timer_usb, 50);
while((!(timer_check(&timer_usb)) == TIMER_STATE_TIMEOUT)) {
if(status)
break;
};
if(!status)
return PB_PVS_ERROR_LIBUSB;
r = read(d, rx_buff, rx_buff_size, true);
SCB_CleanInvalidateDCache();
if (r < PB_PVS_SUCCESS) {
debug("read_error");
return r;
}
timer_start(&timer_usb, 50);
while(!(status_rx)) {
//в данном месте висит функция
};
return PB_PVS_SUCCESS;
};
int write(
USBH_HandleTypeDef *d, void *buff, size_t buff_size,
const bool pack) {
uint8_t *data = (uint8_t *)buff;
int res = PB_PVS_SUCCESS;
USBH_PVS_Stop(d);
const int r_usb = USBH_PVS_Transmit(d, data, buff_size);
if(r_usb != USBH_OK)
res = PB_PVS_ERROR_LIBUSB;
return res;
}
int read(
USBH_HandleTypeDef *d, void *buff, size_t buff_size,
const bool unpack) {
int res;
uint8_t *data = (uint8_t *)buff;
USBH_PVS_Stop(d);
const int r_usb = USBH_PVS_Receive(d, data, buff_size);
if(!r_usb) {
res = PB_PVS_SUCCESS;
}
if (r_usb != USBH_OK) {
res = PB_PVS_ERROR_LIBUSB;
}
return res;
}