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

 
 
> 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 19)
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
Метценгерштейн
сообщение May 30 2016, 08:18
Сообщение #16


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

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



ерунда какая- то творится с I2C.
Принимает на прерываниях один пакет, дальше ничего не принимает и виснет.
Заметил, что
Код
while (HAL_I2C_Slave_Receive_IT( &hi2c1, RxBuf, (sizeof(RxBuf)/sizeof(RxBuf[0])) ) != HAL_OK);
while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);

вторая строчка выдает
Код
HAL_I2C_STATE_BUSY


Кто-то сталкивался? Как корректно вообще работать с I2C на прерываниях и HAL?
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение May 31 2016, 14:20
Сообщение #17


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

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



при работе с другим МК STM32 в качестве мастера, все ок.
Как только подключаюсь к другой железке, она мастер, принимаю один пакет, а после второго пакета висну, в регистре ISR висит бит BUSY.
Из-за чего может быть?
Go to the top of the page
 
+Quote Post
delamoure
сообщение Sep 20 2016, 13:45
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 176
Регистрация: 2-04-08
Из: Днепропетровск
Пользователь №: 36 406



Удалось побороть?


--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
Go to the top of the page
 
+Quote Post
k155la3
сообщение Sep 21 2016, 10:35
Сообщение #19


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Метценгерштейн @ May 31 2016, 17:20) *
при работе с другим МК STM32 в качестве мастера, все ок.
Как только подключаюсь к другой железке, она мастер, принимаю один пакет, а после второго пакета висну, в регистре ISR висит бит BUSY.
Из-за чего может быть?

Проверяйте отработку слейва по ACK-NACK.
Возможно также, что в этом случае "залип" мастер, ожидающий готовности slave.
Посмотрите осцилографом, что твроится на шине. А лучше лог. анализатором.

Кроме того ожидание в стиле
while( GetState() ) { forever} не феншуй, по причине возможного зависания и постоянного дергания опрашиваемой периферии.
(если это не опрос флага-переменной, которая устанавливается в векторе прерывания)
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Oct 6 2016, 08:47
Сообщение #20


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

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



Цитата(Метценгерштейн @ May 31 2016, 17:20) *
при работе с другим МК STM32 в качестве мастера, все ок.
Как только подключаюсь к другой железке, она мастер, принимаю один пакет, а после второго пакета висну, в регистре ISR висит бит BUSY.
Из-за чего может быть?

Побороть не удалось. HAL на кубе, применительно к 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 Текстовая версия Сейчас: 3rd August 2025 - 00:06
Рейтинг@Mail.ru


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