Перейти к содержанию
    

Не могу понять- если я в слейве хочу принимать данные на прерываниях, то эта ф-я сама будет вызываться что-ли? Или мне ее крутить самому надо в вечном цикле? Почему тогда она к прерываниям относится? Если это просто опрос ф-ии?

Просто логику не понять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу понять- если я в слейве хочу принимать данные на прерываниях, то эта ф-я сама будет вызываться что-ли? Или мне ее крутить самому надо в вечном цикле? Почему тогда она к прерываниям относится? Если это просто опрос ф-ии?

Просто логику не понять.

Как я понял Вам нужна колбэк функция. Которая вызовется после окончания приема. Если проэкт генерился в КубеМХ.

At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and user can

add his own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback()

 

HAL_I2C_Slave_Receive_IT должна вызываться сама, цикл не нужен.

Изменено пользователем Neo_Matrix

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Итак,

HAL_I2C_Slave_Receive_IT

вызывается сама по окончании приема, без цикла опроса.

 

HAL_I2C_SlaveRxCpltCallback()

это откуда взялось? Её мне как-то надо использовать? Или достаточно первой?

Да, проект в кубе сгенерён.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HAL_I2C_SlaveRxCpltCallback()

это откуда взялось? Её мне как-то надо использовать? Или достаточно первой?

Там есть затычка-пустышка с атрибутом __weak.

А Вам нужно написать нужное Вам без этого атрибута.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. я переписываю у себя ф-ю

HAL_I2C_SlaveRxCpltCallback()

куда происходит вызов при получении данных в прерывании?

 

А HAL_I2C_Slave_Receive_IT

как-то использую?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

раньше была кнопка dowload zip, теперь нет её.

git-clone

выдает ошибку на ссылку. Только в браузере могу просмотреть.

Выкачать можно от туда? И как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а так ?

STM32Cube_FW_F4

Хотя все эти примеры есть локально в хранилище Куба (путь есть в настройках Куба)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не принципиально- как с гита скачать. Можно и просто текст скопировать было.

Тем не менее, вопрос остается.

 

Попробую еще раз переформулировать его.

есть ф-я weak, которая была переписана.

void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
  /* Turn LED6 on: Transfer in reception process is correct */
  BSP_LED_On(LED6);
}

Я так понимаю, что если нам при приеме надо что-то делать, то это именно она. Тут она зажигает LED. Можно обойтись без нее? Думаю, да. Судя по коду.

 

 

Дальше, есть вызов ф-и в main() ,но до вечного цикла

  if(HAL_I2C_Slave_Receive_IT(&I2cHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
  {
    /* Transfer error in reception process */
    Error_Handler();        
  }

 

Получается, надо единожды передать ей массив и размер и структуру?

Дальше само на прерываниях будут приниматься значения в массив?

 

дополню вопрос- чтобы еще раз получить сообщение в режиме слейва мне что надо сделать? Ждать, пока массив обновится или вызывать повторно эту ф-ю?

Вот что не ясно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно надо её вызывать. По коду видно что после приема нужного кол-ва байт прерывания запрещаются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.е. чтобы получить новую порцию байт- вызываю ф-ю

HAL_I2C_Slave_Receive_IT

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

 

Подглядел на ютубе- вызывание делается в ф-ии

HAL_I2C_SlaveRxCpltCallback

 

a3d9636cb834.jpg

 

Это оптимальное решение, наверное?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот честно, так и нет ясности- для приема в режиме мастера или слейва на прерываниях, надо как вызывать ф-ю?

Чтобы при приходе адреса данного I2C устройства, происходили прерывания и выполнялась ф-я?

Не крутить же ее все время? Что это за прерывания тогда такие?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался немного.

Чтобы принять данные на прерываниях в режиме слейва, надо делать так:

До входа в основную петлю вызываем ф-ю

HAL_I2C_Slave_Receive_IT(&hi2c2, slave_rx_buff, 10);

 

и теперь проц будет ждать пока не придут данные. После этого, массив slave_rx_buff заполнится данными и на этом прием закончится. Ничего больше не будет приниматься.

Чтобы продолжить прием, надо написать ф-ю

void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
{
    if(I2cHandle->Instance==hi2c2.Instance)
    {
        HAL_I2C_Slave_Receive_IT(&hi2c2, slave_rx_buff, 10);
    }
}

где при каждом прерывании будет выполнятся код в теле. И запускаться вновь на ожидание прерываний. Причина- как писали выше- после приема данных, прерывания по i2c запрещаются. Мы т.о. снова их разрешаем.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

еще вопрос- как при приеме в ф-ю

HAL_I2C_Slave_Receive_IT

данных из вне от мастера, узнать, сколько байт было передано и реально принято?

Не нашел в I2C счетчика принятых байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...