реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32, I2C, HAL, HAL_I2C_Slave_Receive_IT
Метценгерштейн
сообщение Apr 1 2016, 07:06
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Не могу понять- если я в слейве хочу принимать данные на прерываниях, то эта ф-я сама будет вызываться что-ли? Или мне ее крутить самому надо в вечном цикле? Почему тогда она к прерываниям относится? Если это просто опрос ф-ии?
Просто логику не понять.
Go to the top of the page
 
+Quote Post
Neo_Matrix
сообщение Apr 6 2016, 11:31
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 11-04-06
Пользователь №: 16 029



Цитата(Метценгерштейн @ Apr 1 2016, 09:06) *
Не могу понять- если я в слейве хочу принимать данные на прерываниях, то эта ф-я сама будет вызываться что-ли? Или мне ее крутить самому надо в вечном цикле? Почему тогда она к прерываниям относится? Если это просто опрос ф-ии?
Просто логику не понять.

Как я понял Вам нужна колбэк функция. Которая вызовется после окончания приема. Если проэкт генерился в КубеМХ.
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 - Apr 6 2016, 12:46
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 14 2016, 14:34
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

HAL_I2C_SlaveRxCpltCallback()
это откуда взялось? Её мне как-то надо использовать? Или достаточно первой?
Да, проект в кубе сгенерён.



Go to the top of the page
 
+Quote Post
Tanya
сообщение Apr 14 2016, 15:08
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Метценгерштейн @ Apr 14 2016, 17:34) *
HAL_I2C_SlaveRxCpltCallback()
это откуда взялось? Её мне как-то надо использовать? Или достаточно первой?

Там есть затычка-пустышка с атрибутом __weak.
А Вам нужно написать нужное Вам без этого атрибута.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 14 2016, 15:14
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



т.е. я переписываю у себя ф-ю
HAL_I2C_SlaveRxCpltCallback()
куда происходит вызов при получении данных в прерывании?

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

Go to the top of the page
 
+Quote Post
x893
сообщение Apr 14 2016, 20:46
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Как то придется использовать
I2C_TwoBoards_ComIT
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 15 2016, 09:11
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



раньше была кнопка dowload zip, теперь нет её.
git-clone
выдает ошибку на ссылку. Только в браузере могу просмотреть.
Выкачать можно от туда? И как?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Apr 15 2016, 11:19
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Надо перейти в корень хранилища и там всё есть.
Go to the top of the page
 
+Quote Post
x893
сообщение Apr 15 2016, 11:24
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



а так ?
STM32Cube_FW_F4
Хотя все эти примеры есть локально в хранилище Куба (путь есть в настройках Куба)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 15 2016, 11:46
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

Попробую еще раз переформулировать его.
есть ф-я 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();        
  }


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

дополню вопрос- чтобы еще раз получить сообщение в режиме слейва мне что надо сделать? Ждать, пока массив обновится или вызывать повторно эту ф-ю?
Вот что не ясно.
Go to the top of the page
 
+Quote Post
x893
сообщение Apr 16 2016, 07:45
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Конечно надо её вызывать. По коду видно что после приема нужного кол-ва байт прерывания запрещаются.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 16 2016, 09:33
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



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

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



Это оптимальное решение, наверное?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 19 2016, 13:00
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Вот честно, так и нет ясности- для приема в режиме мастера или слейва на прерываниях, надо как вызывать ф-ю?
Чтобы при приходе адреса данного I2C устройства, происходили прерывания и выполнялась ф-я?
Не крутить же ее все время? Что это за прерывания тогда такие?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Apr 29 2016, 12:59
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Разобрался немного.
Чтобы принять данные на прерываниях в режиме слейва, надо делать так:
До входа в основную петлю вызываем ф-ю
Код
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 запрещаются. Мы т.о. снова их разрешаем.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 12 2016, 15:03
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



еще вопрос- как при приеме в ф-ю
HAL_I2C_Slave_Receive_IT
данных из вне от мастера, узнать, сколько байт было передано и реально принято?
Не нашел в I2C счетчика принятых байт.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 13:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016