STM32 ইউএসবি ভিসিপি বাগ


8

আমি এখন গত দু'সপ্তাহ ধরে একটি প্রকল্পে কাজ করছি এবং এই একটি ইস্যুটি ডিবাগ করে পুরো সপ্তাহে নিয়ে গেছে। ভাবছেন যে কেউ যদি সহায়তা করতে পারে তবে আমি যথাসম্ভব সুস্পষ্ট এবং পরিষ্কার হওয়ার চেষ্টা করব।

আমি STM32F302K8 (কর্টেক্স এম 4) এর উপর ভিত্তি করে একটি মাইক্রোকন্ট্রোলারে একটি ইউএসবি ভার্চুয়াল কম পোর্ট বাস্তবায়নের চেষ্টা করছি। সিডিসি ক্লাস প্রয়োগকারী একটি ইউএসবি ফুল স্পিড ডিভাইস সেটআপ করার জন্য প্রয়োজনীয় কোড উত্পন্ন করতে আমি STM32CubMX ব্যবহার করেছি। আমার ডিভাইস উইন্ডোজ (ডিভাইস ম্যানেজার) এবং লিনাক্স উভয় ক্ষেত্রেই প্রদর্শিত হবে। আমি উদাহরণ কোডের উপর ভিত্তি করে একটি সাধারণ প্রতিধ্বনি ফাংশন বাস্তবায়ন করতে সক্ষম হয়েছি কিন্তু এখন আমি পিসিতে ডেটা প্রেরণের জন্য ইউএসবিডি_সিডিসি_সেটটিএক্সবার্ফারশনটি ব্যবহার করার চেষ্টা করি , এটি একটি হার্ড ফল্ট হ্যান্ডলারটি সেট করে। আমি এটিকে সংকুচিত করে দিয়েছি যে ইউএসডিডিওয়াইএসএফ.পি.ক্লাস (যা ইউএসডিডি_সিডিসি_সেটটেক্সবার্ফার দ্বারা প্রয়োজন) ক্ষেত্রটি কখনই আরম্ভ হয় না কারণ ইউএসবি ডি_সিডিসি_আইনাইট () ইউএসবি ডিভাইসটির সূচনাতে কখনই ডাকা হয় না।

এসটি ফোরামে নথিভুক্ত উদাহরণ কোড হিসাবে আমি বেশ কয়েকটি বাগে (হিপ আকার পরিবর্তন, ইউএসবিডি_সিডিসি_ট্রান্সমিট প্যাকেটে সংক্রমণ পতাকা সংশোধন এবং সিডিসি_ডাটা_এইচএক্সএএমএসিএপিএসএসিইএসসিআইজি আকারটি 256 থেকে 256 এ পরিবর্তন সহ) প্রয়োগ করেছি তবে এখনও একই ত্রুটি পেয়েছি।

আমার ডিভাইসের সেটআপ কোডটি

* USB Device Core handle declaration */
USBD_HandleTypeDef hUsbDeviceFS;

/* init function */                    
void MX_USB_DEVICE_Init(void)
{
  /* Init Device Library,Add Supported Class and Start the library*/
  USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS);

  USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC);

  USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS);

  USBD_Start(&hUsbDeviceFS);

}

আমি সর্বশেষে কোনও এসটিএম-তে ইউএসবি নিয়ে কাজ করার পরে কিছুক্ষণ হয়ে গেছে, তবে আমি মনে করি ইউএসবিডি_সিডিসি_ইনিত () একটি মলোক করার চেষ্টা করে। সমস্যাটি হ'ল ডিফল্ট সেটআপে হিপগুলিতে পর্যাপ্ত জায়গা নেই এবং আপনার এটি বাড়ানো দরকার।
26:44

হাই, আমি স্তূপের আকার 0x600 এ বৃদ্ধি করেছি এবং কিছুই ঘটছে না। কোন ফাংশনটি মলোককে কল করে কারণ যখন আমি এটিতে ব্রেকপয়েন্ট রাখি তখন এটি কখনই ডাকা হয় না বলে মনে হয়।
গ্যালাক্সি

উত্তর:


6

আমার নিজের প্রশ্নের উত্তর দিতে, সমস্যাটি হ'ল আমার কোডটি ইউএসবি'র আরম্ভের জন্য অপেক্ষা না করে অবিলম্বে ডেটা প্রেরণ শুরু করে। কোনও বুলিয়ানটিতে সক্রিয় অপেক্ষা সন্নিবেশ করা বা একটি বিলম্ব (@ রামেজ দ্বারা চিহ্নিত হিসাবে) যুক্ত করা সমস্যার সমাধান করে।

আপডেট আপডেট এসটি থেকে পরবর্তী ইউএসডি সিডিসি ড্রাইভার সংস্করণে এই বাগটি ঠিক করা হয়েছে। সেটআপটিতে এখন একটি HAL_Delay রয়েছে। ক্যাভেটটি হ'ল যদি কোনও কারণে সিসটিক কাজ না করে / নিষ্ক্রিয় হয় / এখনও আরম্ভ হয় না, তবে আপনার কোডটি স্তব্ধ হয়ে যাবে।


