اطلاعیه

Collapse
No announcement yet.

مشکل ارسال و دریافت داده از شبکه CAN-

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل ارسال و دریافت داده از شبکه CAN-

    سلام من از برد آموزشی lpc1768 استفاده می کنم و متاسفانه مثالی که برای CAN نوشته شده مشکل داره و جواب نمیده یه سری کار روش انجام دادم
    1- تنظیمات پین ها درست نبود مطابق با سخت افزار اصلاح کردم ( رو برد فقط به CAN2 وصل هست)
    2- با jlink روند برنامه رو تست کردم اصلا اینتراپت مربوط به CAN فعال نمیشه (نه برای send نه برای receive)
    من برای تست از دو تا برد LPC1768 استفاده کردم. در ضمن CAN ECU رو هم متصل کردم ولی بازم جوابی نگرفتم. (و تنظیمات ID رو هم مطابق با یکی از پیام های ECU تنظیم کردم)
    میشه راهنمایی بفرمایین.

    #2
    پاسخ : مشکل ارسال و دریافت داده از شبکه CAN-

    نوشته اصلی توسط parisa.masnadi نمایش پست ها
    سلام من از برد آموزشی lpc1768 استفاده می کنم و متاسفانه مثالی که برای CAN نوشته شده مشکل داره و جواب نمیده یه سری کار روش انجام دادم
    1- تنظیمات پین ها درست نبود مطابق با سخت افزار اصلاح کردم ( رو برد فقط به CAN2 وصل هست)
    2- با jlink روند برنامه رو تست کردم اصلا اینتراپت مربوط به CAN فعال نمیشه (نه برای send نه برای receive)
    من برای تست از دو تا برد LPC1768 استفاده کردم. در ضمن CAN ECU رو هم متصل کردم ولی بازم جوابی نگرفتم. (و تنظیمات ID رو هم مطابق با یکی از پیام های ECU تنظیم کردم)
    میشه راهنمایی بفرمایین.
    مشکل میتونه از چیزای زیادی باشه
    برنامتون رو بذارین تا بررسی بشه قسمت initial و ...
    از سخت افزار هم مطمعن بشین که سیگنال از پایه میکرو خارج میشه تا ورودش به پایه میکروی دریافت کننده...
    مقاومت بار خط رو هم چک کنید...

    دیدگاه


      #3
      پاسخ : مشکل ارسال و دریافت داده از شبکه CAN-

      سلام
      من مسئله رو دوباره بررسی کردم. زمانی که فیلتر رو bypass می کنم جواب می گیرم ولی اگه accpetance filter رو فعال کنم به مشکل می خورم.
      قسمت initialize رو اینطوری تغییر دادم.

      void can_init()
      {
      LPC_CANAF->AFMR = 0x00000001; /*Acceptance Filter Mode Register = Off */
      LPC_PINCON->PINSEL0 |= (1 << 9); /* Pin P0.4 used as RD2 (CAN2) */
      LPC_PINCON->PINSEL0 |= (1 << 11); /* Pin P0.5 used as TD2 (CAN2) */
      LPC_CAN2->MOD = 1; /* Enter reset mode */
      LPC_CAN2->IER = 0; /* Disable all interrupts */
      LPC_CAN2->GSR = 0; /* Clear status register */
      LPC_CAN2->CMR = CAN_CMR_RRB | CAN_CMR_AT | CAN_CMR_CDO; /* Request command to release Rx, Tx buffer and clear data overrun */
      i = LPC_CAN2->ICR; /* Read to clear interrupt pending in interrupt capture register */

      /* Clear AF Ram region */
      for (i = 0; i < CANAF_RAM_ENTRY_NUM; i++) {
      LPC_CANAF_RAM->mask[i] = 0;
      }

      /* Reset address registers */
      LPC_CANAF->SFF_sa = 0;
      LPC_CANAF->SFF_GRP_sa = 0;
      LPC_CANAF->EFF_sa = 0;
      LPC_CANAF->EFF_GRP_sa = 0;
      LPC_CANAF->ENDofTable = 0;

      CAN_cfgBaudrate(2, 500000); /* Set bit timing CAN2 */

      LPC_CAN2->IER = 0x00000001; /* Enable Rx interrupt */

      CAN_wrFilter (2, 418, STANDARD_FORMAT); /* set ACF -ID = 418 */
      LPC_CANAF->AFMR = 0x00000004; /* Use acceptance filter */


      NVIC_EnableIRQ(CAN_IRQn); /* Enable CAN interrupt */

      LPC_CAN2->MOD = 0; /* Enter normal mode */
      }

      و acceptance filter :

      void CAN_wrFilter (uint32_t ctrl, uint32_t id, uint8_t format) {
      static int CAN_std_cnt = 0;
      static int CAN_ext_cnt = 0;
      uint32_t buf0, buf1;
      int cnt1, cnt2, bound1;

      /* Acceptance Filter Memory full */
      if ((((CAN_std_cnt + 1) >> 1) + CAN_ext_cnt) >= 512)
      return; /* error: objects full */

      /* Setup Acceptance Filter Configuration
      Acceptance Filter Mode Register = Off */
      LPC_CANAF->AFMR = 0x00000001;

      if (format == STANDARD_FORMAT) { /* Add mask for standard identifiers */
      id |= (ctrl-1) << 13; /* Add controller number */
      id |= 1 << 11; /* interrupt enable bit */
      id &= 0x0000FFFF; /* Mask out 16-bits of ID */

      /* Move all remaining extended mask entries one place up
      if new entry will increase standard ID filters list */
      if ((CAN_std_cnt & 0x0001) == 0 && CAN_ext_cnt != 0) {
      cnt1 = (CAN_std_cnt >> 1);
      bound1 = CAN_ext_cnt;
      buf0 = LPC_CANAF_RAM->mask[cnt1];
      while (bound1--) {
      cnt1++;
      buf1 = LPC_CANAF_RAM->mask[cnt1];
      LPC_CANAF_RAM->mask[cnt1] = buf0;
      buf0 = buf1;
      }
      }

      if (CAN_std_cnt == 0) { /* For entering first ID */
      LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16);
      } else if (CAN_std_cnt == 1) { /* For entering second ID */
      if ((LPC_CANAF_RAM->mask[0] >> 16) > id)
      LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16);
      else
      LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id;
      } else {
      /* Find where to insert new ID */
      cnt1 = 0;
      cnt2 = CAN_std_cnt;
      bound1 = (CAN_std_cnt - 1) >> 1;
      while (cnt1 <= bound1) { /* Loop through standard existing IDs */
      if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) {
      cnt2 = cnt1 * 2;
      break;
      }
      if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) {
      cnt2 = cnt1 * 2 + 1;
      break;
      }
      cnt1++; /* cnt1 = U32 where to insert new ID */
      } /* cnt2 = U16 where to insert new ID */

      if (cnt1 > bound1) { /* Adding ID as last entry */
      if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */
      LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16);
      else /* Odd number of IDs exists */
      LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id;
      } else {
      buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */
      if ((cnt2 & 0x0001) == 0) /* Insert new mask to even address */
      buf1 = (id << 16) | (buf0 >> 16);
      else /* Insert new mask to odd address */
      buf1 = (buf0 & 0xFFFF0000) | id;

      LPC_CANAF_RAM->mask[cnt1] = buf1; /* Insert mask */

      bound1 = CAN_std_cnt >> 1;
      /* Move all remaining standard mask entries one place up */
      while (cnt1 < bound1) {
      cnt1++;
      buf1 = LPC_CANAF_RAM->mask[cnt1];
      LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16);
      buf0 = buf1;
      }

      if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */
      LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | (0x0000FFFF);
      }
      }
      CAN_std_cnt++;
      } else { /* Add mask for extended identifiers */
      id |= (ctrl-1) << 29; /* Add controller number */

      cnt1 = ((CAN_std_cnt + 1) >> 1);
      cnt2 = 0;
      while (cnt2 < CAN_ext_cnt) { /* Loop through extended existing masks */
      if (LPC_CANAF_RAM->mask[cnt1] > id)
      break;
      cnt1++; /* cnt1 = U32 where to insert new mask */
      cnt2++;
      }

      buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */
      LPC_CANAF_RAM->mask[cnt1] = id; /* Insert mask */

      CAN_ext_cnt++;

      bound1 = CAN_ext_cnt - 1;
      /* Move all remaining extended mask entries one place up */
      while (cnt2 < bound1) {
      cnt1++;
      cnt2++;
      buf1 = LPC_CANAF_RAM->mask[cnt1];
      LPC_CANAF_RAM->mask[cnt1] = buf0;
      buf0 = buf1;
      }
      }

      /* Calculate std ID start address (buf0) and ext ID start address (buf1) */
      buf0 = ((CAN_std_cnt + 1) >> 1) << 2;
      buf1 = buf0 + (CAN_ext_cnt << 2);

      /* Setup acceptance filter pointers */
      LPC_CANAF->SFF_sa = 0x08;
      LPC_CANAF->SFF_GRP_sa = 0x08;
      LPC_CANAF->EFF_sa = 0x08;
      LPC_CANAF->EFF_GRP_sa = 0x08;
      LPC_CANAF->ENDofTable = 0x7D0;

      LPC_CANAF->FCANIE |= 1;
      }

      هر زمان که داده رو باس CAN میاد اینتراپت فعال میشه ولی FCANIC1 مقدارش صفره برای همین داده ای نمی خونه

      void CAN_IRQHandler (void) {
      volatile uint32_t icr;
      uint16_t i = 0;


      /* check CAN controller 2 */
      icr = LPC_CAN2->ICR; /* clear interrupts */

      if (icr & (1 << 0)) { /* CAN Controller #2 meassage is received */
      CAN_rdMsg (2, &CAN_RxMsg[1]); /* read the message and Release receive buffer */
      CAN_RxRdy[1] = 1; /* set receive flag */
      }

      for (i = 0; i < Full_CAN_Entry_Num; i++)
      {
      if (Chip_CAN_GetFullCANIntStatus(i)) {
      uint8_t SCC;
      Chip_CAN_FullCANReceive(i, &CAN_RxMsg[1], &SCC);
      }

      }
      }

      و

      uint32_t Chip_CAN_GetFullCANIntStatus(uint8_t ObjID)
      {
      if (ObjID < 64) {
      return (LPC_CANAF->FCANIC1 & (1 << (ObjID % 32))) ? SET : RESET;
      }
      return RESET;
      }


      /* Read FullCAN message received */
      Status Chip_CAN_FullCANReceive(uint8_t ObjID, CAN_msg *pMsg, uint8_t *pSCC) {
      uint32_t *pSrc;
      pSrc = (uint32_t *) LPC_CANAF_RAM;

      pSrc += Full_CAN_Entry_Num + ObjID * 3;
      /* If the AF hasn't finished updating msg info */
      if (((pSrc[0] >> CANAF_FULLCAN_MSG_SEM_POS) & CANAF_FULLCAN_MSG_SEM_BITMASK) !=
      CANAF_FULCAN_MSG_AF_FINISHED) {
      return ERROR;
      }

      /* Mark that CPU is handling message */
      pSrc[0] = CANAF_FULCAN_MSG_CPU_READING << CANAF_FULLCAN_MSG_SEM_POS;
      /* Read Message */
      *pSCC = (pSrc[0] >> CANAF_FULLCAN_MSG_SCC_POS) & CANAF_FULLCAN_MSG_SCC_BITMASK;
      pMsg->id = (pSrc[0] >> CANAF_FULLCAN_MSG_ID11_POS) & CANAF_FULLCAN_MSG_ID11_BITMASK;
      pMsg->type = 0;
      if (pSrc[0] & (1 << CANAF_FULLCAN_MSG_RTR_POS)) {
      pMsg->type = 1; //remote data
      }
      pMsg->len = (pSrc[0] >> CANAF_FULLCAN_MSG_DLC_POS) & CANAF_FULLCAN_MSG_DLC_BITMASK;
      ((uint32_t *) pMsg->data)[0] = pSrc[1];
      ((uint32_t *) pMsg->data)[1] = pSrc[2];

      /* Recheck message status to make sure data is not be updated while CPU is reading */
      if (((pSrc[0] >> CANAF_FULLCAN_MSG_SEM_POS) & CANAF_FULLCAN_MSG_SEM_BITMASK) !=
      CANAF_FULCAN_MSG_CPU_READING) {
      return ERROR;
      }

      return SUCCESS;
      }

      میشه لطفا راهنماییم کنین؟

      دیدگاه


        #4
        پاسخ : مشکل ارسال و دریافت داده از شبکه CAN-

        اینم جواب سوالتون:
        با سلام به همه دوستان.چون خودم خیلی گیر ارتباط سریال CAN برا LPC1768 بودم و بالاخره به کمک خدا به صورت 100 درصد نتیجه عملی گرفتم و در یک پروژه صنعتی ازش استفاده کردم فلذا تصمیم گرفتم تجاربمو در اختیار دوستان قرار بدم. با استفاده از 2 تا میکروی LPC1768 که فرستنده همون هدر بورد ساخت ECA هستش و گیرنده بورد توسعه یافته همین شرکت یا
        دقت کردین تو مهمونیا یه کیوی رو وقتی با پوست میخورین چه جور نگاتون میکنن.!!!!

        هيچگاه چيزي را خوب نمي فهمي، مگر اينكه بتواني آن را براي مادربزرگت شرح دهي!((آلبرت انيشتين))

        دیدگاه

        لطفا صبر کنید...
        X