اطلاعیه

Collapse
No announcement yet.

مشکل با ادرس ها در 24c1024

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

    مشکل با ادرس ها در 24c1024

    سلام خدمت همه ی دوستان.
    چطوری میتونم توی stm32 با کتاب خانه hal با 24c1024 ارتباط برقرار کنم.
    میدونم ادرس ها به صورت 16 بیتی هست و باید در قالب دو بایت ارسال بشه ولی توی hal نمیدونم چطوری باید این کار را انجام بدم.
    من همه کد های زیر را تست کردم. ولی هیچ کدوم جواب نداد و مقدار برگشتی این تابع برابر HAL_BUSY هست.


    کد:
    HAL_I2C_Mem_Write(&hi2c2,0x00a1,0x00FF,2,"1",1,1000)
    کد:
    HAL_I2C_Mem_Write(&hi2c2,0x00a1,0x00FF,8,"1",1,1000)
    کد:
    HAL_I2C_Mem_Write(&hi2c2,0x00a1,0x00FF,16,"1",1,1000)
    ممنون میشم اگه راهنمایی کنید.

    #2
    پاسخ : مشکل با ادرس ها در 24c1024

    سلام
    شما آدرس ای سی رو هشت بیتی بده،یعنی یه صفر از سمت راست به ۷ بیت آدرس اضافه کن.(read و write رو خود برنامه تنظیم میکنه)
    فرمت ارسال هم به صورت زیر هستش:
    کد:
    HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
    آدرس ای سی به شرطی که A1 و P0 صفر باشند چه برای نوشتن و چه برای خوندن برابر 0x00A0 میشه.

    شما مثل کد زیر بنویس

    کد:
    HAL_I2C_Mem_Write(&hi2c2,0x00A0,0x0001,I2C_MEMADD_SIZE_16BIT,"DATA",DATA_SIZE,1000);
    جدیدترین ویرایش توسط سید رضا باباتبار; ۱۹:۱۶ ۱۳۹۶/۰۳/۲۶.
    [آموزشی] کنترل رله با پیامک توسط sim800l
    [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
    [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
    [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
    صفحه اینستاگرام : ecdco_ir

    دیدگاه


      #3
      پاسخ : مشکل با ادرس ها در 24c1024

      نوشته اصلی توسط reza0506 نمایش پست ها
      سلام
      شما آدرس ای سی رو هشت بیتی بده،یعنی یه صفر از سمت راست به ۷ بیت آدرس اضافه کن.(read و write رو خود برنامه تنظیم میکنه)
      فرمت ارسال هم به صورت زیر هستش:
      کد:
      HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
      آدرس ای سی به شرطی که A1 و P0 صفر باشند چه برای نوشتن و چه برای خوندن برابر 0x00A0 میشه.

      شما مثل کد زیر بنویس

      کد:
      HAL_I2C_Mem_Write(&hi2c2,0x00A0,0x0001,I2C_MEMADD_SIZE_16BIT,"DATA",DATA_SIZE,1000);
      ممنون از لطفتون
      کدی که دادید را تست کردم.
      اما برنامه توی تابع HAL_I2C_Mem_Write وقتی به تابع I2C_WaitOnFlagUntilTimeout میرسه ، برنامه روی این تابع گیر میکنه بعدشم HAL_BUSY را return میکنه.
      بردم را هم چک کردم مشکلی نداشت قبلا با همین برد با 24c64 کار کردم و مشکلی نبوده.
      به نظرتون مشکل از کجاست؟

      دیدگاه


        #4
        پاسخ : مشکل با ادرس ها در 24c1024

        نوشته اصلی توسط hosseinghaheri نمایش پست ها
        ممنون از لطفتون
        کدی که دادید را تست کردم.
        اما برنامه توی تابع HAL_I2C_Mem_Write وقتی به تابع I2C_WaitOnFlagUntilTimeout میرسه ، برنامه روی این تابع گیر میکنه بعدشم HAL_BUSY را return میکنه.
        بردم را هم چک کردم مشکلی نداشت قبلا با همین برد با 24c64 کار کردم و مشکلی نبوده.
        به نظرتون مشکل از کجاست؟
        سخت افزار درسته؟ از مقاومت پول آپ برای خطوط i2c استفاده کردید؟ A1 روبه زمین وصل کردید؟ اگر سخت افزار درسته
        شما همون اول بعد include ها متغیر زیر رو تعریف کن
        کد:
        uint8_t str[5]={"hello"};
        بعد تو برنامه از کد زیر استفاده کن ببین نتیجه چی میشه
        کد:
        HAL_I2C_Mem_Write(&hi2c2,0x00A0,0x0000,I2C_MEMADD_SIZE_16BIT,str,5,1000);
        [آموزشی] کنترل رله با پیامک توسط sim800l
        [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
        [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
        [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
        صفحه اینستاگرام : ecdco_ir

        دیدگاه


          #5
          پاسخ : مشکل با ادرس ها در 24c1024

          نوشته اصلی توسط reza0506 نمایش پست ها
          سخت افزار درسته؟ از مقاومت پول آپ برای خطوط i2c استفاده کردید؟ A1 روبه زمین وصل کردید؟ اگر سخت افزار درسته
          شما همون اول بعد include ها متغیر زیر رو تعریف کن
          کد:
          uint8_t str[5]={"hello"};
          بعد تو برنامه از کد زیر استفاده کن ببین نتیجه چی میشه
          کد:
          HAL_I2C_Mem_Write(&hi2c2,0x00A0,0x0000,I2C_MEMADD_SIZE_16BIT,str,5,1000);
          این کد را هم تست کردم ولی جواب نداد بازم توی اون تابع گیر میکنه.
          برد را هم گفتم قبلا روی همین برد با 24c64 کار کردم.
          با مقاومت 4k7 پول اپ کردم و سمت چپه ایسی که شامل دو nc و a1 و gnd هست را هم زمین کردم.
          ولتاژ هم 3v3 هست.
          حالا یه بار ایسیو برمیدارم و دوباره میزارم و تست میکنم.

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          ایسی را هم عوض کردم ولی فایده ای نداشت!

          دیدگاه


            #6
            پاسخ : مشکل با ادرس ها در 24c1024

            نوشته اصلی توسط hosseinghaheri نمایش پست ها
            این کد را هم تست کردم ولی جواب نداد بازم توی اون تابع گیر میکنه.
            برد را هم گفتم قبلا روی همین برد با 24c64 کار کردم.
            با مقاومت 4k7 پول اپ کردم و سمت چپه ایسی که شامل دو nc و a1 و gnd هست را هم زمین کردم.
            ولتاژ هم 3v3 هست.
            حالا یه بار ایسیو برمیدارم و دوباره میزارم و تست میکنم.

            دلیل: ادغام دو پست برای جلوگیری از اسپم

            ایسی را هم عوض کردم ولی فایده ای نداشت!
            پین wp رو به زمین وصل کنید،vcc رو هم اگر امکانش هست به ۵ ولت وصل کنید و یا سرعت ارتباط رو پایین بیارید
            سرعت ارتباط چنده؟ ۱۰۰ کیلو؟
            اگر تغذیه ۵ ولت دادید، مقاومت های پول آپ رو به ۳/۳ وصل کنید
            تنظیمات cubemx رو درست انجام دادید؟
            جدیدترین ویرایش توسط سید رضا باباتبار; ۲۲:۰۳ ۱۳۹۶/۰۳/۲۶.
            [آموزشی] کنترل رله با پیامک توسط sim800l
            [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
            [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
            [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
            صفحه اینستاگرام : ecdco_ir

            دیدگاه


              #7
              پاسخ : مشکل با ادرس ها در 24c1024

              سرعت i2c صد کیلو است. نیازه کمترش کنم؟
              اگه نیازه در چه حد؟
              بله تنظیمات مشکلی نداره حداقلش روی 24c64 جواب داد.
              چون ایسی smd هست و توی مدارم 5 ولت ندارم .
              یکم سخته ۵ ولت بهش بدم اخه vcc ایسی با vcc میکرو یکیه.

              دیدگاه


                #8
                پاسخ : مشکل با ادرس ها در 24c1024

                نوشته اصلی توسط hosseinghaheri نمایش پست ها
                سرعت i2c صد کیلو است. نیازه کمترش کنم؟
                اگه نیازه در چه حد؟
                بله تنظیمات مشکلی نداره حداقلش روی 24c64 جواب داد.
                چون ایسی smd هست و توی مدارم 5 ولت ندارم .
                یکم سخته ۵ ولت بهش بدم اخه vcc ایسی با vcc میکرو یکیه.
                با این ولتاژ تا سرعت 400 کیلو هم جواب میده پس مشکلی نیست
                شما به جای 0x00A0 قرار بده 0xA0
                راستی برنامه هیچ اخطاری نمیده؟ (warning)
                [آموزشی] کنترل رله با پیامک توسط sim800l
                [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                صفحه اینستاگرام : ecdco_ir

                دیدگاه


                  #9
                  پاسخ : مشکل با ادرس ها در 24c1024

                  این کد را هم نوشتم ولی بازم توی همون تابع گیر میکنه.
                  کد:
                  HAL_I2C_Mem_Write(&hi2c2,0xA0,0x0000,I2C_MEMADD_SIZE_16BIT,str,5,1000);
                  راهی وجود نداره که خودمون روی دیتای ارسالی کنترل داشته باشیم.
                  تقریبا مثل avr بایت ها رو تک تک بفرستیم

                  دیدگاه


                    #10
                    پاسخ : مشکل با ادرس ها در 24c1024

                    با تابع hal_i2c_write میتونی هر دفعه آدرس حافظه رو بدی و یه بایت بنویسی
                    ولی با همون برنامه قبلی باید میشد،شما با چی دیباگ میکنید؟
                    [آموزشی] کنترل رله با پیامک توسط sim800l
                    [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                    [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                    [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                    صفحه اینستاگرام : ecdco_ir

                    دیدگاه


                      #11
                      پاسخ : مشکل با ادرس ها در 24c1024

                      نوشته اصلی توسط reza0506 نمایش پست ها
                      با تابع hal_i2c_write میتونی هر دفعه آدرس حافظه رو بدی و یه بایت بنویسی
                      ولی با همون برنامه قبلی باید میشد،شما با چی دیباگ میکنید؟
                      اگه منظورتون نوع پرگرامرم هست که همین jlink شرکت eca هست.
                      توی کد زیر توجه داشته باشید یه متغیر به نام K وجود داره که بعد از گذشتن از هر تابع +1 میشه.
                      حالا این K حدود شیش ثانیه روی 3 گیرمیکنه( قبل از تابع I2C_WaitOnFlagUntilTimeout )و بعد 4 میشه و هیچ موقع هم بیشتر از 4 نمیشه. یعنی برنامه از تابع HAL_I2C_Mem_Write پریده بیرون
                      کد:
                      HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
                      {
                        /* Check the parameters */
                          K=1;
                        assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
                      
                        if(hi2c->State == HAL_I2C_STATE_READY)
                        {
                          if((pData == NULL) || (Size == 0))
                          {
                            return  HAL_ERROR;K=2;
                          }
                              K=3;
                          /* Wait until BUSY flag is reset */
                          if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK)
                          {
                                      K=4;return HAL_BUSY;
                          }
                                  K=5;
                          /* Process Locked */
                          __HAL_LOCK(hi2c);
                      
                          /* Disable Pos */
                          CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
                      
                          hi2c->State = HAL_I2C_STATE_BUSY_TX;
                          hi2c->Mode = HAL_I2C_MODE_MEM;
                          hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
                      
                          /* Send Slave Address and Memory Address */
                          if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
                          {
                                  K=6;
                            if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
                            {
                              /* Process Unlocked */
                              __HAL_UNLOCK(hi2c);
                              return HAL_ERROR;
                      ....

                      دیدگاه


                        #12
                        پاسخ : مشکل با ادرس ها در 24c1024

                        نوشته اصلی توسط hosseinghaheri نمایش پست ها
                        اگه منظورتون نوع پرگرامرم هست که همین jlink شرکت eca هست.
                        توی کد زیر توجه داشته باشید یه متغیر به نام K وجود داره که بعد از گذشتن از هر تابع +1 میشه.
                        حالا این K حدود شیش ثانیه روی 3 گیرمیکنه( قبل از تابع I2C_WaitOnFlagUntilTimeout )و بعد 4 میشه و هیچ موقع هم بیشتر از 4 نمیشه. یعنی برنامه از تابع HAL_I2C_Mem_Write پریده بیرون
                        کد:
                        HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
                        {
                          /* Check the parameters */
                            K=1;
                          assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
                        
                          if(hi2c->State == HAL_I2C_STATE_READY)
                          {
                            if((pData == NULL) || (Size == 0))
                            {
                              return  HAL_ERROR;K=2;
                            }
                                K=3;
                            /* Wait until BUSY flag is reset */
                            if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG) != HAL_OK)
                            {
                                        K=4;return HAL_BUSY;
                            }
                                    K=5;
                            /* Process Locked */
                            __HAL_LOCK(hi2c);
                        
                            /* Disable Pos */
                            CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_POS);
                        
                            hi2c->State = HAL_I2C_STATE_BUSY_TX;
                            hi2c->Mode = HAL_I2C_MODE_MEM;
                            hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
                        
                            /* Send Slave Address and Memory Address */
                            if(I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout) != HAL_OK)
                            {
                                    K=6;
                              if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
                              {
                                /* Process Unlocked */
                                __HAL_UNLOCK(hi2c);
                                return HAL_ERROR;
                        ....
                        منظورم اینه که با چه نرم افزاری دیباگ رو انجام میدید؟
                        چطور k رو بررسی میکنید؟
                        به نظر من بعد نوشتن دوباره از ای سی بخونید و تو متغیر جدید قرار بدید و ببینید اون متغیر ها برابر با خونه های ای سی میشن یا نه.
                        [آموزشی] کنترل رله با پیامک توسط sim800l
                        [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                        [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                        [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                        صفحه اینستاگرام : ecdco_ir

                        دیدگاه


                          #13
                          پاسخ : مشکل با ادرس ها در 24c1024

                          نوشته اصلی توسط reza0506 نمایش پست ها
                          منظورم اینه که با چه نرم افزاری دیباگ رو انجام میدید؟
                          چطور k رو بررسی میکنید؟
                          به نظر من بعد نوشتن دوباره از ای سی بخونید و تو متغیر جدید قرار بدید و ببینید اون متغیر ها برابر با خونه های ای سی میشن یا نه.
                          از کامپایلر کیل استفاده میکنم.
                          و وضعیت k را توی دیباگ از watch1 بررسی میکنم.

                          این کاری که گفتید را قبلا هم تست کردم ولی باز هم جواب نداد.
                          یعنی شیش هفت ثانیه روی تابع write و شی هفت ثانیه هم رو تابع read تاخیر داره که اصلا معقولی نیست.

                          دلیل: ادغام دو پست برای جلوگیری از اسپم

                          دیدگاه


                            #14
                            پاسخ : مشکل با ادرس ها در 24c1024

                            این برنامه باید جواب بده من فقط برای آدرس شک دارم که باید 0x00A0 باشه یا 0x0A
                            درضمن کدی که برای خوندن نوشتی اشتباهه،چون آدرس 16 بیتیه و شما آدرس رو 8 بیتی معرفی کردی
                            کد:
                            #define I2C_MEMADD_SIZE_8BIT            ((uint32_t)0x00000001)
                            #define I2C_MEMADD_SIZE_16BIT           ((uint32_t)0x00000010)
                            دلیل: ادغام دو پست برای جلوگیری از اسپم

                            از stm32f103ret6 استفاده میکنی؟
                            اگه وقت کردم امشب خودم برنامشو برات مینویسم.
                            [آموزشی] کنترل رله با پیامک توسط sim800l
                            [آموزشی] راه اندازی سنسورهای DHT11 و DHT22 با کدویژن
                            [آموزشی] مدار عملی اتصال میکروفن خازنی به میکروکنترلر
                            [آموزشی] آموزش نحوه راه اندازی میکروهای fmd
                            صفحه اینستاگرام : ecdco_ir

                            دیدگاه


                              #15
                              پاسخ : مشکل با ادرس ها در 24c1024

                              نوشته اصلی توسط reza0506 نمایش پست ها
                              این برنامه باید جواب بده من فقط برای آدرس شک دارم که باید 0x00A0 باشه یا 0x0A
                              درضمن کدی که برای خوندن نوشتی اشتباهه،چون آدرس 16 بیتیه و شما آدرس رو 8 بیتی معرفی کردی
                              کد:
                              #define I2C_MEMADD_SIZE_8BIT            ((uint32_t)0x00000001)
                              #define I2C_MEMADD_SIZE_16BIT           ((uint32_t)0x00000010)
                              اخه من هم 0x00a0 و هم 0x0a را تست کردم.
                              قسمت خوندن راهم درست میگید ، از قبل بوده فراموش کردم.

                              ولی مشکلی که هست به احتمال زیاد مربوط به MEMADD_SIZE هست که همون اول کار بعد از این که چند خط را اجرا کرد و وارد تابع I2C_WaitOnFlagUntilTimeout دگ میپره بیرون

                              چون قبل از تابع I2C_WaitOnFlagUntilTimeout فقط از MEMADD_SIZE استفاده شده

                              دیدگاه

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