Метценгерштейн 0 1 апреля, 2016 Опубликовано 1 апреля, 2016 · Жалоба Не могу понять- если я в слейве хочу принимать данные на прерываниях, то эта ф-я сама будет вызываться что-ли? Или мне ее крутить самому надо в вечном цикле? Почему тогда она к прерываниям относится? Если это просто опрос ф-ии? Просто логику не понять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 6 апреля, 2016 Опубликовано 6 апреля, 2016 (изменено) · Жалоба Не могу понять- если я в слейве хочу принимать данные на прерываниях, то эта ф-я сама будет вызываться что-ли? Или мне ее крутить самому надо в вечном цикле? Почему тогда она к прерываниям относится? Если это просто опрос ф-ии? Просто логику не понять. Как я понял Вам нужна колбэк функция. Которая вызовется после окончания приема. Если проэкт генерился в КубеМХ. 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 должна вызываться сама, цикл не нужен. Изменено 6 апреля, 2016 пользователем Neo_Matrix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 14 апреля, 2016 Опубликовано 14 апреля, 2016 · Жалоба Спасибо. Итак, HAL_I2C_Slave_Receive_IT вызывается сама по окончании приема, без цикла опроса. HAL_I2C_SlaveRxCpltCallback() это откуда взялось? Её мне как-то надо использовать? Или достаточно первой? Да, проект в кубе сгенерён. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 14 апреля, 2016 Опубликовано 14 апреля, 2016 · Жалоба HAL_I2C_SlaveRxCpltCallback() это откуда взялось? Её мне как-то надо использовать? Или достаточно первой? Там есть затычка-пустышка с атрибутом __weak. А Вам нужно написать нужное Вам без этого атрибута. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 14 апреля, 2016 Опубликовано 14 апреля, 2016 · Жалоба т.е. я переписываю у себя ф-ю HAL_I2C_SlaveRxCpltCallback() куда происходит вызов при получении данных в прерывании? А HAL_I2C_Slave_Receive_IT как-то использую? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 14 апреля, 2016 Опубликовано 14 апреля, 2016 · Жалоба Как то придется использовать I2C_TwoBoards_ComIT Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 15 апреля, 2016 Опубликовано 15 апреля, 2016 · Жалоба раньше была кнопка dowload zip, теперь нет её. git-clone выдает ошибку на ссылку. Только в браузере могу просмотреть. Выкачать можно от туда? И как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 15 апреля, 2016 Опубликовано 15 апреля, 2016 · Жалоба Надо перейти в корень хранилища и там всё есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 15 апреля, 2016 Опубликовано 15 апреля, 2016 · Жалоба а так ? STM32Cube_FW_F4 Хотя все эти примеры есть локально в хранилище Куба (путь есть в настройках Куба) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 15 апреля, 2016 Опубликовано 15 апреля, 2016 · Жалоба Это не принципиально- как с гита скачать. Можно и просто текст скопировать было. Тем не менее, вопрос остается. Попробую еще раз переформулировать его. есть ф-я 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(); } Получается, надо единожды передать ей массив и размер и структуру? Дальше само на прерываниях будут приниматься значения в массив? дополню вопрос- чтобы еще раз получить сообщение в режиме слейва мне что надо сделать? Ждать, пока массив обновится или вызывать повторно эту ф-ю? Вот что не ясно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 16 апреля, 2016 Опубликовано 16 апреля, 2016 · Жалоба Конечно надо её вызывать. По коду видно что после приема нужного кол-ва байт прерывания запрещаются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 16 апреля, 2016 Опубликовано 16 апреля, 2016 · Жалоба т.е. чтобы получить новую порцию байт- вызываю ф-ю HAL_I2C_Slave_Receive_IT я ее вызываю, она активна, как только там данные пришли, на их получила? Или вызвав ее, если нету данных, то ничего потом не будет принято? Если данные позже придут. Подглядел на ютубе- вызывание делается в ф-ии HAL_I2C_SlaveRxCpltCallback Это оптимальное решение, наверное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 19 апреля, 2016 Опубликовано 19 апреля, 2016 · Жалоба Вот честно, так и нет ясности- для приема в режиме мастера или слейва на прерываниях, надо как вызывать ф-ю? Чтобы при приходе адреса данного I2C устройства, происходили прерывания и выполнялась ф-я? Не крутить же ее все время? Что это за прерывания тогда такие? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба Разобрался немного. Чтобы принять данные на прерываниях в режиме слейва, надо делать так: До входа в основную петлю вызываем ф-ю 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 запрещаются. Мы т.о. снова их разрешаем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Метценгерштейн 0 12 мая, 2016 Опубликовано 12 мая, 2016 · Жалоба еще вопрос- как при приеме в ф-ю HAL_I2C_Slave_Receive_IT данных из вне от мастера, узнать, сколько байт было передано и реально принято? Не нашел в I2C счетчика принятых байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться