Да там даже вариантов нет, чтобы включить или выключить. Настроено как Alternate Function Open Drain. Думал логический анализатор врёт, так нет. Отключил. На мультиметре - +3.3, как на SDA, так и на SCL.

Комментарии: 21

  1. Anonim

    ээээ а какая тут связь с нестабильностью? что не работает-то?

  2. Anonim

    у меня в принципе стабильно довольно работает, или я не знаю как нагрузить чтобы проверить ну код в студию чтоли ты через HAL делаешь, я тоже, покажи код или я просто не нарывался чтобы было нестабильно а порты просто туда-сюда ты ногами не шевелил в статике чтобы мультиметром посмотреть? может пригорел транзистор какой на выходе

    • Aleksandr

      while (HAL_I2C_Master_Transmit(&hi, (uint16_t) devAddr, (uint8_t*)&buff, (uint16_t)sizebuf, 1000) != HAL_OK) - вот отправка. она работает, но не всегда. чаще всего на ней всё встаёт в цикле.

      • Anonim

        можно светодиодом или резистором еще нагрузить в статике чтоб проверить что в 0 и 1 они оба переключаются нормально

      • Anonim

        я бы проверил порты как я написал, что они вообще есть, потом может со скоростью поигрался, 400 и 100 например, станет ли чаще глючить от этого когда не всегда он там отвечает что не так в возвращаемом коде ошибки, что там?

        • Aleksandr

          Порты работают. Скорость менял до 20 кГц. Режимы тоже пробовал менять. Работает оно одинаково один раз на миллион. Таймаут На линии всё время тишина.

          • Anonim

            а анализатор чего показал? смотрел ACK NACK вот это все?

            • Aleksandr

              Тишину показывает. Единицы стабильно на всех линиях.

              • Anonim

                не а сам обмен-то побайтно?

                • Aleksandr

                  Вероятно, нет. Нет обмена там тишина.

                  • Anonim

                    посмотри, будет все видно например после какой-то команды, могу только посоветовать попробовать по 1 байту отправлять и в отладке смотреть на каком месте оно валится у тебя отладчик покажет после какого байта saleae у тебя? он вообще показывает и байты все и стопы

                    • Aleksandr

                      китайский

                      • Anonim

                        ну, шикарный прибор прям побайтно смотри обмен

                        • Aleksandr

                          Я даже стартового бита не вижу. МК не посылает ничего Нет обмена

                          • Anonim

                            хм. а повесь на другой I2C и хорошо бы схемку или скриншот, что за I2C ты используешь и какой проц ты в кубе делал код? покажи картинку распиновки, может у тебя конфликты там какие с другой аппаратурой могу программный I2C дать код

                            • Andrey

                              хехе. Мне попался фуфловый STM32F103C8T6

                              • Anonim

                                еррата на i2c уже прочитана? Она там емнип больше чем раздел в рефмане

                          • Anonim

                            "stm32f1xx_hal.h" I2C_SCL_PORT GPIOB I2C_SDA_PORT GPIOB I2C_SDA_PIN 11 I2C_SCL_PIN 10 DELAY_I2C delay_i2c(1) void delay_i2c(uint32_t delay) { volatile uint32_t temp = delay; while(temp--); } void I2C_Start(void) { //__disable_irq(); I2C_SDA_PORT->BSRR = (1 << I2C_SDA_PIN); DELAY_I2C; I2C_SCL_PORT->BSRR = (1 << I2C_SCL_PIN); DELAY_I2C; while (!(I2C_SDA_PORT->IDR & (1 << I2C_SDA_PIN))) { I2C_SCL_PORT->BRR = (1 << I2C_SCL_PIN); DELAY_I2C; I2C_SCL_PORT->BSRR = (1 << I2C_SCL_PIN); DELAY_I2C; } I2C_SDA_PORT->BRR = (1 << I2C_SDA_PIN); DELAY_I2C; I2C_SCL_PORT->BRR = (1 << I2C_SCL_PIN); DELAY_I2C; //__enable_irq(); } void I2C_Stop(void) { //__disable_irq(); I2C_SDA_PORT->BRR = (1 << I2C_SDA_PIN); DELAY_I2C; I2C_SCL_PORT->BSRR = (1 << I2C_SCL_PIN); DELAY_I2C; I2C_SDA_PORT->BSRR = (1 << I2C_SDA_PIN); DELAY_I2C; //__enable_irq(); } uint8_t I2C_Write_Byte(uint8_t data) { uint8_t i; uint8_t ACK; for (i = 0; i < 8; i++) { if (data & 0x80) { I2C_SDA_PORT->BSRR = (1 << I2C_SDA_PIN); } else { I2C_SDA_PORT->BRR = (1 << I2C_SDA_PIN); } DELAY_I2C; I2C_SCL_PORT->BSRR = (1 << I2C_SCL_PIN); DELAY_I2C; I2C_SCL_PORT->BRR = (1 << I2C_SCL_PIN); data = data << 1; } DELAY_I2C; I2C_SCL_PORT->BSRR = (1 << I2C_SCL_PIN); DELAY_I2C; ACK = !(I2C_SDA_PORT->IDR & (1 << I2C_SDA_PIN)); I2C_SCL_PORT->BRR = (1 << I2C_SCL_PIN); I2C_SDA_PORT->BRR = (1 << I2C_SDA_PIN); return ACK; }

                            • Aleksandr

                              Для начала попробую другой i2c. Процессор f103c8t6, как раз Нет, ничего не изменилось

                              • Anonim

                                ну уменя есть проект с двумя I2C на блюпилле тоже 103, оба работают, один софтовый другой аппаратный, давай скину

    • Aleksandr

      Оно так себя ведёт со всеми моими stm32. И нормально работает с ардуиной.

Не нашли ответ?

Вам также может быть интересно