اطلاعیه

Collapse
No announcement yet.

مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

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

    #16
    پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

    به عنوان مثال تو تابع خوندن یک page باید طول آدرس ارسال بشه 2 :
    کد:
    rxsetup.tx_length = 2;
    آرگومان آدرس هم 16 بیتی بشه :
    کد:
    int8_t HT24LC_PageRd(LPC_I2C_TypeDef *I2Cx,uint8_t HT24LC_ADDR,uint16_t pgaddr,void *data)
    و یه tayp casting به 8 بیت روی آدرس انجام بشه و بعد پاس بشه:
    کد:
    rxsetup.tx_data =(uint8_t *)&addr;// Get address to read at writing address
    ولی این یه مشکلی داره احتمالا این که اول بایت کم ارزش آدرس و بعد بایت بعدی اون رو ارسال میکنه، در حالی که باید برعکس باشه. یکم خودتون روش کار کنید من حافظه ای با این حجم ندارم که تست کنم.

    دیدگاه


      #17
      پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

      rxsetup.tx_data =(uint8_t *)&addr;// Get address to read at writing address
      درسته اول باید بایت پر ارزش فرستاده بشه.
      مثلا اینجوری :
      کد:
      HAddr = (addr & 0xff00) >> 8;
      LAddr = (addr & 0x00ff);
      درست میگم ؟ :question:

      دیدگاه


        #18
        پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

        راستی یادم رفت که ازتون تشکر کنم. چون شبکه بندیشو هم جواب گرفتم.

        آدرس eeprom دوم رو باید 81 باشه یا اینجوری :
        کد:
        #define HT24LC_SLVADDR		(0xA0>>1)
        #define HT24LC_SLVADDR_1	(0xA2>>1)
        که اولی آدرس eeprom اولی و دومین آدرس، آدرس eeprom دومیه که بابر 81 ه.

        eeprom اولی باید سه پایه A0,A1,A2 به زمین و eeprom دومی هم پین A0 به vcc و بقیه به زمین. بعد به راحتی با آدرس دهی میشه روی یه باس شبکه بندیشون کرد.

        اینم نمونه برنامش :

        کد:
        for(i=0;i<16;i++,t2++){
        		HT24LC_ByteWr(I2CDEV_M,HT24LC_SLVADDR,i,&t2);
        		_delay(10);
        	}
        	t2=0;
        	for(i=0;i<16;i++,t2++){
        		HT24LC_ByteWr(I2CDEV_M,HT24LC_SLVADDR_1,i,&t2);
        		_delay(10);
        	}
        	
        	
        	lcd_init();
        	lcd_clear();
        	lcd_gotoxy(1,3);
        	lcd_putsf("I2C Example");
        
        	_delay(1000);
        
        	lcd_gotoxy(2,1);
        	for(i=0;i<16;i++){
        		//buf[i] = Master_Buf[i];
        		//sprintf(buf,"Data= %d",Master_Buf[i]);
        		HT24LC_ByteRd(I2CDEV_M,HT24LC_SLVADDR,i,&t1);
        		sprintf(buf,"Data= %d",t1);
        		lcd_gotoxy(2,1);
        		lcd_putsf("        ");
        		lcd_gotoxy(2,1);
        		lcd_putsf(buf);
        		_delay(400);
        	}
        	
        	for(i=0;i<16;i++){
        		//buf[i] = Master_Buf[i];
        		//sprintf(buf,"Data= %d",Master_Buf[i]);
        		HT24LC_ByteRd(I2CDEV_M,HT24LC_SLVADDR_1,i,&t1);
        		sprintf(buf,"Data= %d",t1);
        		lcd_gotoxy(2,1);
        		lcd_putsf("        ");
        		lcd_gotoxy(2,1);
        		lcd_putsf(buf);
        		_delay(400);
        	}
        	
        	
        	I2C_DeInit(I2CDEV_M);

        دیدگاه


          #19
          پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

          رسته اول باید بایت پر ارزش فرستاده بشه.
          مثلا اینجوری :
          کد: [انتخاب]

          HAddr = (addr & 0xff00) >> 8;
          LAddr = (addr & 0x00ff);


          درست میگم ؟ :question:
          خوب الان ما با این چیکار کنیم!؟

          باید جای بایت بالا و پایین رو با هم عوض کنید برای اینکار از تابع زیر استفاده کنید:
          کد:
          void swap(uint8_t *x)
          {
          	uint8_t y;
          	
          	y=x[1];
          	x[1]=x[0];
          	x[0]=y;
          }
          و بعد به صورت با استفاده از ابن تابع به صورت زیر جای دوبایت آدرس رو با هم عوض کنید:
          کد:
          swap((uint8_t *)&addr);

          دیدگاه


            #20
            پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

            این کتابخونه برا 24C02 جواب داد.ولی برا 24C32 جواب نداد. آدرس سخت افزاری دوتاشون یکیه. پس چرا جواب نمیده ؟

            دیدگاه


              #21
              پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

              کارایی که گفتم رو انجام دادید؟ اگه میشه تابعی که برای نوشتن و خوندن از 24lc32 استفاده کردید رو بزارید تا یه بررسی با هم بکنیم.

              دیدگاه


                #22
                پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                آره کارایی که گفتین رو انجام دادم. تبدیل متغیر 8 بیتی آدرس به متغیر 16 بیتی. swap آدرس و ... .
                این دو تابع نوشتن و خواندن بایتی :

                یه ایرادی که این تابع داره که متغیر wrdata هشت بیتیه و وقتی آدرس pgaddr رو 16 بیتی میکنیم، هشدار میده و بعد جواب نمیده، حتی با کستینگ هم جواب نمیده. نحوه آدرس دهی 24C32 رو که تو دیتاشیتش خوندم، بعد از فرستادن device addr باید بایت پرارزش آدرس و سپس کم ارزش آدرس بفرستیم. که در اصل نیاز به دو بایت داره ولی متغیر wrdata یه آرایه 8 بیتی و اندیس صفرشه که آدرسو در خودش ذخیره می کنه.

                کد:
                int8_t HT24LC_ByteWr(LPC_I2C_TypeDef *I2Cx,uint8_t HT24LC_ADDR,uint16_t pgaddr,void *data)
                {
                	/* Transmit setup */
                	I2C_M_SETUP_Type txsetup;
                	uint8_t wrdata[9-7],*dp,i,offset=8-7;
                	uint32_t tmp;
                	
                	wrdata[0]=offset+pgaddr*offset;
                	
                	dp=(uint8_t *)data;
                	for(i=0;i<8-7;i++)
                		wrdata[i+1]=dp[i];
                	
                	txsetup.sl_addr7bit = HT24LC_ADDR;
                	txsetup.tx_data = wrdata;
                	txsetup.tx_length = sizeof(wrdata);
                	txsetup.rx_data = NULL;
                	txsetup.rx_length = 0;
                	txsetup.retransmissions_max = 3;
                
                	if (I2C_MasterTransferData(I2Cx, &txsetup, I2C_TRANSFER_POLLING) == SUCCESS){
                		for (tmp = 0x100000; tmp; tmp--);
                		return (0);
                	} else {
                		return (-1);
                	}
                }////////////////End EEPROM Byte Write Function///////////////////////////////////////////////
                
                ////////////////EEPROM Byte Read Function///////////////////////////////////////////////
                int8_t HT24LC_ByteRd(LPC_I2C_TypeDef *I2Cx,uint8_t HT24LC_ADDR,uint16_t pgaddr,void *data)
                {
                	/* Receive setup */
                	I2C_M_SETUP_Type rxsetup;
                	uint8_t rddata[8-7],*dp,offset=8-7,addr;
                	
                	addr=offset+pgaddr*offset;
                	dp=(uint8_t *)data;
                	
                	rxsetup.sl_addr7bit = HT24LC_ADDR;
                	rxsetup.tx_data = &addr;// Get address to read at writing address
                	rxsetup.tx_length = 1;
                	rxsetup.rx_data = dp;
                	rxsetup.rx_length = sizeof(rddata);
                	rxsetup.retransmissions_max = 3;
                
                	if (I2C_MasterTransferData(I2Cx, &rxsetup, I2C_TRANSFER_POLLING) == SUCCESS){
                		return (0);
                	} else {
                		return (-1);
                	}
                }////////////////End EEPROM Byte Read Function///////////////////////////////////////////////
                اینم زیر برنامه نوشتن در eeprom در تابع main که جواب نمیده :
                کد:
                for(i=0;i<16;i++,t2++){
                		//haddr=(i & 0xff00)>>8;
                		//laddr=(i & 0x00ff);
                		//swap((uint8_t *)&i);
                		HT24LC_ByteWr(I2CDEV_M,HT24LC_SLVADDR,i,&t2);
                		_delay(10);
                	}

                دیدگاه


                  #23
                  پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                  اینا رو یه تست کنید:
                  کد:
                  ////////////////EEPROM Byte Write Function///////////////////////////////////////////////
                  int8_t HT24LC_ByteWr(LPC_I2C_TypeDef *I2Cx,uint8_t HT24LC_ADDR,uint16_t ByAddr,void *data)
                  {
                  	/* Transmit setup */
                  	I2C_M_SETUP_Type txsetup;
                  	uint8_t wrdata[9-7+1],*dp,i;
                  	uint32_t tmp;
                  	uint16_t addr,offset=8-7;
                  	
                  	addr=offset+ByAddr*offset;
                  	wrdata[0]=(uint8_t)(addr>>8);
                  	wrdata[1]=(uint8_t)(addr);
                  	
                  	dp=(uint8_t *)data;
                  	for(i=0;i<8-7;i++)
                  		wrdata[i+1+1]=dp[i];
                  	
                  	txsetup.sl_addr7bit = HT24LC_ADDR;
                  	txsetup.tx_data = wrdata;
                  	txsetup.tx_length = sizeof(wrdata);
                  	txsetup.rx_data = NULL;
                  	txsetup.rx_length = 0;
                  	txsetup.retransmissions_max = 3;
                  
                  	if (I2C_MasterTransferData(I2Cx, &txsetup, I2C_TRANSFER_POLLING) == SUCCESS){
                  		for (tmp = 0x100000; tmp; tmp--);
                  		return (0);
                  	} else {
                  		return (-1);
                  	}
                  }////////////////End EEPROM Byte Write Function///////////////////////////////////////////////
                  
                  ////////////////EEPROM Byte Read Function///////////////////////////////////////////////
                  int8_t HT24LC_ByteRd(LPC_I2C_TypeDef *I2Cx,uint8_t HT24LC_ADDR,uint16_t ByAddr,void *data)
                  {
                  	/* Receive setup */
                  	I2C_M_SETUP_Type rxsetup;
                  	uint8_t wrdata[2],rddata[8-7],*dp;
                  	uint16_t addr,offset=8-7;
                  	
                  	addr=offset+ByAddr*offset;
                  	wrdata[0]=(uint8_t)(addr>>8);
                  	wrdata[1]=(uint8_t)(addr);
                  	
                  	dp=(uint8_t *)data;
                  	
                  	rxsetup.sl_addr7bit = HT24LC_ADDR;
                  	rxsetup.tx_data = wrdata;// Get address to read at writing address
                  	rxsetup.tx_length = sizeof(wrdata);
                  	rxsetup.rx_data = dp;
                  	rxsetup.rx_length = sizeof(rddata);
                  	rxsetup.retransmissions_max = 3;
                  
                  	if (I2C_MasterTransferData(I2Cx, &rxsetup, I2C_TRANSFER_POLLING) == SUCCESS){
                  		return (0);
                  	} else {
                  		return (-1);
                  	}
                  }////////////////End EEPROM Byte Read Function///////////////////////////////////////////////
                  [code\]

                  دیدگاه


                    #24
                    پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                    مجتبی جان ممنون جواب گرفتم. فقط 256 بایت مینویسه. یعنی از 0 تا 255 مینویسه ولی بعد ریست میشه .

                    فکر کنم مشکلش اینه که یک بایت آدرسو برا eeprom میفرسته :

                    کد:
                    wrdata[0]=(uint8_t)(addr>>8);
                    	wrdata[1]=(uint8_t)(addr);
                    فکر کنم مشکل از این خطه البته من که نتونستم جواب بگیرم.

                    دیدگاه


                      #25
                      پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                      جای اون دو تا اینا رو بزارید یه تست بکنید :
                      کد:
                      wrdata[0]=(uint8_t)((addr&0X0F00)>>8));
                      wrdata[1]=(uint8_t)(addr&0X00FF);

                      دیدگاه


                        #26
                        پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                        مجتبی جان همون مشکل قبلی رو داره. تا 256 میره ریست میکنه.

                        دیدگاه


                          #27
                          پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                          شرمنده چیزی به ذهنم خطور نمیکنه، خودم حتما یسری از این EEPROM میگیرم تست میکنم شما هم اگه به جواب رسیدید ممنون میشم من رو هم مطلع کنید.

                          دیدگاه


                            #28
                            پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                            ممنون. روش کار میکنم حتما نتیجش تو این تاپیک میذارم.

                            دیدگاه


                              #29
                              پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                              سلام
                              منم مشکل دارم در رابطه با خوندن اطلاعات از روی eeprom و کد هایی که نوشته بودین رو متوجه نشدم .تو نوشتن دیتا روی eeprom مشکلی ندارم مشکل خوندن دیتاست
                              سوال : برای خوندن دیتا ما اول eeprom رو صدا میزنیم مثلا A0 بعدش باید آدرسی که از اونجا می خوایم بخونه رو بهش بدیم درسته ؟؟؟
                              خوب من صداش میزنم پیغام میده : SLA+R transmitted; ACK received و درست صداش میزنه ولی وقتی می خوام بگم برو به آدرس مثلا 0x10 مشکل دارم دیگه کلا میره تو حالت خوندن و آدرس نمیگیره
                              کد:
                              case 0x08:
                              LPC_I2C0->I2DAT = I2C_name;
                              LPC_I2C0->I2CONCLR = 0x28;

                              حالا چطوری باس بعدش آدرس داد بهش ؟ و کدوم بیت های i2cstat باید تغییر کنن ؟؟؟؟؟
                              :angry: :angry: :angry: :angry: :angry: :angry:

                              دیدگاه


                                #30
                                پاسخ : مشکل با شبکه بندی EEPROM - 24C02 روی یک باس مشترک

                                سلام
                                من یک هدر نوشتم که خیلی راحت کار میکنه.مثل هون avr ولی توی لپتاپم ندارمش ولی توی همین قسمت گداشتمش بگرد با اون کار کون.هدری که با برنامه های نمونه هست فکر نمیکنم کار کنه.من که هرچی ور رفتم کار نگرد.حالا خودم چیداش کردم میزارم برات خیلی راهت و قابل فهم هست

                                دیدگاه

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