180 #ifdef HAL_SMBUS_MODULE_ENABLED
187 #define SMBUS_TIMEOUT_FLAG 35U
188 #define SMBUS_TIMEOUT_BUSY_FLAG 25U
189 #define SMBUS_NO_OPTION_FRAME 0xFFFF0000U
191 #define SMBUS_SENDPEC_MODE I2C_CR1_PEC
192 #define SMBUS_GET_PEC(__HANDLE__) (((__HANDLE__)->Instance->SR2 & I2C_SR2_PEC) >> 8)
195 #define SMBUS_STATE_MSK ((uint32_t)((HAL_SMBUS_STATE_BUSY_TX | HAL_SMBUS_STATE_BUSY_RX) & (~(uint32_t)HAL_SMBUS_STATE_READY)))
196 #define SMBUS_STATE_NONE ((uint32_t)(HAL_SMBUS_MODE_NONE))
197 #define SMBUS_STATE_MASTER_BUSY_TX ((uint32_t)((HAL_SMBUS_STATE_BUSY_TX & SMBUS_STATE_MSK) | HAL_SMBUS_MODE_MASTER))
198 #define SMBUS_STATE_MASTER_BUSY_RX ((uint32_t)((HAL_SMBUS_STATE_BUSY_RX & SMBUS_STATE_MSK) | HAL_SMBUS_MODE_MASTER))
199 #define SMBUS_STATE_SLAVE_BUSY_TX ((uint32_t)((HAL_SMBUS_STATE_BUSY_TX & SMBUS_STATE_MSK) | HAL_SMBUS_MODE_SLAVE))
200 #define SMBUS_STATE_SLAVE_BUSY_RX ((uint32_t)((HAL_SMBUS_STATE_BUSY_RX & SMBUS_STATE_MSK) | HAL_SMBUS_MODE_SLAVE))
214 static HAL_StatusTypeDef SMBUS_WaitOnFlagUntilTimeout(
SMBUS_HandleTypeDef *hsmbus, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart);
284 uint32_t freqrange = 0U;
294 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->
Instance));
295 #if defined(I2C_FLTR_ANOFF)
311 hsmbus->
Lock = HAL_UNLOCKED;
313 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
340 __HAL_SMBUS_DISABLE(hsmbus);
346 freqrange = SMBUS_FREQRANGE(pclk1);
350 MODIFY_REG(hsmbus->
Instance->CR2, I2C_CR2_FREQ, freqrange);
354 MODIFY_REG(hsmbus->
Instance->TRISE, I2C_TRISE_TRISE, SMBUS_RISE_TIME(freqrange));
358 MODIFY_REG(hsmbus->
Instance->CCR, (I2C_CCR_FS | I2C_CCR_DUTY | I2C_CCR_CCR), SMBUS_SPEED_STANDARD(pclk1, hsmbus->
Init.
ClockSpeed));
371 #if defined(I2C_FLTR_ANOFF)
378 __HAL_SMBUS_ENABLE(hsmbus);
380 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
404 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->
Instance));
409 __HAL_SMBUS_DISABLE(hsmbus);
411 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
424 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
430 __HAL_UNLOCK(hsmbus);
465 #if defined(I2C_FLTR_ANOFF)&&defined(I2C_FLTR_DNF)
476 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->
Instance));
477 assert_param(IS_SMBUS_ANALOG_FILTER(AnalogFilter));
484 __HAL_SMBUS_DISABLE(hsmbus);
487 hsmbus->
Instance->FLTR &= ~(I2C_FLTR_ANOFF);
490 hsmbus->
Instance->FLTR |= AnalogFilter;
492 __HAL_SMBUS_ENABLE(hsmbus);
516 assert_param(IS_SMBUS_ALL_INSTANCE(hsmbus->
Instance));
517 assert_param(IS_SMBUS_DIGITAL_FILTER(DigitalFilter));
524 __HAL_SMBUS_DISABLE(hsmbus);
530 tmpreg &= ~(I2C_FLTR_DNF);
533 tmpreg |= DigitalFilter;
538 __HAL_SMBUS_ENABLE(hsmbus);
550 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
572 HAL_StatusTypeDef status = HAL_OK;
574 if (pCallback == NULL)
577 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
626 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
647 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
657 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
664 __HAL_UNLOCK(hsmbus);
689 HAL_StatusTypeDef status = HAL_OK;
736 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
757 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
767 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
774 __HAL_UNLOCK(hsmbus);
788 HAL_StatusTypeDef status = HAL_OK;
790 if (pCallback == NULL)
804 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
811 __HAL_UNLOCK(hsmbus);
824 HAL_StatusTypeDef status = HAL_OK;
836 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_INVALID_CALLBACK;
843 __HAL_UNLOCK(hsmbus);
920 uint32_t count = 0x00U;
923 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
928 if ((XferOptions == SMBUS_FIRST_AND_LAST_FRAME_NO_PEC) || (XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (XferOptions == SMBUS_FIRST_FRAME))
931 count = SMBUS_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
940 __HAL_UNLOCK(hsmbus);
945 while (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_BUSY) != RESET);
952 if ((hsmbus->
Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
955 __HAL_SMBUS_ENABLE(hsmbus);
959 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
962 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
973 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_START);
976 __HAL_UNLOCK(hsmbus);
983 __HAL_SMBUS_ENABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1005 __IO uint32_t count = 0U;
1008 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1013 if ((XferOptions == SMBUS_FIRST_AND_LAST_FRAME_NO_PEC) || (XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (XferOptions == SMBUS_FIRST_FRAME))
1016 count = SMBUS_TIMEOUT_BUSY_FLAG * (SystemCoreClock / 25U / 1000U);
1025 __HAL_UNLOCK(hsmbus);
1030 while (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_BUSY) != RESET);
1037 if ((hsmbus->
Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1040 __HAL_SMBUS_ENABLE(hsmbus);
1044 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
1047 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
1060 if ((XferOptions == SMBUS_NEXT_FRAME) || (XferOptions == SMBUS_FIRST_AND_LAST_FRAME_NO_PEC) || (XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (XferOptions == SMBUS_FIRST_FRAME) || (XferOptions == SMBUS_NO_OPTION_FRAME))
1063 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
1066 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_START);
1069 if ((XferOptions == SMBUS_LAST_FRAME_NO_PEC) || (XferOptions == SMBUS_LAST_FRAME_WITH_PEC))
1074 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
1080 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
1083 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_START);
1091 __HAL_UNLOCK(hsmbus);
1098 __HAL_SMBUS_ENABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1126 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
1133 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
1136 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
1141 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1144 __HAL_UNLOCK(hsmbus);
1147 SMBUS_ITError(hsmbus);
1170 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1174 if ((pData == NULL) || (Size == 0U))
1183 if ((hsmbus->
Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1186 __HAL_SMBUS_ENABLE(hsmbus);
1190 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
1193 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
1204 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
1207 __HAL_UNLOCK(hsmbus);
1214 __HAL_SMBUS_ENABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1236 assert_param(IS_SMBUS_TRANSFER_OPTIONS_REQUEST(XferOptions));
1240 if ((pData == NULL) || (Size == 0U))
1249 if ((hsmbus->
Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1252 __HAL_SMBUS_ENABLE(hsmbus);
1256 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
1259 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
1270 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
1273 __HAL_UNLOCK(hsmbus);
1280 __HAL_SMBUS_ENABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1304 if ((hsmbus->
Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1307 __HAL_SMBUS_ENABLE(hsmbus);
1311 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
1314 __HAL_SMBUS_ENABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_ERR);
1338 tmp = (uint32_t)(hsmbus->
State) & SMBUS_STATE_MSK;
1344 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
1347 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_ERR);
1366 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ALERT);
1369 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_SMBALERT);
1372 __HAL_SMBUS_ENABLE_IT(hsmbus, SMBUS_IT_ERR);
1385 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ALERT);
1388 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_ERR);
1406 uint32_t tickstart = 0U, tmp1 = 0U, tmp2 = 0U, tmp3 = 0U, SMBUS_Trials = 1U;
1414 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_BUSY, SET, SMBUS_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1423 if ((hsmbus->
Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE)
1426 __HAL_SMBUS_ENABLE(hsmbus);
1430 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
1433 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
1439 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_START);
1442 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_SB, RESET, Timeout, tickstart) != HAL_OK)
1448 hsmbus->
Instance->DR = SMBUS_7BIT_ADD_WRITE(DevAddress);
1454 tmp1 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_ADDR);
1455 tmp2 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF);
1456 tmp3 = hsmbus->
State;
1459 if ((Timeout == 0U) || ((
HAL_GetTick() - tickstart) > Timeout))
1463 tmp1 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_ADDR);
1464 tmp2 = __HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_AF);
1465 tmp3 = hsmbus->
State;
1471 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_ADDR) == SET)
1474 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
1477 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
1480 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_BUSY, SET, SMBUS_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1488 __HAL_UNLOCK(hsmbus);
1495 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
1498 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
1501 if (SMBUS_WaitOnFlagUntilTimeout(hsmbus, SMBUS_FLAG_BUSY, SET, SMBUS_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
1507 while (SMBUS_Trials++ < Trials);
1512 __HAL_UNLOCK(hsmbus);
1530 uint32_t sr2itflags = READ_REG(hsmbus->
Instance->SR2);
1531 uint32_t sr1itflags = READ_REG(hsmbus->
Instance->SR1);
1532 uint32_t itsources = READ_REG(hsmbus->
Instance->CR2);
1534 uint32_t CurrentMode = hsmbus->
Mode;
1540 if (((sr1itflags & SMBUS_FLAG_SB) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1542 SMBUS_Master_SB(hsmbus);
1545 else if (((sr1itflags & SMBUS_FLAG_ADD10) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1547 SMBUS_Master_ADD10(hsmbus);
1550 else if (((sr1itflags & SMBUS_FLAG_ADDR) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1552 SMBUS_Master_ADDR(hsmbus);
1555 if ((sr2itflags & SMBUS_FLAG_TRA) != RESET)
1558 if (((sr1itflags & SMBUS_FLAG_TXE) != RESET) && ((itsources & SMBUS_IT_BUF) != RESET) && ((sr1itflags & SMBUS_FLAG_BTF) == RESET))
1560 SMBUS_MasterTransmit_TXE(hsmbus);
1563 else if (((sr1itflags & SMBUS_FLAG_BTF) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1565 SMBUS_MasterTransmit_BTF(hsmbus);
1572 if (((sr1itflags & SMBUS_FLAG_RXNE) != RESET) && ((itsources & SMBUS_IT_BUF) != RESET) && ((sr1itflags & SMBUS_FLAG_BTF) == RESET))
1574 SMBUS_MasterReceive_RXNE(hsmbus);
1577 else if (((sr1itflags & SMBUS_FLAG_BTF) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1579 SMBUS_MasterReceive_BTF(hsmbus);
1587 if (((sr1itflags & SMBUS_FLAG_ADDR) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1589 SMBUS_Slave_ADDR(hsmbus);
1592 else if (((sr1itflags & SMBUS_FLAG_STOPF) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1594 SMBUS_Slave_STOPF(hsmbus);
1597 else if ((sr2itflags & SMBUS_FLAG_TRA) != RESET)
1600 if (((sr1itflags & SMBUS_FLAG_TXE) != RESET) && ((itsources & SMBUS_IT_BUF) != RESET) && ((sr1itflags & SMBUS_FLAG_BTF) == RESET))
1602 SMBUS_SlaveTransmit_TXE(hsmbus);
1605 else if (((sr1itflags & SMBUS_FLAG_BTF) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1607 SMBUS_SlaveTransmit_BTF(hsmbus);
1614 if (((sr1itflags & SMBUS_FLAG_RXNE) != RESET) && ((itsources & SMBUS_IT_BUF) != RESET) && ((sr1itflags & SMBUS_FLAG_BTF) == RESET))
1616 SMBUS_SlaveReceive_RXNE(hsmbus);
1619 else if (((sr1itflags & SMBUS_FLAG_BTF) != RESET) && ((itsources & SMBUS_IT_EVT) != RESET))
1621 SMBUS_SlaveReceive_BTF(hsmbus);
1635 uint32_t tmp1 = 0U, tmp2 = 0U, tmp3 = 0U, tmp4 = 0U;
1636 uint32_t sr1itflags = READ_REG(hsmbus->
Instance->SR1);
1637 uint32_t itsources = READ_REG(hsmbus->
Instance->CR2);
1640 if (((sr1itflags & SMBUS_FLAG_BERR) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1642 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_BERR;
1645 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_BERR);
1650 if (((sr1itflags & SMBUS_FLAG_OVR) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1652 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_OVR;
1655 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_OVR);
1659 if (((sr1itflags & SMBUS_FLAG_ARLO) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1661 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_ARLO;
1664 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_ARLO);
1668 if (((sr1itflags & SMBUS_FLAG_AF) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1670 tmp1 = hsmbus->
Mode;
1672 tmp3 = hsmbus->
State;
1679 SMBUS_Slave_AF(hsmbus);
1683 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_AF;
1689 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
1694 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
1697 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1700 SMBUS_Flush_DR(hsmbus);
1705 if (((sr1itflags & SMBUS_FLAG_TIMEOUT) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1707 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_TIMEOUT;
1710 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_TIMEOUT);
1715 if (((sr1itflags & SMBUS_FLAG_SMBALERT) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1717 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_ALERT;
1720 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_SMBALERT);
1724 if (((sr1itflags & SMBUS_FLAG_PECERR) != RESET) && ((itsources & SMBUS_IT_ERR) != RESET))
1726 hsmbus->
ErrorCode |= HAL_SMBUS_ERROR_PECERR;
1729 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_PECERR);
1733 if (hsmbus->
ErrorCode != HAL_SMBUS_ERROR_NONE)
1735 SMBUS_ITError(hsmbus);
1814 UNUSED(TransferDirection);
1815 UNUSED(AddrMatchCode);
1898 return hsmbus->
State;
1909 return hsmbus->
Mode;
1944 uint32_t CurrentState = hsmbus->
State;
1945 uint32_t CurrentXferOptions = hsmbus->
XferOptions;
1950 if (((CurrentXferOptions == SMBUS_FIRST_FRAME) || (CurrentXferOptions == SMBUS_NEXT_FRAME)) && (CurrentXferOptions != SMBUS_NO_OPTION_FRAME))
1952 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1958 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
1967 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
1970 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
1976 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
1986 if ((hsmbus->
XferCount == 2U) && (SMBUS_GET_PEC_MODE(hsmbus) == SMBUS_PEC_ENABLE) && ((hsmbus->
XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (hsmbus->
XferOptions == SMBUS_LAST_FRAME_WITH_PEC)))
1995 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_BUF);
1997 if ((SMBUS_GET_PEC_MODE(hsmbus) == SMBUS_PEC_ENABLE) && ((hsmbus->
XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (hsmbus->
XferOptions == SMBUS_LAST_FRAME_WITH_PEC)))
1999 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_PEC);
2022 uint32_t CurrentXferOptions = hsmbus->
XferOptions;
2035 if (((CurrentXferOptions == SMBUS_FIRST_FRAME) || (CurrentXferOptions == SMBUS_NEXT_FRAME)) && (CurrentXferOptions != SMBUS_NO_OPTION_FRAME))
2037 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
2043 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2052 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
2055 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
2060 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2080 uint32_t CurrentXferOptions = hsmbus->
XferOptions;
2097 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_BUF);
2108 if ((CurrentXferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (CurrentXferOptions == SMBUS_LAST_FRAME_WITH_PEC))
2111 hsmbus->
XferPEC = SMBUS_GET_PEC(hsmbus);
2115 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
2118 else if ((tmp == 1U) || (tmp == 0U))
2121 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2124 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
2134 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2154 uint32_t CurrentXferOptions = hsmbus->
XferOptions;
2160 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_BUF);
2165 hsmbus->
XferPEC = SMBUS_GET_PEC(hsmbus);
2171 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_BUF);
2174 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2179 hsmbus->
XferPEC = SMBUS_GET_PEC(hsmbus);
2184 if ((CurrentXferOptions == SMBUS_NEXT_FRAME) || (CurrentXferOptions == SMBUS_FIRST_FRAME))
2187 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2190 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_START);
2195 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
2207 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_ERR);
2212 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2293 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2296 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_START);
2306 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2309 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
2314 if ((hsmbus->
XferOptions == SMBUS_FIRST_FRAME) && (Prev_State != SMBUS_STATE_MASTER_BUSY_RX))
2317 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2320 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2322 else if ((hsmbus->
XferOptions == SMBUS_NEXT_FRAME) && (Prev_State != SMBUS_STATE_MASTER_BUSY_RX))
2325 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2328 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2333 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2336 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2339 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_STOP);
2347 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2350 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
2357 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2361 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2366 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2369 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2379 __HAL_SMBUS_CLEAR_ADDRFLAG(hsmbus);
2394 uint32_t CurrentState = hsmbus->
State;
2402 if ((hsmbus->
XferCount == 2U) && (SMBUS_GET_PEC_MODE(hsmbus) == SMBUS_PEC_ENABLE) && ((hsmbus->
XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (hsmbus->
XferOptions == SMBUS_LAST_FRAME_WITH_PEC)))
2410 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_BUF);
2417 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2444 else if ((hsmbus->
XferCount == 0U) && (SMBUS_GET_PEC_MODE(hsmbus) == SMBUS_PEC_ENABLE) && ((hsmbus->
XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (hsmbus->
XferOptions == SMBUS_LAST_FRAME_WITH_PEC)))
2446 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_PEC);
2460 uint32_t CurrentState = hsmbus->
State;
2468 if ((hsmbus->
XferCount == 1U) && (SMBUS_GET_PEC_MODE(hsmbus) == SMBUS_PEC_ENABLE) && ((hsmbus->
XferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || (hsmbus->
XferOptions == SMBUS_LAST_FRAME_WITH_PEC)))
2470 SET_BIT(hsmbus->
Instance->CR1, I2C_CR1_PEC);
2471 hsmbus->
XferPEC = SMBUS_GET_PEC(hsmbus);
2476 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_BUF);
2483 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2519 uint8_t TransferDirection = SMBUS_DIRECTION_RECEIVE ;
2520 uint16_t SlaveAddrCode = 0U;
2523 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_TRA) == RESET)
2525 TransferDirection = SMBUS_DIRECTION_TRANSMIT;
2528 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_DUALF) == RESET)
2538 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2539 hsmbus->
AddrCallback(hsmbus, TransferDirection, SlaveAddrCode);
2556 uint32_t CurrentState = hsmbus->
State;
2559 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
2562 __HAL_SMBUS_CLEAR_STOPFLAG(hsmbus);
2565 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2571 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_BTF) == SET)
2584 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_RXNE) == SET)
2597 if (hsmbus->
ErrorCode != HAL_SMBUS_ERROR_NONE)
2600 SMBUS_ITError(hsmbus);
2612 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2630 uint32_t CurrentState = hsmbus->
State;
2631 uint32_t CurrentXferOptions = hsmbus->
XferOptions;
2633 if (((CurrentXferOptions == SMBUS_FIRST_AND_LAST_FRAME_NO_PEC) || (CurrentXferOptions == SMBUS_FIRST_AND_LAST_FRAME_WITH_PEC) || \
2634 (CurrentXferOptions == SMBUS_LAST_FRAME_NO_PEC) || (CurrentXferOptions == SMBUS_LAST_FRAME_WITH_PEC)) && \
2640 __HAL_SMBUS_DISABLE_IT(hsmbus, SMBUS_IT_EVT | SMBUS_IT_BUF | SMBUS_IT_ERR);
2643 __HAL_SMBUS_CLEAR_FLAG(hsmbus, SMBUS_FLAG_AF);
2646 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_ACK);
2653 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2672 uint32_t CurrentState = hsmbus->
State;
2693 CLEAR_BIT(hsmbus->
Instance->CR1, I2C_CR1_POS);
2698 hsmbus->
ErrorCode = HAL_SMBUS_ERROR_NONE;
2701 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_RXNE) == SET)
2708 __HAL_SMBUS_DISABLE(hsmbus);
2711 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2720 if (__HAL_SMBUS_GET_FLAG(hsmbus, SMBUS_FLAG_RXNE) == SET)
2727 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2744 #if (USE_HAL_SMBUS_REGISTER_CALLBACKS == 1)
2762 static HAL_StatusTypeDef SMBUS_WaitOnFlagUntilTimeout(
SMBUS_HandleTypeDef *hsmbus, uint32_t Flag, FlagStatus Status, uint32_t Timeout, uint32_t Tickstart)
2765 if (Status == RESET)
2767 while (__HAL_SMBUS_GET_FLAG(hsmbus, Flag) == RESET)
2770 if (Timeout != HAL_MAX_DELAY)
2772 if ((Timeout == 0U) || ((
HAL_GetTick() - Tickstart) > Timeout))
2779 __HAL_UNLOCK(hsmbus);
uint32_t HAL_GetTick(void)
Provides a tick value in millisecond.
uint32_t HAL_RCC_GetPCLK1Freq(void)
Returns the PCLK1 frequency.
HAL_StatusTypeDef HAL_SMBUS_UnRegisterAddrCallback(SMBUS_HandleTypeDef *hsmbus)
UnRegister the Slave Address Match SMBUS Callback Info Ready SMBUS Callback is redirected to the weak...
HAL_StatusTypeDef HAL_SMBUS_RegisterAddrCallback(SMBUS_HandleTypeDef *hsmbus, pSMBUS_AddrCallbackTypeDef pCallback)
Register the Slave Address Match SMBUS Callback To be used instead of the weak HAL_SMBUS_AddrCallback...
HAL_StatusTypeDef HAL_SMBUS_DeInit(SMBUS_HandleTypeDef *hsmbus)
DeInitializes the SMBUS peripheral.
void HAL_SMBUS_MspDeInit(SMBUS_HandleTypeDef *hsmbus)
DeInitialize the SMBUS MSP.
HAL_StatusTypeDef HAL_SMBUS_UnRegisterCallback(SMBUS_HandleTypeDef *hsmbus, HAL_SMBUS_CallbackIDTypeDef CallbackID)
Unregister an SMBUS Callback SMBUS callback is redirected to the weak predefined callback.
HAL_StatusTypeDef HAL_SMBUS_RegisterCallback(SMBUS_HandleTypeDef *hsmbus, HAL_SMBUS_CallbackIDTypeDef CallbackID, pSMBUS_CallbackTypeDef pCallback)
Register a User SMBUS Callback To be used instead of the weak predefined callback.
HAL_StatusTypeDef HAL_SMBUS_ConfigAnalogFilter(SMBUS_HandleTypeDef *hsmbus, uint32_t AnalogFilter)
Configures SMBUS Analog noise filter.
void HAL_SMBUS_MspInit(SMBUS_HandleTypeDef *hsmbus)
Initialize the SMBUS MSP.
HAL_StatusTypeDef HAL_SMBUS_ConfigDigitalFilter(SMBUS_HandleTypeDef *hsmbus, uint32_t DigitalFilter)
Configures SMBUS Digital noise filter.
HAL_StatusTypeDef HAL_SMBUS_Init(SMBUS_HandleTypeDef *hsmbus)
Initializes the SMBUS according to the specified parameters in the SMBUS_InitTypeDef and initialize t...
__weak void HAL_SMBUS_SlaveRxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
Slave Rx Transfer completed callback.
HAL_StatusTypeDef HAL_SMBUS_DisableListen_IT(SMBUS_HandleTypeDef *hsmbus)
Disable the Address listen mode with Interrupt.
__weak void HAL_SMBUS_AddrCallback(SMBUS_HandleTypeDef *hsmbus, uint8_t TransferDirection, uint16_t AddrMatchCode)
Slave Address Match callback.
void HAL_SMBUS_EV_IRQHandler(SMBUS_HandleTypeDef *hsmbus)
This function handles SMBUS event interrupt request.
HAL_StatusTypeDef HAL_SMBUS_DisableAlert_IT(SMBUS_HandleTypeDef *hsmbus)
Disable the SMBUS alert mode with Interrupt.
HAL_StatusTypeDef HAL_SMBUS_EnableAlert_IT(SMBUS_HandleTypeDef *hsmbus)
Enable the SMBUS alert mode with Interrupt.
__weak void HAL_SMBUS_ErrorCallback(SMBUS_HandleTypeDef *hsmbus)
SMBUS error callback.
__weak void HAL_SMBUS_MasterRxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
Master Rx Transfer completed callback.
HAL_StatusTypeDef HAL_SMBUS_EnableListen_IT(SMBUS_HandleTypeDef *hsmbus)
Enable the Address listen mode with Interrupt.
HAL_StatusTypeDef HAL_SMBUS_Master_Abort_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress)
Abort a master/host SMBUS process communication with Interrupt.
HAL_StatusTypeDef HAL_SMBUS_Slave_Receive_IT(SMBUS_HandleTypeDef *hsmbus, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Enable the Address listen mode with Interrupt.
__weak void HAL_SMBUS_MasterTxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
Master Tx Transfer completed callback.
HAL_StatusTypeDef HAL_SMBUS_Master_Receive_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Receive in master/host SMBUS mode an amount of data in non blocking mode with Interrupt.
void HAL_SMBUS_ER_IRQHandler(SMBUS_HandleTypeDef *hsmbus)
This function handles SMBUS error interrupt request.
HAL_StatusTypeDef HAL_SMBUS_Master_Transmit_IT(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Transmits in master mode an amount of data in blocking mode.
HAL_StatusTypeDef HAL_SMBUS_IsDeviceReady(SMBUS_HandleTypeDef *hsmbus, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout)
Check if target device is ready for communication.
__weak void HAL_SMBUS_AbortCpltCallback(SMBUS_HandleTypeDef *hsmbus)
SMBUS abort callback.
HAL_StatusTypeDef HAL_SMBUS_Slave_Transmit_IT(SMBUS_HandleTypeDef *hsmbus, uint8_t *pData, uint16_t Size, uint32_t XferOptions)
Transmit in slave/device SMBUS mode an amount of data in non blocking mode with Interrupt.
__weak void HAL_SMBUS_ListenCpltCallback(SMBUS_HandleTypeDef *hsmbus)
Listen Complete callback.
__weak void HAL_SMBUS_SlaveTxCpltCallback(SMBUS_HandleTypeDef *hsmbus)
Slave Tx Transfer completed callback.
uint32_t HAL_SMBUS_GetError(SMBUS_HandleTypeDef *hsmbus)
Return the SMBUS error code.
HAL_SMBUS_StateTypeDef HAL_SMBUS_GetState(SMBUS_HandleTypeDef *hsmbus)
Return the SMBUS handle state.
HAL_SMBUS_ModeTypeDef HAL_SMBUS_GetMode(SMBUS_HandleTypeDef *hsmbus)
Return the SMBUS Master, Slave or no mode.
void(* SlaveTxCpltCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
void(* AddrCallback)(struct __SMBUS_HandleTypeDef *hsmbus, uint8_t TransferDirection, uint16_t AddrMatchCode)
__IO HAL_SMBUS_StateTypeDef State
void(* MasterRxCpltCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
uint32_t PacketErrorCheckMode
__IO uint32_t PreviousState
void(* ErrorCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
__IO uint32_t XferOptions
void(* MasterTxCpltCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
void(* ListenCpltCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
void(* MspDeInitCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
void(* SlaveRxCpltCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
void(* AbortCpltCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
void(* MspInitCallback)(struct __SMBUS_HandleTypeDef *hsmbus)
__IO HAL_SMBUS_ModeTypeDef Mode
HAL_SMBUS_CallbackIDTypeDef
HAL SMBUS Callback ID enumeration definition.
HAL_SMBUS_StateTypeDef
HAL State structure definition.
void(* pSMBUS_CallbackTypeDef)(SMBUS_HandleTypeDef *hsmbus)
HAL SMBUS Callback pointer definition.
void(* pSMBUS_AddrCallbackTypeDef)(SMBUS_HandleTypeDef *hsmbus, uint8_t TransferDirection, uint16_t AddrMatchCode)
HAL_SMBUS_ModeTypeDef
HAL Mode structure definition.
@ HAL_SMBUS_MSPINIT_CB_ID
@ HAL_SMBUS_MASTER_TX_COMPLETE_CB_ID
@ HAL_SMBUS_MSPDEINIT_CB_ID
@ HAL_SMBUS_MASTER_RX_COMPLETE_CB_ID
@ HAL_SMBUS_SLAVE_TX_COMPLETE_CB_ID
@ HAL_SMBUS_SLAVE_RX_COMPLETE_CB_ID
@ HAL_SMBUS_LISTEN_COMPLETE_CB_ID
@ HAL_SMBUS_STATE_TIMEOUT
@ HAL_SMBUS_STATE_BUSY_RX
@ HAL_SMBUS_STATE_BUSY_RX_LISTEN
@ HAL_SMBUS_STATE_BUSY_TX_LISTEN
@ HAL_SMBUS_STATE_BUSY_TX
SMBUS handle Structure definition.
This file contains all the functions prototypes for the HAL module driver.