Взаимодействие A71CH с I2C

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

В настоящее время я пытаюсь передать повторный запуск, используя последовательную передачу hal с прерыванием, но это вообще не работает, я получаю 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 */

}

person andreahmed    schedule 16.05.2019    source источник
comment
Показать hi2c3 инициализацию ...   -  person KamilCuk    schedule 17.05.2019
comment
Также вы можете попробовать использовать HAL_I2C_Mem_Write/Read функции.   -  person KamilCuk    schedule 17.05.2019
comment
@KamilCuk, а какую адресную память нужно записать с помощью Mem Write? Если я использую Mem_Write / Read   -  person andreahmed    schedule 17.05.2019
comment
@KamilCuk Я добавил инициализацию hi2c3. Пожалуйста помоги :)   -  person andreahmed    schedule 17.05.2019
comment
например uint16_t MemAddSize, uint8_t * pData, MemAddSize. Что тут писать. Напишите ответ с примером команды   -  person andreahmed    schedule 17.05.2019
comment
@KamilCuk Также существует большая проблема, устройству необходимо сгенерировать NACK, как бы мне решить эту проблему, а STMF407 не имеет генератора NACK   -  person andreahmed    schedule 17.05.2019
comment
Да, это имеет. NACK - это просто состояние строк. Просто прочтите документацию. И исходный код функций. Драйверы HAL хорошо документированы в заголовках.   -  person KamilCuk    schedule 17.05.2019
comment
@KamilCuk Не могли бы вы привести пример записи Mem с помощью этого чипа с примером команды, пожалуйста   -  person andreahmed    schedule 17.05.2019
comment
@KamilCuk Меня так смущает мемадрес, что это должно быть?   -  person andreahmed    schedule 17.05.2019
comment
@KamilCuk Пожалуйста, мне нужна твоя помощь   -  person andreahmed    schedule 17.05.2019
comment
@KamilCuk У тебя есть ответ на мои вопросы?   -  person andreahmed    schedule 17.05.2019
comment
Нет, извините, вам придется решать свои проблемы самостоятельно. Вы не можете рассчитывать на какие-то случайности в Интернете, которые решат проблемы за вас; ) Вы можете найти множество примеров связи I2C с использованием STM32, вы можете перечитать документацию и просмотреть исходный код драйверов HAL, и вы можете найти примеры функций HAL_MEM_ *, используемых через Интернет, вы можете проверить линии с помощью осцилоскопа, есть много способы более подробно изучить проблему;)   -  person KamilCuk    schedule 17.05.2019
comment
@KamilCuk Спасибо за ваш вклад, но вы читали техническое описание? Там нет адреса регистрации   -  person andreahmed    schedule 17.05.2019


Ответы (1)


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

person Bora    schedule 17.05.2019
comment
1. smbus stack не реализован на stm32. Вы должны иметь возможность общаться с устройствами smbus в большинстве случаев с помощью stm32, по крайней мере, у меня это сработало. Разница в экс. допустимые напряжения, тайминги или байтовые интерпретации. 2. Из таблицы данных микросхемы: The I2C interface is using the Smartcard I2C protocol as defined in Ref. 3 which is based on SMBus. Протокол Smart I2C реализован с помощью этих функций HAL_I2C_Mem_ * hal. - person KamilCuk; 17.05.2019
comment
Что вы имеете в виду под тем, что стек не реализован на STM32? Вы должны реализовать стек, чтобы иметь возможность связываться с чипом. Самый простой способ реализовать это - использовать предоставленный стек SMBus вместо работы с низкоуровневыми функциями I2C. - person Bora; 17.05.2019
comment
X-CODE-SMBUS реализует транспортный уровень, а не уровень связи / сети. Бывший. реализует команду smbus вызова процесса. Или команда зоны команда smbus. Это команды, специфичные для протокола smbus. Но протокол связи - I2C. Таким образом, вы можете переписать X-CODE-SMBUS, используя функцию HAL_I2C. Smbus - это (вроде?) Слой выше. - person KamilCuk; 17.05.2019
comment
@Bora Можете ли вы показать в ответе, как использовать HAL_I2C_MEM, используя эту таблицу? - person andreahmed; 18.05.2019