Вопрос или проблема
У меня есть функция обратного вызова для моего Slave.
void i2c::lpi2c_slave_callback(LPI2C_Type *base,
lpi2c_slave_transfer_t *xfer,
void *param) {
switch (xfer->event) {
case kLPI2C_SlaveAddressMatchEvent:
xfer->data = nullptr;
xfer->dataSize = 0;
break;
case kLPI2C_SlaveTransmitEvent:
xfer->data = m_slave_buff[1];
xfer->dataSize = sizeof(m_slave_buff);
break;
case kLPI2C_SlaveReceiveEvent:
xfer->data = m_slave_buff;
xfer->dataSize = sizeof(m_slave_buff);
break;
case kLPI2C_SlaveCompletionEvent:
m_SlaveCompletionFlag = true;
/* как узнать о завершении приема и передачи? Есть ли какие-либо флаги, чтобы узнать, завершен ли прием или передача? */
break;
default:
m_SlaveCompletionFlag = false;
break;
}
}
Как упомянуто в многострочном комментарии, как узнать о завершении приема и передачи, есть ли какие-либо флаги, чтобы выяснить, завершен ли прием или передача?
Можете ли вы сообщить мне, какой флаг мне нужно добавить. Спасибо заранее.
Я ожидаю, что когда произойдет kLPI2C_SlaveCompletionEvent, мне нужен флаг, который указывает на то, что происходит прием и передача.
Ответ или решение
Для корректного определения завершения операций передачи и получения в вашей функции обратного вызова lpi2c_slave_callback
, необходимо внести некоторые изменения в вашу логику обработки событий. В приведенном вами коде, при возникновении события kLPI2C_SlaveCompletionEvent
, вы сохраняете флаг завершения, однако не указываете, было ли это завершение передачи или получения.
Решение проблемы
Чтобы отличать полное завершение передачи от полного завершения получения, можно использовать дополнительные флаги внутри структуры lpi2c_slave_transfer_t
. Для этого выполните следующие шаги:
-
Добавление флагов в структуру
lpi2c_slave_transfer_t
:
Вам нужно будет добавить поля в структуруlpi2c_slave_transfer_t
, если они ещё не присутствуют, чтобы отслеживать состояние передачи и получения.Например:
typedef struct _lpi2c_slave_transfer_t { ... bool transmitComplete; bool receiveComplete; } lpi2c_slave_transfer_t;
-
Обновление флагов в случае событий передачи и получения:
Когда будет вызванkLPI2C_SlaveTransmitEvent
, установите флагtransmitComplete
, и аналогично – дляkLPI2C_SlaveReceiveEvent
.Обновленный код будет выглядеть так:
void i2c::lpi2c_slave_callback(LPI2C_Type *base, lpi2c_slave_transfer_t *xfer, void *param) { switch (xfer->event) { case kLPI2C_SlaveAddressMatchEvent: xfer->data = nullptr; xfer->dataSize = 0; break; case kLPI2C_SlaveTransmitEvent: xfer->data = m_slave_buff[1]; xfer->dataSize = sizeof(m_slave_buff); xfer->transmitComplete = false; // Индикатор передачи не завершен break; case kLPI2C_SlaveReceiveEvent: xfer->data = m_slave_buff; xfer->dataSize = sizeof(m_slave_buff); xfer->receiveComplete = false; // Индикатор получения не завершен break; case kLPI2C_SlaveCompletionEvent: if (xfer->receiveComplete) { // Получение завершено m_SlaveCompletionFlag = true; // Обработка завершенной передачи } else if (xfer->transmitComplete) { // Передача завершена m_SlaveCompletionFlag = true; // Обработка завершенной передачи } break; default: m_SlaveCompletionFlag = false; break; } }
-
Очистка флагов:
Важно помнить, что флагиtransmitComplete
иreceiveComplete
нужно сбрасывать по завершении обработки следующего события, чтобы они не сохраняли ненужные значения.
Заключение
В приведенных выше изменениях добавление индивидуальных флагов для отслеживания завершения передачи и получения, а также обновление их состояния в зависимости от вызванного события позволит вам более надежно управлять логикой обработки данных I2C. Теперь, когда kLPI2C_SlaveCompletionEvent
вызывается, вы сможете определить, какая операция завершилась, и соответственно адаптировать логику обработки.