Взаимодействие A71CH с I2C - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь связать следующую микросхему с STM32F4 https://www.nxp.com/docs/en/supporting-information/AN12207.pdf

В настоящее время я пытаюсь передать повторный запуск с использованием последовательной передачи с прерыванием, но она не работает вообще, яполучить NAK.

Кто-нибудь подскажет мне, как его интерфейс и какие функции HAL мне следует использовать?

unsigned int axI2CWriteRead(unsigned char bus_unused_param, unsigned char addr,
                            unsigned char *pTx, unsigned short txLen,
                            unsigned char *pRx, unsigned short *pRxLen)
{
    extern I2C_HandleTypeDef hi2c3;
    bool recv_length = false;
    HAL_StatusTypeDef status;

    *pRxLen = 0;
    memset(pRx, 0, 2);
    uint8_t rxData[255] = {0};

    status = HAL_I2C_Master_Sequential_Transmit_IT(&hi2c3, 0x90, pTx, txLen, I2C_FIRST_FRAME);

    if (status != HAL_OK)
        return I2C_FAILED;

    while (HAL_I2C_GetState(&hi2c3) != HAL_I2C_STATE_READY)
        ;

    readblock = true;
    readblock_length = 0;
    status = HAL_I2C_Master_Sequential_Receive_IT(&hi2c3, 0x90, rxData, 255, I2C_LAST_FRAME);

    if (status != HAL_OK)
        return I2C_FAILED;
    while (HAL_I2C_GetState(&hi2c3) != HAL_I2C_STATE_READY)
        ;
    readblock = false;
    readblock_length = 0;


    *pRxLen = rxData[0] + 1;

    memcpy(pRx, rxData, *pRxLen);

    return I2C_OK;
}

Инициализация I2C3

static void MX_I2C3_Init(void)
{

  /* USER CODE BEGIN I2C3_Init 0 */

  /* USER CODE END I2C3_Init 0 */

  /* USER CODE BEGIN I2C3_Init 1 */

  /* USER CODE END I2C3_Init 1 */
  hi2c3.Instance = I2C3;
  hi2c3.Init.ClockSpeed = 100000;
  hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c3.Init.OwnAddress1 = 0;
  hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c3.Init.OwnAddress2 = 0;
  hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_ENABLE;
  if (HAL_I2C_Init(&hi2c3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C3_Init 2 */

  /* USER CODE END I2C3_Init 2 */

}

1 Ответ

0 голосов
/ 17 мая 2019

Согласно спецификации чипа , связь SCI2C не является чистым I2C, а основана на SMBus , который получен из I2C. STM32F4 HAL не поддерживает SMBus, но ST предоставляет программный пакет X-CUBE-SMBUS , который можно использовать для реализации протокола SCI2C.Вы должны изучить специфику протокола и создать свою собственную библиотеку, поскольку протокол довольно новый, и я не смог найти предыдущую реализацию, которую вы можете использовать.Если вы работаете, я бы порекомендовал внести свой вклад в сообщество открытого исходного кода, загрузив его на GitHub или аналогичную платформу для обмена.

...