i2c не пойму что с шиной

    • #75557
      Николай
      Ключник

      bodigard

      18 авг 2023, 12:50
      есть stm32 в качестве мастера, в качестве слейвов MCP23008 и INA226, SDA и SCL притянуты к питанию резисторами на 10 кОм
      питание всей этой радости 3.3В
      и вот такую картину я вижу когда пытаюсь сформировать START
      форум ниман ру
      собственно старт не формируется, бит SB не взлетает
      подскажите куда смотреть, у меня уже мыслей нет 🙁

      BBS

      18 авг 2023, 12:57
      код?

      bodigard

      18 авг 2023, 13:06
      BBS писал(а):
      код?

      да все стандартно
      инициализация

      static void MX_I2C1_Initvoid
      {
      /* USER CODE BEGIN I2C1_Init 0 */
      /* USER CODE END I2C1_Init 0 */
      LL_I2C_InitTypeDef I2C_InitStruct = {0},
      LL_GPIO_InitTypeDef GPIO_InitStruct = {0},
      LL_APB2_GRP1_EnableClockLL_APB2_GRP1_PERIPH_GPIOB,
      /**I2C1 GPIO Configuration
      PB6 ——&gt, I2C1_SCL
      PB7 ——&gt, I2C1_SDA
      */
      GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7,
      GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE,
      GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH,
      GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN,
      LL_GPIO_InitGPIOB, &GPIO_InitStruct,
      /* Peripheral clock enable */
      LL_APB1_GRP1_EnableClockLL_APB1_GRP1_PERIPH_I2C1,
      /* USER CODE BEGIN I2C1_Init 1 */
      /* USER CODE END I2C1_Init 1 */
      /** I2C Initialization
      */
      LL_I2C_DisableOwnAddress2I2C1,
      LL_I2C_DisableGeneralCallI2C1,
      LL_I2C_EnableClockStretchingI2C1,
      I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C,
      I2C_InitStruct.ClockSpeed = 100000,
      I2C_InitStruct.DutyCycle = LL_I2C_DUTYCYCLE_2,
      I2C_InitStruct.OwnAddress1 = 0,
      I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK,
      I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT,
      LL_I2C_InitI2C1, &I2C_InitStruct,
      LL_I2C_SetOwnAddress2I2C1, 0,
      /* USER CODE BEGIN I2C1_Init 2 */
      LL_I2C_EnableI2C1,
      /* USER CODE END I2C1_Init 2 */
      }

      дефайны

      #define I2C_REQUEST_WRITE 0x00
      #define I2C_REQUEST_READ 0x01
      #define SLAVE_OWN_ADDRESS 0x20

      обмен

      LL_I2C_DisableBitPOSI2C1,
      LL_I2C_AcknowledgeNextDataI2C1, LL_I2C_ACK,
      LL_I2C_GenerateStartConditionI2C1,
      while!LL_I2C_IsActiveFlag_SBI2C1{},
      void I2C1-&gt,SR1,
      LL_I2C_TransmitData8I2C1, SLAVE_OWN_ADDRESS | I2C_REQUEST_WRITE, //
      while!LL_I2C_IsActiveFlag_ADDRI2C1{},
      LL_I2C_ClearFlag_ADDRI2C1,
      /* send data */
      LL_I2C_GenerateStopConditionI2C1,

      bodigard

      18 авг 2023, 13:14
      единственный момент, у меня нога RESET мс MCP23008 сразу посажена на питание, т.е. я не дергаю её после подачи питания

      u37

      18 авг 2023, 13:33
      Ноги CLK-D не перепутали?

      bodigard

      18 авг 2023, 13:39
      u37 писал(а):
      Ноги CLK-D не перепутали?

      если про SDA SCL то нет, на 20 раз уже перепроверил-промерил-прозвонил

      tonyk

      18 авг 2023, 13:40
      bodigard писал(а):
      у меня нога RESET мс MCP23008 сразу посажена на питание

      А вот это зря!
      Тискал эту микруху. Схема была собрана на китайских перемычках. Не удивительно, что иногда происходили сбои. Но только этот 23008 наглухо зависал. Процедура сброса узла шины, описанная в мурзилках Филипса, не помогала, помогало только выключение питания, потому что сигнал сброса был подключен к питанию. За PCF8574 такого замечено не было.

      Cujo

      18 авг 2023, 13:47
      у меня на LL такой код, может поможет

      I2С_State = I2С_BUSY,
      uint32_t end_ms = get_ms + I2C_TIMEOUT,
      LL_I2C_HandleTransferI2C2, slaveAddress, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_SOFTEND, LL_I2C_GENERATE_START_WRITE,
      while !LL_I2C_IsActiveFlag_TXISI2C2 {
      ifend_ms – get_ms &gt, I2C_TIMEOUT {
      break,
      I2С_State = I2C_FAULT_TIMEOUT,
      }
      }
      LL_I2C_TransmitData8I2C2, mem_adr,
      while !LL_I2C_IsActiveFlag_TCI2C2 {
      ifend_ms – get_ms &gt, I2C_TIMEOUT {
      break,
      }
      ifLL_I2C_IsActiveFlag_TCRI2C2{
      break,
      }
      }
      LL_I2C_HandleTransferI2C2, slaveAddress, LL_I2C_ADDRSLAVE_7BIT, 2, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ,
      while !LL_I2C_IsActiveFlag_RXNEI2C2{
      ifend_ms – get_ms &gt, I2C_TIMEOUT {
      break,
      }
      }
      data = LL_I2C_ReceiveData8I2C2 &lt,&lt, 8,
      while !LL_I2C_IsActiveFlag_RXNEI2C2 {
      ifend_ms – get_ms &gt, I2C_TIMEOUT {
      break,
      }
      }
      data |= LL_I2C_ReceiveData8I2C2,
      while !LL_I2C_IsActiveFlag_STOPI2C2 {
      ifend_ms – get_ms &gt, I2C_TIMEOUT {
      break,
      }
      }
      ifend_ms – get_ms &gt, I2C_TIMEOUT {
      IPS_State = I2C_FAULT_TIMEOUT,
      }
      else{
      IPS_State = I2C_OK,
      }

      bodigard

      18 авг 2023, 14:00
      Cujo писал(а):
      у меня на LL такой код, может поможет

      у меня f103 там LL немного другой, но смысл вроде тот-же
      я понять не могу почему сначала падает SCL а потом SDA, а не наоборот

      Cujo

      18 авг 2023, 14:06
      да, похоже это проблема либо с кодом, либо с пинами (анализатором может)
      LL_I2C_GenerateStartCondition(I2C1), – достаточно чтобы SDA в 0 ушло, если I2C включен и не в ошибке

      Арсений

      Вчера, 12:11
      Только недавно читал про баги I2C в STM32 в этой статье. Может быть поможет.

      bodigard

      Вчера, 12:47
      уже разобрался, в физике дело было

      x893

      Вчера, 16:24
      bodigard писал(а):
      уже разобрался, в физике дело было

      Со школы надо было начинать ?

Viewing 0 reply threads
  • Вы должны войти в систему, чтобы ответить в этой теме.
Интepecнoe нa фopумe:
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля
×