1
হ্যাঁ, আপনার এটি আলাদা প্রশ্ন হিসাবে পোস্ট করা উচিত। এই প্রশ্নের উত্তরে কেবলমাত্র মূল প্রশ্নের জন্য প্রাসঙ্গিক তথ্য রাখুন।
এম.আলিন

2

আমি STM32F4 আবিষ্কারের জন্য কোড উত্পন্ন করার জন্য কিউবিএমএক্স ব্যবহার করেছি। আমি এটিকে আপনার মতো ভার্চুয়াল সিওএম বন্দর হিসাবে ব্যবহার করেছি। আমি সরাসরি ইউএসবিডি_সিডিসি_সেটটেক্সবার্ফার () ফাংশনটি ব্যবহার করি নি । ইন usbd_cdc_if.c ফাইল নামে একটি ফাংশন আছে CDC_Transmit_FS () । উত্পন্ন কোডটিতে একটি ত্রুটি ছিল, ফাংশনটি প্যারামিটার হিসাবে একটি বাফার নিয়েছে এবং এটি এটি দিয়ে কিছুই করেনি। সংশোধন ফাংশন কোডটি নিম্নলিখিত:

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
  uint8_t result = USBD_OK;
  memcpy(UserTxBufferFS, Buf, sizeof(char) * Len);
  USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, Len);   
  result = USBD_CDC_TransmitPacket(hUsbDevice_0);
  return result;
}

আসলে আমাকে কোডটিতে মেমকিটি যুক্ত করতে হয়েছিল। এই সংশোধন করার পরে আমি এই সংক্রমণ ফাংশনটি দিয়ে মাইক্রোকোট্রোলার থেকে পিসিতে ডেটা প্রেরণ করতে পারি। উদাহরণ স্বরূপ:

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USB_DEVICE_Init();
  configureGPIOs();

  uint8_t Buf[] = "Test";

  HAL_Delay(1000);

  while (1)
  {
      CDC_Transmit_FS(Buf, 4);
      HAL_Delay(1000);
  }
}

MX_USB_DEVICE_Init () এর ইনিটালাইজেশন আপনার কাছে আমার মতো।


1
ধন্যবাদ রামেজ আমি সমস্যাটি খুঁজে পেয়েছি, ভার্চুয়াল কম পোর্টটি আরম্ভকরণ শেষ করেছে কিনা তা পরীক্ষা করে দেখতে হয়েছিল, আমি সিডিসি_আইনিট_এফএসে একটি বুলিয়ান ব্যবহার করেছি যা সিডিসি ট্রান্সমিট_এফএস বলার আগে মূল লুপটি সত্য হতে অপেক্ষা করেছিল। আমি মনে করি আপনার কোডের HAL_DELAY একই প্রভাব অর্জন করবে। সাহায্যের জন্য আপনাকে ধন্যবাদ।
গ্যালাক্সি

1

প্রথমে, পরীক্ষা করুন যে এইচএসবি ডিভাইসটি টি নাল (আপনার সমাধানে উপাদান অনুপস্থিত) রয়েছে:

    if (hUsbDevice_0 == NULL)
            return USBD_FAIL;

এটি আপনার ইউসিটিকে ফাঁসানো থেকে আটকাবে এবং বিলম্বের জন্য অপেক্ষা করতে ব্যস্ততার প্রয়োজন হবে না।

আপনি এটি কোথাও সিডিসি_ট্রান্সমিট_এফএসে রাখতে পারেন:

USBD_StatusTypeDef CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) {

    if (hUsbDevice_0 == NULL)
        return USBD_FAIL;

    USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) hUsbDevice_0->pClassData;

    if (hcdc->TxState != 0)
        return USBD_BUSY;

    uint8_t result = USBD_OK;

    USBD_CDC_SetTxBuffer(hUsbDevice_0, Buf, Len);
    result = USBD_CDC_TransmitPacket(hUsbDevice_0);

    return result;
}

0

আমার একই সমস্যা ছিল তবে এটি কেবলমাত্র আমার কাছে করা দরকার তা হল কম্পিউটারে ইউএসবি সংযোগটি পুনরায় প্লাগ করা। বেশিরভাগ সময় আপনি কোডটি ফ্ল্যাশ করেন এবং মাইক্রোকন্ট্রোলারটিকে পুনরায় সেট করুন তবে পিসি দিকে অঙ্কটি আপডেট হয় না not হোস্ট আপনার ডিভাইসটি তদন্ত করতে শুরু করলে USBD_CDC_Init বলা হয় এবং এজন্যই পিসিডসডাটা নাল হয়।


1
আপনি সফ্টওয়্যারটিতে পুনরায় গণনা জোর করতে পারেন। পুনরায় প্লাগিংয়ের পরে দ্বিতীয়
দুর্বলতম উপায়টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.