اطلاعیه

Collapse
No announcement yet.

CRC Engine در LPC1788 : کمک کنین لطفا

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

    CRC Engine در LPC1788 : کمک کنین لطفا

    سلام
    دوستان تابحال کسی با این خاصیت CRC در LPC1788 کار کرده؟؟
    من میخوام به یک کد چند بیتی ، یک کد CRC 16 بیتی اضافه کنم و از طریق پورت UART3 بفرستم.ممنون میشم راهنماییم کنین(قسمت UART رو بیشترش رو میدونم)

    #2
    پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

    شما از ارتباط مدباس دارید استفاده می کنید؟ این CRC رو برای اون می خواین؟

    دیدگاه


      #3
      پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا


      کد:
      /****************************************************************
      *      CRC init											*/
      LPC_CRC->MODE=0x00000015;
      LPC_CRC->SEED=0xFFFF;								
      /****************************************************************/
      /*						Generate CRC					 	*/										  																				
      uint16_t CRC_Gen(uint8_t frame_len, uint8_t Modbus_frame[])
      {
      uint8_t i;
      CRC=0xffff;
      LPC_CRC->SEED=0xFFFF;
      	for(i=0; i<=frame_len; i++)
      	{
      				LPC_CRC->WR_DATA_BYTE.DATA =Modbus_frame[i];
      				CRC=(uint16_t)LPC_CRC->SUM; 
      	}   
      	Modbus_frame[i]=(uint8_t)CRC;  // LOW  CRC
      	Modbus_frame[i+1]=CRC>>8;    // HIGH CRC
      	return CRC;
         
      };
      از جمله ی رفتگان این راه دراز
      باز آمده ای کو که به ما گوید راز
      هان بر سر این دو راهه از روی نیاز
      چیزی نگذاری که نمی آیی باز

      دیدگاه


        #4
        پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

        نوشته اصلی توسط meerkat
        کد:
        /****************************************************************
        *      CRC init											*/
        LPC_CRC->MODE=0x00000015;
        LPC_CRC->SEED=0xFFFF;								
        /****************************************************************/
        /*						Generate CRC					 	*/										  																				
        uint16_t CRC_Gen(uint8_t frame_len, uint8_t Modbus_frame[])
        {
        uint8_t i;
        CRC=0xffff;
        LPC_CRC->SEED=0xFFFF;
        	for(i=0; i<=frame_len; i++)
        	{
        				LPC_CRC->WR_DATA_BYTE.DATA =Modbus_frame[i];
        				CRC=(uint16_t)LPC_CRC->SUM; 
        	}   
        	Modbus_frame[i]=(uint8_t)CRC;  // LOW  CRC
        	Modbus_frame[i+1]=CRC>>8;    // HIGH CRC
        	return CRC;
           
        };
        خیلی ممنون دوست عزیز
        یه توضیح کوچیک میشه بدین راجبش؟؟(از حلقه for به بعدش رو اگه میشه یه توضیح بدین)
        این کدی که نوشتین CRC 16بیتی رو واسه هر بایت مجزا تولید میکنه ؟؟؟؟
        چه هدری رو باید include کنم؟؟؟
        مرسی

        دیدگاه


          #5
          پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

          نوشته اصلی توسط mehdia1968
          خیلی ممنون دوست عزیز
          یه توضیح کوچیک میشه بدین راجبش؟؟
          این کدی که نوشتین CRC 16بیتی رو واسه هر بایت مجزا تولید میکنه ؟؟؟؟
          چه هدری رو باید include کنم؟؟؟
          مرسی
          شما یه نگاهِ مِلو به کامنت ها بنداز :

          CRC init یعنی crcr initial (راه اندازی اولیه ) در ابتدای برنامه گذاشته میشه

          Generate CRC
          تولید crc پارامتر های که به فانکشن پاس میشن packet و len هست
          پس با توجه به len تک تک نیست !

          نباید که بایت به بایت crc بگیری بعد بایت به بایت هم ارسال کنی (با while اونم!)(اصلا به آدم فشار میاد )
          پکت رو آمده میکنی crc هم میگری بایت اول رو میفرستی بقیه بایت ها خودشون
          مثل بچه آدم تو اینتراپت tx ارسال میشن (نه اینکه خود جوش شما یه 2 خوط کد میزاری اونجا)

          یادم رفت با کال کردن فانکشن کد crc (خود جوش ) سر جاش گذاشته میشه .
          مقدار ریترن پشنه

          برای مانیتور با پی سی برنامه modbusMAt هست گوگل کن بهت میگه که پکت crc-یش درست هست یا نه
          از جمله ی رفتگان این راه دراز
          باز آمده ای کو که به ما گوید راز
          هان بر سر این دو راهه از روی نیاز
          چیزی نگذاری که نمی آیی باز

          دیدگاه


            #6
            پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

            نوشته اصلی توسط meerkat
            شما یه نگاهِ مِلو به کامنت ها بنداز :

            CRC init یعنی crcr initial (راه اندازی اولیه ) در ابتدای برنامه گذاشته میشه

            Generate CRC
            تولید crc پارامتر های که به فانکشن پاس میشن packet و len هست
            پس با توجه به len تک تک نیست !

            نباید که بایت به بایت crc بگیری بعد بایت به بایت هم ارسال کنی (با while اونم!)(اصلا به آدم فشار میاد )
            پکت رو آمده میکنی crc هم میگری بایت اول رو میفرستی بقیه بایت ها خودشون
            مثل بچه آدم تو اینتراپت tx ارسال میشن (نه اینکه خود جوش شما یه 2 خوط کد میزاری اونجا)

            یادم رفت با کال کردن فانکشن کد crc (خود جوش ) سر جاش گذاشته میشه .
            مقدار ریترن پشنه

            برای مانیتور با پی سی برنامه modbusMAt هست گوگل کن بهت میگه که پکت crc-یش درست هست یا نه
            خیلی ممنون.از for به بعدش رو دیرفهمم و نمیگیرم که چی میشه :cry:
            تو برنامه شما مقدار SEED=0xFFFF گذاشته شده ولی تو مثال خود keil تو تابع Init این مقدار 0x0000 گذاشته شده.فرقش چیه؟؟

            دیدگاه


              #7
              پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

              نوشته اصلی توسط mehdia1968
              خیلی ممنون.از for به بعدش رو دیرفهمم و نمیگیرم که چی میشه :cry:
              بعد for مقدار crc به انتهای پکتی که شما به فانکشن پاس کردی چسبونده میشه .

              تو برنامه شما مقدار SEED=0xFFFF گذاشته شده ولی تو مثال خود keil تو تابع Init این مقدار 0x0000 گذاشته شده.فرقش چیه؟؟
              آره دیدم تو cmsis هم چک کردم دیدم با 0 اینیشیال میکنه
              ولی اون موقعی که ff گزاشتم از اینجا دیدم:
              http://www.nongnu.org/avr-libc/user-...util__crc.html

              و با 0 درست جواب نمیده !
              از جمله ی رفتگان این راه دراز
              باز آمده ای کو که به ما گوید راز
              هان بر سر این دو راهه از روی نیاز
              چیزی نگذاری که نمی آیی باز

              دیدگاه


                #8
                پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                نوشته اصلی توسط meerkat
                بعد for مقدار crc به انتهای پکتی که شما به فانکشن پاس کردی چسبونده میشه .

                آره دیدم تو cmsis هم چک کردم دیدم با 0 اینیشیال میکنه
                ولی اون موقعی که ff گزاشتم از اینجا دیدم:
                http://www.nongnu.org/avr-libc/user-...util__crc.html

                و با 0 درست جواب نمیده !
                بازم ممنون
                فقط یه مشکل پایه خوردم و قاطی کردم :angry:
                الان من باید frame_len رو واسه 104 بیت دیتا (2 تا 16 بیتی و 3تا 24 بیتی که در مجموع داخل 5 خونه از یک آرایه uint32_t ذخیره کردم و میخوام واسه مجموعه این 104 بیت ، یک کد CRC بگیرم) ، چی بزارم؟؟ :angry:

                دیدگاه


                  #9
                  پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                  به تعداد بایت ها len بده
                  از جمله ی رفتگان این راه دراز
                  باز آمده ای کو که به ما گوید راز
                  هان بر سر این دو راهه از روی نیاز
                  چیزی نگذاری که نمی آیی باز

                  دیدگاه


                    #10
                    پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                    نوشته اصلی توسط meerkat
                    بعد for مقدار crc به انتهای پکتی که شما به فانکشن پاس کردی چسبونده میشه .

                    آره دیدم تو cmsis هم چک کردم دیدم با 0 اینیشیال میکنه
                    ولی اون موقعی که ff گزاشتم از اینجا دیدم:
                    http://www.nongnu.org/avr-libc/user-...util__crc.html

                    و با 0 درست جواب نمیده !
                    خب 2 نوع CRC-16 داره. یکی CRC-16 و یکی CRC-16CCITT . من نوع if دوم این تابع مد نظرمه.باید 0xFFFF بزارم یا همون 0x0000 ؟؟؟
                    کد:
                    void CRC_Init(CRC_Type CRCType)
                    {
                    	if(CRCType == CRC_POLY_CRCCCITT)
                    	{
                    		LPC_CRC->MODE = 0x00;
                    		LPC_CRC->SEED = 0xFFFF;
                    		crc_cur_type = CRC_POLY_CRCCCITT;
                    	}
                    	else if(CRCType == CRC_POLY_CRC16)
                    	{
                    		LPC_CRC->MODE = 0x15;
                    		LPC_CRC->SEED = 0x0000;
                    		crc_cur_type = CRC_POLY_CRC16;
                    
                    	}
                    	else if(CRCType == CRC_POLY_CRC32)
                    	{
                    		LPC_CRC->MODE = 0x36;
                    		LPC_CRC->SEED = 0xFFFFFFFF;
                    		crc_cur_type = CRC_POLY_CRC32;
                    	}
                    	else
                    	{
                    		//Invalid input parameter
                    		while(1);//error loop
                    	}
                    }

                    دیدگاه


                      #11
                      پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                      کدی که گزاشتم برای مدباس استفاده شده .
                      برای کانفیگ دیگه طبق یوزر منوال عمل کنید .
                      از جمله ی رفتگان این راه دراز
                      باز آمده ای کو که به ما گوید راز
                      هان بر سر این دو راهه از روی نیاز
                      چیزی نگذاری که نمی آیی باز

                      دیدگاه


                        #12
                        پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                        نوشته اصلی توسط meerkat
                        به تعداد بایت ها len بده
                        من قاطی کردم :cry:
                        الان این CRC-16 بیتی طبق LPC_CRC->WR_DATA_BYTE.DATA و یا LPC_CRC->WR_DATA_WORD.DATA نمیتونه کد 24 بیتی رو بگیره؟؟؟ :sad:
                        یعنی من برای گرفن کد CRC از این 5 دیتا کنار هم که هم 16 بیتی هستن و هم 24 بیتی باید چیکار کنم؟؟ :angry: :angry:

                        دیدگاه


                          #13
                          پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                          فک کنم فهمیدم.
                          از این حالت LPC_CRC->WR_DATA_BYTE.DATA باید استفاده کنم و هر 8 بیت رو جدا کنم و بهش بدم و آخر(بعد از دادن 104 بیت=13 بایت) مقدار LPC_CRC->SUM رو به صورت uint16_t بخونم که همون کد CRC 16 بیتیه که میخوام.درسته؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

                          دیدگاه


                            #14
                            پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                            سلام
                            اگه میخواین کار ساده بشه از LUT استفاده کنین.
                            اگر برای مد باس می خواین ببگین که بزارم. :cry2:
                            The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                            دیدگاه


                              #15
                              پاسخ : CRC Engine در LPC1788 : کمک کنین لطفا

                              نوشته اصلی توسط hessam2013
                              سلام
                              اگه میخواین کار ساده بشه از LUT استفاده کنین.
                              اگر برای مد باس می خواین ببگین که بزارم. :cry2:
                              LUT چیه؟؟ :cry: :angry: :angry:
                              ممنون میشم مدباس رو بزارین

                              دیدگاه

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