File indexing completed on 2025-05-11 08:23:08
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323 #include "stm32h7xx_hal.h"
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335 #ifdef HAL_I2C_MODULE_ENABLED
0336
0337
0338
0339
0340
0341
0342
0343
0344 #define TIMING_CLEAR_MASK (0xF0FFFFFFU)
0345 #define I2C_TIMEOUT_ADDR (10000U)
0346 #define I2C_TIMEOUT_BUSY (25U)
0347 #define I2C_TIMEOUT_DIR (25U)
0348 #define I2C_TIMEOUT_RXNE (25U)
0349 #define I2C_TIMEOUT_STOPF (25U)
0350 #define I2C_TIMEOUT_TC (25U)
0351 #define I2C_TIMEOUT_TCR (25U)
0352 #define I2C_TIMEOUT_TXIS (25U)
0353 #define I2C_TIMEOUT_FLAG (25U)
0354
0355 #define MAX_NBYTE_SIZE 255U
0356 #define SLAVE_ADDR_SHIFT 7U
0357 #define SLAVE_ADDR_MSK 0x06U
0358
0359
0360 #define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | \
0361 (uint32_t)HAL_I2C_STATE_BUSY_RX) & \
0362 (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY))))
0363
0364 #define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE))
0365
0366 #define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \
0367 (uint32_t)HAL_I2C_MODE_MASTER))
0368
0369 #define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \
0370 (uint32_t)HAL_I2C_MODE_MASTER))
0371
0372 #define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \
0373 (uint32_t)HAL_I2C_MODE_SLAVE))
0374
0375 #define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \
0376 (uint32_t)HAL_I2C_MODE_SLAVE))
0377
0378 #define I2C_STATE_MEM_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \
0379 (uint32_t)HAL_I2C_MODE_MEM))
0380
0381 #define I2C_STATE_MEM_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \
0382 (uint32_t)HAL_I2C_MODE_MEM))
0383
0384
0385
0386
0387 #define I2C_XFER_TX_IT (uint16_t)(0x0001U)
0388
0389 #define I2C_XFER_RX_IT (uint16_t)(0x0002U)
0390
0391 #define I2C_XFER_LISTEN_IT (uint16_t)(0x8000U)
0392
0393
0394 #define I2C_XFER_ERROR_IT (uint16_t)(0x0010U)
0395
0396 #define I2C_XFER_CPLT_IT (uint16_t)(0x0020U)
0397 #define I2C_XFER_RELOAD_IT (uint16_t)(0x0040U)
0398
0399
0400 #define I2C_NO_OPTION_FRAME (0xFFFF0000U)
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410 #define I2C_GET_DMA_REMAIN_DATA(__HANDLE__) __HAL_DMA_GET_COUNTER(__HANDLE__)
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma);
0424 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma);
0425 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma);
0426 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma);
0427 static void I2C_DMAError(DMA_HandleTypeDef *hdma);
0428 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma);
0429
0430
0431
0432 static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
0433 static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c);
0434 static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c);
0435 static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
0436 static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
0437 static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags);
0438 static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode);
0439
0440
0441 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
0442 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
0443 uint32_t Tickstart);
0444 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
0445 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
0446 uint32_t Tickstart);
0447
0448
0449 static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
0450 uint32_t ITSources);
0451 static HAL_StatusTypeDef I2C_Mem_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
0452 uint32_t ITSources);
0453 static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
0454 uint32_t ITSources);
0455 static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
0456 uint32_t ITSources);
0457 static HAL_StatusTypeDef I2C_Mem_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
0458 uint32_t ITSources);
0459 static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
0460 uint32_t ITSources);
0461
0462
0463 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status,
0464 uint32_t Timeout, uint32_t Tickstart);
0465 static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
0466 uint32_t Tickstart);
0467 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
0468 uint32_t Tickstart);
0469 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
0470 uint32_t Tickstart);
0471 static HAL_StatusTypeDef I2C_IsErrorOccurred(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
0472 uint32_t Tickstart);
0473
0474
0475 static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest);
0476 static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest);
0477
0478
0479 static void I2C_TreatErrorCallback(I2C_HandleTypeDef *hi2c);
0480
0481
0482 static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c);
0483
0484
0485 static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode,
0486 uint32_t Request);
0487
0488
0489 static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c);
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540 HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
0541 {
0542
0543 if (hi2c == NULL)
0544 {
0545 return HAL_ERROR;
0546 }
0547
0548
0549 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
0550 assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1));
0551 assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode));
0552 assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode));
0553 assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2));
0554 assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks));
0555 assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode));
0556 assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode));
0557
0558 if (hi2c->State == HAL_I2C_STATE_RESET)
0559 {
0560
0561 hi2c->Lock = HAL_UNLOCKED;
0562
0563 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
0564
0565 hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback;
0566 hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback;
0567 hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback;
0568 hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback;
0569 hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback;
0570 hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback;
0571 hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback;
0572 hi2c->ErrorCallback = HAL_I2C_ErrorCallback;
0573 hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback;
0574 hi2c->AddrCallback = HAL_I2C_AddrCallback;
0575
0576 if (hi2c->MspInitCallback == NULL)
0577 {
0578 hi2c->MspInitCallback = HAL_I2C_MspInit;
0579 }
0580
0581
0582 hi2c->MspInitCallback(hi2c);
0583 #else
0584
0585 HAL_I2C_MspInit(hi2c);
0586 #endif
0587 }
0588
0589 hi2c->State = HAL_I2C_STATE_BUSY;
0590
0591
0592 __HAL_I2C_DISABLE(hi2c);
0593
0594
0595
0596 hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK;
0597
0598
0599
0600 hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN;
0601
0602
0603 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT)
0604 {
0605 hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1);
0606 }
0607 else
0608 {
0609 hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1);
0610 }
0611
0612
0613
0614 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
0615 {
0616 SET_BIT(hi2c->Instance->CR2, I2C_CR2_ADD10);
0617 }
0618 else
0619 {
0620
0621 CLEAR_BIT(hi2c->Instance->CR2, I2C_CR2_ADD10);
0622 }
0623
0624 hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK);
0625
0626
0627
0628 hi2c->Instance->OAR2 &= ~I2C_DUALADDRESS_ENABLE;
0629
0630
0631 hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | \
0632 (hi2c->Init.OwnAddress2Masks << 8));
0633
0634
0635
0636 hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode);
0637
0638
0639 __HAL_I2C_ENABLE(hi2c);
0640
0641 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
0642 hi2c->State = HAL_I2C_STATE_READY;
0643 hi2c->PreviousState = I2C_STATE_NONE;
0644 hi2c->Mode = HAL_I2C_MODE_NONE;
0645
0646 return HAL_OK;
0647 }
0648
0649
0650
0651
0652
0653
0654
0655 HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c)
0656 {
0657
0658 if (hi2c == NULL)
0659 {
0660 return HAL_ERROR;
0661 }
0662
0663
0664 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
0665
0666 hi2c->State = HAL_I2C_STATE_BUSY;
0667
0668
0669 __HAL_I2C_DISABLE(hi2c);
0670
0671 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
0672 if (hi2c->MspDeInitCallback == NULL)
0673 {
0674 hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;
0675 }
0676
0677
0678 hi2c->MspDeInitCallback(hi2c);
0679 #else
0680
0681 HAL_I2C_MspDeInit(hi2c);
0682 #endif
0683
0684 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
0685 hi2c->State = HAL_I2C_STATE_RESET;
0686 hi2c->PreviousState = I2C_STATE_NONE;
0687 hi2c->Mode = HAL_I2C_MODE_NONE;
0688
0689
0690 __HAL_UNLOCK(hi2c);
0691
0692 return HAL_OK;
0693 }
0694
0695
0696
0697
0698
0699
0700
0701 __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
0702 {
0703
0704 UNUSED(hi2c);
0705
0706
0707
0708
0709 }
0710
0711
0712
0713
0714
0715
0716
0717 __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
0718 {
0719
0720 UNUSED(hi2c);
0721
0722
0723
0724
0725 }
0726
0727 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751 HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID,
0752 pI2C_CallbackTypeDef pCallback)
0753 {
0754 HAL_StatusTypeDef status = HAL_OK;
0755
0756 if (pCallback == NULL)
0757 {
0758
0759 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0760
0761 return HAL_ERROR;
0762 }
0763
0764 if (HAL_I2C_STATE_READY == hi2c->State)
0765 {
0766 switch (CallbackID)
0767 {
0768 case HAL_I2C_MASTER_TX_COMPLETE_CB_ID :
0769 hi2c->MasterTxCpltCallback = pCallback;
0770 break;
0771
0772 case HAL_I2C_MASTER_RX_COMPLETE_CB_ID :
0773 hi2c->MasterRxCpltCallback = pCallback;
0774 break;
0775
0776 case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID :
0777 hi2c->SlaveTxCpltCallback = pCallback;
0778 break;
0779
0780 case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID :
0781 hi2c->SlaveRxCpltCallback = pCallback;
0782 break;
0783
0784 case HAL_I2C_LISTEN_COMPLETE_CB_ID :
0785 hi2c->ListenCpltCallback = pCallback;
0786 break;
0787
0788 case HAL_I2C_MEM_TX_COMPLETE_CB_ID :
0789 hi2c->MemTxCpltCallback = pCallback;
0790 break;
0791
0792 case HAL_I2C_MEM_RX_COMPLETE_CB_ID :
0793 hi2c->MemRxCpltCallback = pCallback;
0794 break;
0795
0796 case HAL_I2C_ERROR_CB_ID :
0797 hi2c->ErrorCallback = pCallback;
0798 break;
0799
0800 case HAL_I2C_ABORT_CB_ID :
0801 hi2c->AbortCpltCallback = pCallback;
0802 break;
0803
0804 case HAL_I2C_MSPINIT_CB_ID :
0805 hi2c->MspInitCallback = pCallback;
0806 break;
0807
0808 case HAL_I2C_MSPDEINIT_CB_ID :
0809 hi2c->MspDeInitCallback = pCallback;
0810 break;
0811
0812 default :
0813
0814 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0815
0816
0817 status = HAL_ERROR;
0818 break;
0819 }
0820 }
0821 else if (HAL_I2C_STATE_RESET == hi2c->State)
0822 {
0823 switch (CallbackID)
0824 {
0825 case HAL_I2C_MSPINIT_CB_ID :
0826 hi2c->MspInitCallback = pCallback;
0827 break;
0828
0829 case HAL_I2C_MSPDEINIT_CB_ID :
0830 hi2c->MspDeInitCallback = pCallback;
0831 break;
0832
0833 default :
0834
0835 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0836
0837
0838 status = HAL_ERROR;
0839 break;
0840 }
0841 }
0842 else
0843 {
0844
0845 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0846
0847
0848 status = HAL_ERROR;
0849 }
0850
0851 return status;
0852 }
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877 HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID)
0878 {
0879 HAL_StatusTypeDef status = HAL_OK;
0880
0881 if (HAL_I2C_STATE_READY == hi2c->State)
0882 {
0883 switch (CallbackID)
0884 {
0885 case HAL_I2C_MASTER_TX_COMPLETE_CB_ID :
0886 hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback;
0887 break;
0888
0889 case HAL_I2C_MASTER_RX_COMPLETE_CB_ID :
0890 hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback;
0891 break;
0892
0893 case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID :
0894 hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback;
0895 break;
0896
0897 case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID :
0898 hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback;
0899 break;
0900
0901 case HAL_I2C_LISTEN_COMPLETE_CB_ID :
0902 hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback;
0903 break;
0904
0905 case HAL_I2C_MEM_TX_COMPLETE_CB_ID :
0906 hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback;
0907 break;
0908
0909 case HAL_I2C_MEM_RX_COMPLETE_CB_ID :
0910 hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback;
0911 break;
0912
0913 case HAL_I2C_ERROR_CB_ID :
0914 hi2c->ErrorCallback = HAL_I2C_ErrorCallback;
0915 break;
0916
0917 case HAL_I2C_ABORT_CB_ID :
0918 hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback;
0919 break;
0920
0921 case HAL_I2C_MSPINIT_CB_ID :
0922 hi2c->MspInitCallback = HAL_I2C_MspInit;
0923 break;
0924
0925 case HAL_I2C_MSPDEINIT_CB_ID :
0926 hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;
0927 break;
0928
0929 default :
0930
0931 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0932
0933
0934 status = HAL_ERROR;
0935 break;
0936 }
0937 }
0938 else if (HAL_I2C_STATE_RESET == hi2c->State)
0939 {
0940 switch (CallbackID)
0941 {
0942 case HAL_I2C_MSPINIT_CB_ID :
0943 hi2c->MspInitCallback = HAL_I2C_MspInit;
0944 break;
0945
0946 case HAL_I2C_MSPDEINIT_CB_ID :
0947 hi2c->MspDeInitCallback = HAL_I2C_MspDeInit;
0948 break;
0949
0950 default :
0951
0952 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0953
0954
0955 status = HAL_ERROR;
0956 break;
0957 }
0958 }
0959 else
0960 {
0961
0962 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0963
0964
0965 status = HAL_ERROR;
0966 }
0967
0968 return status;
0969 }
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979 HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback)
0980 {
0981 HAL_StatusTypeDef status = HAL_OK;
0982
0983 if (pCallback == NULL)
0984 {
0985
0986 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0987
0988 return HAL_ERROR;
0989 }
0990
0991 if (HAL_I2C_STATE_READY == hi2c->State)
0992 {
0993 hi2c->AddrCallback = pCallback;
0994 }
0995 else
0996 {
0997
0998 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
0999
1000
1001 status = HAL_ERROR;
1002 }
1003
1004 return status;
1005 }
1006
1007
1008
1009
1010
1011
1012
1013
1014 HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c)
1015 {
1016 HAL_StatusTypeDef status = HAL_OK;
1017
1018 if (HAL_I2C_STATE_READY == hi2c->State)
1019 {
1020 hi2c->AddrCallback = HAL_I2C_AddrCallback;
1021 }
1022 else
1023 {
1024
1025 hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK;
1026
1027
1028 status = HAL_ERROR;
1029 }
1030
1031 return status;
1032 }
1033
1034 #endif
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125 HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
1126 uint16_t Size, uint32_t Timeout)
1127 {
1128 uint32_t tickstart;
1129 uint32_t xfermode;
1130
1131 if (hi2c->State == HAL_I2C_STATE_READY)
1132 {
1133
1134 __HAL_LOCK(hi2c);
1135
1136
1137 tickstart = HAL_GetTick();
1138
1139 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
1140 {
1141 return HAL_ERROR;
1142 }
1143
1144 hi2c->State = HAL_I2C_STATE_BUSY_TX;
1145 hi2c->Mode = HAL_I2C_MODE_MASTER;
1146 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1147
1148
1149 hi2c->pBuffPtr = pData;
1150 hi2c->XferCount = Size;
1151 hi2c->XferISR = NULL;
1152
1153 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1154 {
1155 hi2c->XferSize = MAX_NBYTE_SIZE;
1156 xfermode = I2C_RELOAD_MODE;
1157 }
1158 else
1159 {
1160 hi2c->XferSize = hi2c->XferCount;
1161 xfermode = I2C_AUTOEND_MODE;
1162 }
1163
1164 if (hi2c->XferSize > 0U)
1165 {
1166
1167
1168 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1169
1170
1171 hi2c->pBuffPtr++;
1172
1173 hi2c->XferCount--;
1174 hi2c->XferSize--;
1175
1176
1177
1178 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)(hi2c->XferSize + 1U), xfermode,
1179 I2C_GENERATE_START_WRITE);
1180 }
1181 else
1182 {
1183
1184
1185 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode,
1186 I2C_GENERATE_START_WRITE);
1187 }
1188
1189 while (hi2c->XferCount > 0U)
1190 {
1191
1192 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1193 {
1194 return HAL_ERROR;
1195 }
1196
1197 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1198
1199
1200 hi2c->pBuffPtr++;
1201
1202 hi2c->XferCount--;
1203 hi2c->XferSize--;
1204
1205 if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
1206 {
1207
1208 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
1209 {
1210 return HAL_ERROR;
1211 }
1212
1213 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1214 {
1215 hi2c->XferSize = MAX_NBYTE_SIZE;
1216 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE,
1217 I2C_NO_STARTSTOP);
1218 }
1219 else
1220 {
1221 hi2c->XferSize = hi2c->XferCount;
1222 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
1223 I2C_NO_STARTSTOP);
1224 }
1225 }
1226 }
1227
1228
1229
1230 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1231 {
1232 return HAL_ERROR;
1233 }
1234
1235
1236 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1237
1238
1239 I2C_RESET_CR2(hi2c);
1240
1241 hi2c->State = HAL_I2C_STATE_READY;
1242 hi2c->Mode = HAL_I2C_MODE_NONE;
1243
1244
1245 __HAL_UNLOCK(hi2c);
1246
1247 return HAL_OK;
1248 }
1249 else
1250 {
1251 return HAL_BUSY;
1252 }
1253 }
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266 HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
1267 uint16_t Size, uint32_t Timeout)
1268 {
1269 uint32_t tickstart;
1270
1271 if (hi2c->State == HAL_I2C_STATE_READY)
1272 {
1273
1274 __HAL_LOCK(hi2c);
1275
1276
1277 tickstart = HAL_GetTick();
1278
1279 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
1280 {
1281 return HAL_ERROR;
1282 }
1283
1284 hi2c->State = HAL_I2C_STATE_BUSY_RX;
1285 hi2c->Mode = HAL_I2C_MODE_MASTER;
1286 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1287
1288
1289 hi2c->pBuffPtr = pData;
1290 hi2c->XferCount = Size;
1291 hi2c->XferISR = NULL;
1292
1293
1294
1295 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1296 {
1297 hi2c->XferSize = MAX_NBYTE_SIZE;
1298 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE,
1299 I2C_GENERATE_START_READ);
1300 }
1301 else
1302 {
1303 hi2c->XferSize = hi2c->XferCount;
1304 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
1305 I2C_GENERATE_START_READ);
1306 }
1307
1308 while (hi2c->XferCount > 0U)
1309 {
1310
1311 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1312 {
1313 return HAL_ERROR;
1314 }
1315
1316
1317 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
1318
1319
1320 hi2c->pBuffPtr++;
1321
1322 hi2c->XferSize--;
1323 hi2c->XferCount--;
1324
1325 if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
1326 {
1327
1328 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
1329 {
1330 return HAL_ERROR;
1331 }
1332
1333 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1334 {
1335 hi2c->XferSize = MAX_NBYTE_SIZE;
1336 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE,
1337 I2C_NO_STARTSTOP);
1338 }
1339 else
1340 {
1341 hi2c->XferSize = hi2c->XferCount;
1342 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
1343 I2C_NO_STARTSTOP);
1344 }
1345 }
1346 }
1347
1348
1349
1350 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1351 {
1352 return HAL_ERROR;
1353 }
1354
1355
1356 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1357
1358
1359 I2C_RESET_CR2(hi2c);
1360
1361 hi2c->State = HAL_I2C_STATE_READY;
1362 hi2c->Mode = HAL_I2C_MODE_NONE;
1363
1364
1365 __HAL_UNLOCK(hi2c);
1366
1367 return HAL_OK;
1368 }
1369 else
1370 {
1371 return HAL_BUSY;
1372 }
1373 }
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384 HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
1385 uint32_t Timeout)
1386 {
1387 uint32_t tickstart;
1388 uint16_t tmpXferCount;
1389 HAL_StatusTypeDef error;
1390
1391 if (hi2c->State == HAL_I2C_STATE_READY)
1392 {
1393 if ((pData == NULL) || (Size == 0U))
1394 {
1395 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
1396 return HAL_ERROR;
1397 }
1398
1399 __HAL_LOCK(hi2c);
1400
1401
1402 tickstart = HAL_GetTick();
1403
1404 hi2c->State = HAL_I2C_STATE_BUSY_TX;
1405 hi2c->Mode = HAL_I2C_MODE_SLAVE;
1406 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1407
1408
1409 hi2c->pBuffPtr = pData;
1410 hi2c->XferCount = Size;
1411 hi2c->XferISR = NULL;
1412
1413
1414 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1415
1416
1417 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1418 {
1419
1420 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1421 return HAL_ERROR;
1422 }
1423
1424
1425 if (hi2c->Init.NoStretchMode == I2C_NOSTRETCH_ENABLE)
1426 {
1427
1428
1429 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1430
1431
1432 hi2c->pBuffPtr++;
1433
1434 hi2c->XferCount--;
1435 }
1436
1437
1438 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
1439
1440
1441 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
1442 {
1443
1444 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1445 {
1446
1447 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1448 return HAL_ERROR;
1449 }
1450
1451
1452 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
1453 }
1454
1455
1456 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout, tickstart) != HAL_OK)
1457 {
1458
1459 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1460 return HAL_ERROR;
1461 }
1462
1463 while (hi2c->XferCount > 0U)
1464 {
1465
1466 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1467 {
1468
1469 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1470 return HAL_ERROR;
1471 }
1472
1473
1474 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1475
1476
1477 hi2c->pBuffPtr++;
1478
1479 hi2c->XferCount--;
1480 }
1481
1482
1483 error = I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_AF, RESET, Timeout, tickstart);
1484
1485 if (error != HAL_OK)
1486 {
1487
1488
1489
1490
1491 tmpXferCount = hi2c->XferCount;
1492 if ((hi2c->ErrorCode == HAL_I2C_ERROR_AF) && (tmpXferCount == 0U))
1493 {
1494
1495 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1496 }
1497 else
1498 {
1499
1500 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1501 return HAL_ERROR;
1502 }
1503 }
1504 else
1505 {
1506
1507 I2C_Flush_TXDR(hi2c);
1508
1509
1510 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
1511
1512
1513 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1514 {
1515
1516 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1517
1518 return HAL_ERROR;
1519 }
1520
1521
1522 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1523 }
1524
1525
1526 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)
1527 {
1528
1529 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1530 return HAL_ERROR;
1531 }
1532
1533
1534 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1535
1536 hi2c->State = HAL_I2C_STATE_READY;
1537 hi2c->Mode = HAL_I2C_MODE_NONE;
1538
1539
1540 __HAL_UNLOCK(hi2c);
1541
1542 return HAL_OK;
1543 }
1544 else
1545 {
1546 return HAL_BUSY;
1547 }
1548 }
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559 HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
1560 uint32_t Timeout)
1561 {
1562 uint32_t tickstart;
1563
1564 if (hi2c->State == HAL_I2C_STATE_READY)
1565 {
1566 if ((pData == NULL) || (Size == 0U))
1567 {
1568 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
1569 return HAL_ERROR;
1570 }
1571
1572 __HAL_LOCK(hi2c);
1573
1574
1575 tickstart = HAL_GetTick();
1576
1577 hi2c->State = HAL_I2C_STATE_BUSY_RX;
1578 hi2c->Mode = HAL_I2C_MODE_SLAVE;
1579 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1580
1581
1582 hi2c->pBuffPtr = pData;
1583 hi2c->XferCount = Size;
1584 hi2c->XferSize = hi2c->XferCount;
1585 hi2c->XferISR = NULL;
1586
1587
1588 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1589
1590
1591 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK)
1592 {
1593
1594 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1595 return HAL_ERROR;
1596 }
1597
1598
1599 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
1600
1601
1602 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout, tickstart) != HAL_OK)
1603 {
1604
1605 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1606 return HAL_ERROR;
1607 }
1608
1609 while (hi2c->XferCount > 0U)
1610 {
1611
1612 if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1613 {
1614
1615 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1616
1617
1618 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET)
1619 {
1620
1621 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
1622
1623
1624 hi2c->pBuffPtr++;
1625
1626 hi2c->XferCount--;
1627 hi2c->XferSize--;
1628 }
1629
1630 return HAL_ERROR;
1631 }
1632
1633
1634 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
1635
1636
1637 hi2c->pBuffPtr++;
1638
1639 hi2c->XferCount--;
1640 hi2c->XferSize--;
1641 }
1642
1643
1644 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
1645 {
1646
1647 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1648 return HAL_ERROR;
1649 }
1650
1651
1652 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
1653
1654
1655 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK)
1656 {
1657
1658 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1659 return HAL_ERROR;
1660 }
1661
1662
1663 hi2c->Instance->CR2 |= I2C_CR2_NACK;
1664
1665 hi2c->State = HAL_I2C_STATE_READY;
1666 hi2c->Mode = HAL_I2C_MODE_NONE;
1667
1668
1669 __HAL_UNLOCK(hi2c);
1670
1671 return HAL_OK;
1672 }
1673 else
1674 {
1675 return HAL_BUSY;
1676 }
1677 }
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689 HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
1690 uint16_t Size)
1691 {
1692 uint32_t xfermode;
1693
1694 if (hi2c->State == HAL_I2C_STATE_READY)
1695 {
1696 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1697 {
1698 return HAL_BUSY;
1699 }
1700
1701
1702 __HAL_LOCK(hi2c);
1703
1704 hi2c->State = HAL_I2C_STATE_BUSY_TX;
1705 hi2c->Mode = HAL_I2C_MODE_MASTER;
1706 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1707
1708
1709 hi2c->pBuffPtr = pData;
1710 hi2c->XferCount = Size;
1711 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1712 hi2c->XferISR = I2C_Master_ISR_IT;
1713
1714 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1715 {
1716 hi2c->XferSize = MAX_NBYTE_SIZE;
1717 xfermode = I2C_RELOAD_MODE;
1718 }
1719 else
1720 {
1721 hi2c->XferSize = hi2c->XferCount;
1722 xfermode = I2C_AUTOEND_MODE;
1723 }
1724
1725
1726
1727 if (hi2c->XferSize > 0U)
1728 {
1729
1730
1731 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1732
1733
1734 hi2c->pBuffPtr++;
1735
1736 hi2c->XferCount--;
1737 hi2c->XferSize--;
1738
1739 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)(hi2c->XferSize + 1U), xfermode,
1740 I2C_GENERATE_START_WRITE);
1741 }
1742 else
1743 {
1744 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode,
1745 I2C_GENERATE_START_WRITE);
1746 }
1747
1748
1749 __HAL_UNLOCK(hi2c);
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
1760
1761 return HAL_OK;
1762 }
1763 else
1764 {
1765 return HAL_BUSY;
1766 }
1767 }
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779 HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
1780 uint16_t Size)
1781 {
1782 uint32_t xfermode;
1783
1784 if (hi2c->State == HAL_I2C_STATE_READY)
1785 {
1786 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1787 {
1788 return HAL_BUSY;
1789 }
1790
1791
1792 __HAL_LOCK(hi2c);
1793
1794 hi2c->State = HAL_I2C_STATE_BUSY_RX;
1795 hi2c->Mode = HAL_I2C_MODE_MASTER;
1796 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1797
1798
1799 hi2c->pBuffPtr = pData;
1800 hi2c->XferCount = Size;
1801 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1802 hi2c->XferISR = I2C_Master_ISR_IT;
1803
1804 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1805 {
1806 hi2c->XferSize = MAX_NBYTE_SIZE;
1807 xfermode = I2C_RELOAD_MODE;
1808 }
1809 else
1810 {
1811 hi2c->XferSize = hi2c->XferCount;
1812 xfermode = I2C_AUTOEND_MODE;
1813 }
1814
1815
1816
1817 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
1818
1819
1820 __HAL_UNLOCK(hi2c);
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
1831
1832 return HAL_OK;
1833 }
1834 else
1835 {
1836 return HAL_BUSY;
1837 }
1838 }
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
1849 {
1850 if (hi2c->State == HAL_I2C_STATE_READY)
1851 {
1852
1853 __HAL_LOCK(hi2c);
1854
1855 hi2c->State = HAL_I2C_STATE_BUSY_TX;
1856 hi2c->Mode = HAL_I2C_MODE_SLAVE;
1857 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1858
1859
1860 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1861
1862
1863 hi2c->pBuffPtr = pData;
1864 hi2c->XferCount = Size;
1865 hi2c->XferSize = hi2c->XferCount;
1866 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1867 hi2c->XferISR = I2C_Slave_ISR_IT;
1868
1869
1870 if (hi2c->Init.NoStretchMode == I2C_NOSTRETCH_ENABLE)
1871 {
1872
1873
1874 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
1875
1876
1877 hi2c->pBuffPtr++;
1878
1879 hi2c->XferCount--;
1880 hi2c->XferSize--;
1881 }
1882
1883
1884 __HAL_UNLOCK(hi2c);
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);
1895
1896 return HAL_OK;
1897 }
1898 else
1899 {
1900 return HAL_BUSY;
1901 }
1902 }
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912 HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
1913 {
1914 if (hi2c->State == HAL_I2C_STATE_READY)
1915 {
1916
1917 __HAL_LOCK(hi2c);
1918
1919 hi2c->State = HAL_I2C_STATE_BUSY_RX;
1920 hi2c->Mode = HAL_I2C_MODE_SLAVE;
1921 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1922
1923
1924 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
1925
1926
1927 hi2c->pBuffPtr = pData;
1928 hi2c->XferCount = Size;
1929 hi2c->XferSize = hi2c->XferCount;
1930 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1931 hi2c->XferISR = I2C_Slave_ISR_IT;
1932
1933
1934 __HAL_UNLOCK(hi2c);
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
1945
1946 return HAL_OK;
1947 }
1948 else
1949 {
1950 return HAL_BUSY;
1951 }
1952 }
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964 HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
1965 uint16_t Size)
1966 {
1967 uint32_t xfermode;
1968 HAL_StatusTypeDef dmaxferstatus;
1969 uint32_t sizetoxfer = 0U;
1970
1971 if (hi2c->State == HAL_I2C_STATE_READY)
1972 {
1973 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
1974 {
1975 return HAL_BUSY;
1976 }
1977
1978
1979 __HAL_LOCK(hi2c);
1980
1981 hi2c->State = HAL_I2C_STATE_BUSY_TX;
1982 hi2c->Mode = HAL_I2C_MODE_MASTER;
1983 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
1984
1985
1986 hi2c->pBuffPtr = pData;
1987 hi2c->XferCount = Size;
1988 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
1989 hi2c->XferISR = I2C_Master_ISR_DMA;
1990
1991 if (hi2c->XferCount > MAX_NBYTE_SIZE)
1992 {
1993 hi2c->XferSize = MAX_NBYTE_SIZE;
1994 xfermode = I2C_RELOAD_MODE;
1995 }
1996 else
1997 {
1998 hi2c->XferSize = hi2c->XferCount;
1999 xfermode = I2C_AUTOEND_MODE;
2000 }
2001
2002 if (hi2c->XferSize > 0U)
2003 {
2004
2005
2006 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
2007
2008
2009 hi2c->pBuffPtr++;
2010
2011 sizetoxfer = hi2c->XferSize;
2012 hi2c->XferCount--;
2013 hi2c->XferSize--;
2014 }
2015
2016 if (hi2c->XferSize > 0U)
2017 {
2018 if (hi2c->hdmatx != NULL)
2019 {
2020
2021 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
2022
2023
2024 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
2025
2026
2027 hi2c->hdmatx->XferHalfCpltCallback = NULL;
2028 hi2c->hdmatx->XferAbortCallback = NULL;
2029
2030
2031 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr,
2032 (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
2033 }
2034 else
2035 {
2036
2037 hi2c->State = HAL_I2C_STATE_READY;
2038 hi2c->Mode = HAL_I2C_MODE_NONE;
2039
2040
2041 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2042
2043
2044 __HAL_UNLOCK(hi2c);
2045
2046 return HAL_ERROR;
2047 }
2048
2049 if (dmaxferstatus == HAL_OK)
2050 {
2051
2052
2053 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)(hi2c->XferSize + 1U),
2054 xfermode, I2C_GENERATE_START_WRITE);
2055
2056
2057 hi2c->XferCount -= hi2c->XferSize;
2058
2059
2060 __HAL_UNLOCK(hi2c);
2061
2062
2063
2064
2065
2066 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
2067
2068
2069 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
2070 }
2071 else
2072 {
2073
2074 hi2c->State = HAL_I2C_STATE_READY;
2075 hi2c->Mode = HAL_I2C_MODE_NONE;
2076
2077
2078 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2079
2080
2081 __HAL_UNLOCK(hi2c);
2082
2083 return HAL_ERROR;
2084 }
2085 }
2086 else
2087 {
2088
2089 hi2c->XferISR = I2C_Master_ISR_IT;
2090
2091
2092
2093 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)sizetoxfer, I2C_AUTOEND_MODE,
2094 I2C_GENERATE_START_WRITE);
2095
2096
2097 __HAL_UNLOCK(hi2c);
2098
2099
2100
2101
2102
2103
2104
2105
2106 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
2107 }
2108
2109 return HAL_OK;
2110 }
2111 else
2112 {
2113 return HAL_BUSY;
2114 }
2115 }
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127 HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
2128 uint16_t Size)
2129 {
2130 uint32_t xfermode;
2131 HAL_StatusTypeDef dmaxferstatus;
2132
2133 if (hi2c->State == HAL_I2C_STATE_READY)
2134 {
2135 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2136 {
2137 return HAL_BUSY;
2138 }
2139
2140
2141 __HAL_LOCK(hi2c);
2142
2143 hi2c->State = HAL_I2C_STATE_BUSY_RX;
2144 hi2c->Mode = HAL_I2C_MODE_MASTER;
2145 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2146
2147
2148 hi2c->pBuffPtr = pData;
2149 hi2c->XferCount = Size;
2150 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2151 hi2c->XferISR = I2C_Master_ISR_DMA;
2152
2153 if (hi2c->XferCount > MAX_NBYTE_SIZE)
2154 {
2155 hi2c->XferSize = MAX_NBYTE_SIZE;
2156 xfermode = I2C_RELOAD_MODE;
2157 }
2158 else
2159 {
2160 hi2c->XferSize = hi2c->XferCount;
2161 xfermode = I2C_AUTOEND_MODE;
2162 }
2163
2164 if (hi2c->XferSize > 0U)
2165 {
2166 if (hi2c->hdmarx != NULL)
2167 {
2168
2169 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
2170
2171
2172 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
2173
2174
2175 hi2c->hdmarx->XferHalfCpltCallback = NULL;
2176 hi2c->hdmarx->XferAbortCallback = NULL;
2177
2178
2179 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData,
2180 hi2c->XferSize);
2181 }
2182 else
2183 {
2184
2185 hi2c->State = HAL_I2C_STATE_READY;
2186 hi2c->Mode = HAL_I2C_MODE_NONE;
2187
2188
2189 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2190
2191
2192 __HAL_UNLOCK(hi2c);
2193
2194 return HAL_ERROR;
2195 }
2196
2197 if (dmaxferstatus == HAL_OK)
2198 {
2199
2200
2201 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ);
2202
2203
2204 hi2c->XferCount -= hi2c->XferSize;
2205
2206
2207 __HAL_UNLOCK(hi2c);
2208
2209
2210
2211
2212
2213 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
2214
2215
2216 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
2217 }
2218 else
2219 {
2220
2221 hi2c->State = HAL_I2C_STATE_READY;
2222 hi2c->Mode = HAL_I2C_MODE_NONE;
2223
2224
2225 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2226
2227
2228 __HAL_UNLOCK(hi2c);
2229
2230 return HAL_ERROR;
2231 }
2232 }
2233 else
2234 {
2235
2236 hi2c->XferISR = I2C_Master_ISR_IT;
2237
2238
2239
2240 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
2241 I2C_GENERATE_START_READ);
2242
2243
2244 __HAL_UNLOCK(hi2c);
2245
2246
2247
2248
2249
2250
2251
2252
2253 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
2254 }
2255
2256 return HAL_OK;
2257 }
2258 else
2259 {
2260 return HAL_BUSY;
2261 }
2262 }
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272 HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
2273 {
2274 HAL_StatusTypeDef dmaxferstatus;
2275
2276 if (hi2c->State == HAL_I2C_STATE_READY)
2277 {
2278 if ((pData == NULL) || (Size == 0U))
2279 {
2280 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2281 return HAL_ERROR;
2282 }
2283
2284 __HAL_LOCK(hi2c);
2285
2286 hi2c->State = HAL_I2C_STATE_BUSY_TX;
2287 hi2c->Mode = HAL_I2C_MODE_SLAVE;
2288 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2289
2290
2291 hi2c->pBuffPtr = pData;
2292 hi2c->XferCount = Size;
2293 hi2c->XferSize = hi2c->XferCount;
2294 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2295 hi2c->XferISR = I2C_Slave_ISR_DMA;
2296
2297
2298 if (hi2c->Init.NoStretchMode == I2C_NOSTRETCH_ENABLE)
2299 {
2300
2301
2302 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
2303
2304
2305 hi2c->pBuffPtr++;
2306
2307 hi2c->XferCount--;
2308 hi2c->XferSize--;
2309 }
2310
2311 if (hi2c->XferCount != 0U)
2312 {
2313 if (hi2c->hdmatx != NULL)
2314 {
2315
2316 hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
2317
2318
2319 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
2320
2321
2322 hi2c->hdmatx->XferHalfCpltCallback = NULL;
2323 hi2c->hdmatx->XferAbortCallback = NULL;
2324
2325
2326 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx,
2327 (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR,
2328 hi2c->XferSize);
2329 }
2330 else
2331 {
2332
2333 hi2c->State = HAL_I2C_STATE_LISTEN;
2334 hi2c->Mode = HAL_I2C_MODE_NONE;
2335
2336
2337 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2338
2339
2340 __HAL_UNLOCK(hi2c);
2341
2342 return HAL_ERROR;
2343 }
2344
2345 if (dmaxferstatus == HAL_OK)
2346 {
2347
2348 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
2349
2350
2351 __HAL_UNLOCK(hi2c);
2352
2353
2354
2355
2356
2357 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
2358
2359
2360 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
2361 }
2362 else
2363 {
2364
2365 hi2c->State = HAL_I2C_STATE_LISTEN;
2366 hi2c->Mode = HAL_I2C_MODE_NONE;
2367
2368
2369 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2370
2371
2372 __HAL_UNLOCK(hi2c);
2373
2374 return HAL_ERROR;
2375 }
2376 }
2377 else
2378 {
2379
2380 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
2381
2382
2383 __HAL_UNLOCK(hi2c);
2384
2385
2386
2387
2388
2389 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
2390 }
2391
2392 return HAL_OK;
2393 }
2394 else
2395 {
2396 return HAL_BUSY;
2397 }
2398 }
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408 HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size)
2409 {
2410 HAL_StatusTypeDef dmaxferstatus;
2411
2412 if (hi2c->State == HAL_I2C_STATE_READY)
2413 {
2414 if ((pData == NULL) || (Size == 0U))
2415 {
2416 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2417 return HAL_ERROR;
2418 }
2419
2420 __HAL_LOCK(hi2c);
2421
2422 hi2c->State = HAL_I2C_STATE_BUSY_RX;
2423 hi2c->Mode = HAL_I2C_MODE_SLAVE;
2424 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2425
2426
2427 hi2c->pBuffPtr = pData;
2428 hi2c->XferCount = Size;
2429 hi2c->XferSize = hi2c->XferCount;
2430 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2431 hi2c->XferISR = I2C_Slave_ISR_DMA;
2432
2433 if (hi2c->hdmarx != NULL)
2434 {
2435
2436 hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;
2437
2438
2439 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
2440
2441
2442 hi2c->hdmarx->XferHalfCpltCallback = NULL;
2443 hi2c->hdmarx->XferAbortCallback = NULL;
2444
2445
2446 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData,
2447 hi2c->XferSize);
2448 }
2449 else
2450 {
2451
2452 hi2c->State = HAL_I2C_STATE_LISTEN;
2453 hi2c->Mode = HAL_I2C_MODE_NONE;
2454
2455
2456 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
2457
2458
2459 __HAL_UNLOCK(hi2c);
2460
2461 return HAL_ERROR;
2462 }
2463
2464 if (dmaxferstatus == HAL_OK)
2465 {
2466
2467 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
2468
2469
2470 __HAL_UNLOCK(hi2c);
2471
2472
2473
2474
2475
2476 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
2477
2478
2479 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
2480 }
2481 else
2482 {
2483
2484 hi2c->State = HAL_I2C_STATE_LISTEN;
2485 hi2c->Mode = HAL_I2C_MODE_NONE;
2486
2487
2488 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
2489
2490
2491 __HAL_UNLOCK(hi2c);
2492
2493 return HAL_ERROR;
2494 }
2495
2496 return HAL_OK;
2497 }
2498 else
2499 {
2500 return HAL_BUSY;
2501 }
2502 }
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517 HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
2518 uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2519 {
2520 uint32_t tickstart;
2521
2522
2523 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2524
2525 if (hi2c->State == HAL_I2C_STATE_READY)
2526 {
2527 if ((pData == NULL) || (Size == 0U))
2528 {
2529 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2530 return HAL_ERROR;
2531 }
2532
2533
2534 __HAL_LOCK(hi2c);
2535
2536
2537 tickstart = HAL_GetTick();
2538
2539 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
2540 {
2541 return HAL_ERROR;
2542 }
2543
2544 hi2c->State = HAL_I2C_STATE_BUSY_TX;
2545 hi2c->Mode = HAL_I2C_MODE_MEM;
2546 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2547
2548
2549 hi2c->pBuffPtr = pData;
2550 hi2c->XferCount = Size;
2551 hi2c->XferISR = NULL;
2552
2553
2554 if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2555 {
2556
2557 __HAL_UNLOCK(hi2c);
2558 return HAL_ERROR;
2559 }
2560
2561
2562 if (hi2c->XferCount > MAX_NBYTE_SIZE)
2563 {
2564 hi2c->XferSize = MAX_NBYTE_SIZE;
2565 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
2566 }
2567 else
2568 {
2569 hi2c->XferSize = hi2c->XferCount;
2570 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
2571 }
2572
2573 do
2574 {
2575
2576 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2577 {
2578 return HAL_ERROR;
2579 }
2580
2581
2582 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
2583
2584
2585 hi2c->pBuffPtr++;
2586
2587 hi2c->XferCount--;
2588 hi2c->XferSize--;
2589
2590 if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
2591 {
2592
2593 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
2594 {
2595 return HAL_ERROR;
2596 }
2597
2598 if (hi2c->XferCount > MAX_NBYTE_SIZE)
2599 {
2600 hi2c->XferSize = MAX_NBYTE_SIZE;
2601 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE,
2602 I2C_NO_STARTSTOP);
2603 }
2604 else
2605 {
2606 hi2c->XferSize = hi2c->XferCount;
2607 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
2608 I2C_NO_STARTSTOP);
2609 }
2610 }
2611
2612 } while (hi2c->XferCount > 0U);
2613
2614
2615
2616 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2617 {
2618 return HAL_ERROR;
2619 }
2620
2621
2622 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
2623
2624
2625 I2C_RESET_CR2(hi2c);
2626
2627 hi2c->State = HAL_I2C_STATE_READY;
2628 hi2c->Mode = HAL_I2C_MODE_NONE;
2629
2630
2631 __HAL_UNLOCK(hi2c);
2632
2633 return HAL_OK;
2634 }
2635 else
2636 {
2637 return HAL_BUSY;
2638 }
2639 }
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654 HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
2655 uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2656 {
2657 uint32_t tickstart;
2658
2659
2660 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2661
2662 if (hi2c->State == HAL_I2C_STATE_READY)
2663 {
2664 if ((pData == NULL) || (Size == 0U))
2665 {
2666 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2667 return HAL_ERROR;
2668 }
2669
2670
2671 __HAL_LOCK(hi2c);
2672
2673
2674 tickstart = HAL_GetTick();
2675
2676 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK)
2677 {
2678 return HAL_ERROR;
2679 }
2680
2681 hi2c->State = HAL_I2C_STATE_BUSY_RX;
2682 hi2c->Mode = HAL_I2C_MODE_MEM;
2683 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2684
2685
2686 hi2c->pBuffPtr = pData;
2687 hi2c->XferCount = Size;
2688 hi2c->XferISR = NULL;
2689
2690
2691 if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK)
2692 {
2693
2694 __HAL_UNLOCK(hi2c);
2695 return HAL_ERROR;
2696 }
2697
2698
2699
2700 if (hi2c->XferCount > MAX_NBYTE_SIZE)
2701 {
2702 hi2c->XferSize = MAX_NBYTE_SIZE;
2703 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE,
2704 I2C_GENERATE_START_READ);
2705 }
2706 else
2707 {
2708 hi2c->XferSize = hi2c->XferCount;
2709 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
2710 I2C_GENERATE_START_READ);
2711 }
2712
2713 do
2714 {
2715
2716 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK)
2717 {
2718 return HAL_ERROR;
2719 }
2720
2721
2722 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
2723
2724
2725 hi2c->pBuffPtr++;
2726
2727 hi2c->XferSize--;
2728 hi2c->XferCount--;
2729
2730 if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
2731 {
2732
2733 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK)
2734 {
2735 return HAL_ERROR;
2736 }
2737
2738 if (hi2c->XferCount > MAX_NBYTE_SIZE)
2739 {
2740 hi2c->XferSize = MAX_NBYTE_SIZE;
2741 I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE,
2742 I2C_NO_STARTSTOP);
2743 }
2744 else
2745 {
2746 hi2c->XferSize = hi2c->XferCount;
2747 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
2748 I2C_NO_STARTSTOP);
2749 }
2750 }
2751 } while (hi2c->XferCount > 0U);
2752
2753
2754
2755 if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
2756 {
2757 return HAL_ERROR;
2758 }
2759
2760
2761 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
2762
2763
2764 I2C_RESET_CR2(hi2c);
2765
2766 hi2c->State = HAL_I2C_STATE_READY;
2767 hi2c->Mode = HAL_I2C_MODE_NONE;
2768
2769
2770 __HAL_UNLOCK(hi2c);
2771
2772 return HAL_OK;
2773 }
2774 else
2775 {
2776 return HAL_BUSY;
2777 }
2778 }
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791 HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
2792 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2793 {
2794
2795 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2796
2797 if (hi2c->State == HAL_I2C_STATE_READY)
2798 {
2799 if ((pData == NULL) || (Size == 0U))
2800 {
2801 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2802 return HAL_ERROR;
2803 }
2804
2805 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2806 {
2807 return HAL_BUSY;
2808 }
2809
2810
2811 __HAL_LOCK(hi2c);
2812
2813 hi2c->State = HAL_I2C_STATE_BUSY_TX;
2814 hi2c->Mode = HAL_I2C_MODE_MEM;
2815 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2816
2817
2818 hi2c->XferSize = 0U;
2819 hi2c->pBuffPtr = pData;
2820 hi2c->XferCount = Size;
2821 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2822 hi2c->XferISR = I2C_Mem_ISR_IT;
2823 hi2c->Devaddress = DevAddress;
2824
2825
2826 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
2827 {
2828
2829 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
2830
2831
2832 hi2c->Memaddress = 0xFFFFFFFFU;
2833 }
2834
2835 else
2836 {
2837
2838 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
2839
2840
2841 hi2c->Memaddress = I2C_MEM_ADD_LSB(MemAddress);
2842 }
2843
2844 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
2845
2846
2847 __HAL_UNLOCK(hi2c);
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
2858
2859 return HAL_OK;
2860 }
2861 else
2862 {
2863 return HAL_BUSY;
2864 }
2865 }
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879 HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
2880 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2881 {
2882
2883 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2884
2885 if (hi2c->State == HAL_I2C_STATE_READY)
2886 {
2887 if ((pData == NULL) || (Size == 0U))
2888 {
2889 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2890 return HAL_ERROR;
2891 }
2892
2893 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2894 {
2895 return HAL_BUSY;
2896 }
2897
2898
2899 __HAL_LOCK(hi2c);
2900
2901 hi2c->State = HAL_I2C_STATE_BUSY_RX;
2902 hi2c->Mode = HAL_I2C_MODE_MEM;
2903 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2904
2905
2906 hi2c->pBuffPtr = pData;
2907 hi2c->XferCount = Size;
2908 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2909 hi2c->XferISR = I2C_Mem_ISR_IT;
2910 hi2c->Devaddress = DevAddress;
2911
2912
2913 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
2914 {
2915
2916 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
2917
2918
2919 hi2c->Memaddress = 0xFFFFFFFFU;
2920 }
2921
2922 else
2923 {
2924
2925 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
2926
2927
2928 hi2c->Memaddress = I2C_MEM_ADD_LSB(MemAddress);
2929 }
2930
2931 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE);
2932
2933
2934 __HAL_UNLOCK(hi2c);
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
2945
2946 return HAL_OK;
2947 }
2948 else
2949 {
2950 return HAL_BUSY;
2951 }
2952 }
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966 HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
2967 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
2968 {
2969 HAL_StatusTypeDef dmaxferstatus;
2970
2971
2972 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
2973
2974 if (hi2c->State == HAL_I2C_STATE_READY)
2975 {
2976 if ((pData == NULL) || (Size == 0U))
2977 {
2978 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
2979 return HAL_ERROR;
2980 }
2981
2982 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
2983 {
2984 return HAL_BUSY;
2985 }
2986
2987
2988 __HAL_LOCK(hi2c);
2989
2990 hi2c->State = HAL_I2C_STATE_BUSY_TX;
2991 hi2c->Mode = HAL_I2C_MODE_MEM;
2992 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
2993
2994
2995 hi2c->pBuffPtr = pData;
2996 hi2c->XferCount = Size;
2997 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
2998 hi2c->XferISR = I2C_Mem_ISR_DMA;
2999 hi2c->Devaddress = DevAddress;
3000
3001 if (hi2c->XferCount > MAX_NBYTE_SIZE)
3002 {
3003 hi2c->XferSize = MAX_NBYTE_SIZE;
3004 }
3005 else
3006 {
3007 hi2c->XferSize = hi2c->XferCount;
3008 }
3009
3010
3011 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
3012 {
3013
3014 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
3015
3016
3017 hi2c->Memaddress = 0xFFFFFFFFU;
3018 }
3019
3020 else
3021 {
3022
3023 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
3024
3025
3026 hi2c->Memaddress = I2C_MEM_ADD_LSB(MemAddress);
3027 }
3028
3029 if (hi2c->hdmatx != NULL)
3030 {
3031
3032 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
3033
3034
3035 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3036
3037
3038 hi2c->hdmatx->XferHalfCpltCallback = NULL;
3039 hi2c->hdmatx->XferAbortCallback = NULL;
3040
3041
3042 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR,
3043 hi2c->XferSize);
3044 }
3045 else
3046 {
3047
3048 hi2c->State = HAL_I2C_STATE_READY;
3049 hi2c->Mode = HAL_I2C_MODE_NONE;
3050
3051
3052 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3053
3054
3055 __HAL_UNLOCK(hi2c);
3056
3057 return HAL_ERROR;
3058 }
3059
3060 if (dmaxferstatus == HAL_OK)
3061 {
3062
3063 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
3064
3065
3066 __HAL_UNLOCK(hi2c);
3067
3068
3069
3070
3071
3072
3073
3074
3075 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3076 }
3077 else
3078 {
3079
3080 hi2c->State = HAL_I2C_STATE_READY;
3081 hi2c->Mode = HAL_I2C_MODE_NONE;
3082
3083
3084 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3085
3086
3087 __HAL_UNLOCK(hi2c);
3088
3089 return HAL_ERROR;
3090 }
3091
3092 return HAL_OK;
3093 }
3094 else
3095 {
3096 return HAL_BUSY;
3097 }
3098 }
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112 HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
3113 uint16_t MemAddSize, uint8_t *pData, uint16_t Size)
3114 {
3115 HAL_StatusTypeDef dmaxferstatus;
3116
3117
3118 assert_param(IS_I2C_MEMADD_SIZE(MemAddSize));
3119
3120 if (hi2c->State == HAL_I2C_STATE_READY)
3121 {
3122 if ((pData == NULL) || (Size == 0U))
3123 {
3124 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
3125 return HAL_ERROR;
3126 }
3127
3128 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
3129 {
3130 return HAL_BUSY;
3131 }
3132
3133
3134 __HAL_LOCK(hi2c);
3135
3136 hi2c->State = HAL_I2C_STATE_BUSY_RX;
3137 hi2c->Mode = HAL_I2C_MODE_MEM;
3138 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3139
3140
3141 hi2c->pBuffPtr = pData;
3142 hi2c->XferCount = Size;
3143 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
3144 hi2c->XferISR = I2C_Mem_ISR_DMA;
3145 hi2c->Devaddress = DevAddress;
3146
3147 if (hi2c->XferCount > MAX_NBYTE_SIZE)
3148 {
3149 hi2c->XferSize = MAX_NBYTE_SIZE;
3150 }
3151 else
3152 {
3153 hi2c->XferSize = hi2c->XferCount;
3154 }
3155
3156
3157 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
3158 {
3159
3160 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
3161
3162
3163 hi2c->Memaddress = 0xFFFFFFFFU;
3164 }
3165
3166 else
3167 {
3168
3169 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
3170
3171
3172 hi2c->Memaddress = I2C_MEM_ADD_LSB(MemAddress);
3173 }
3174
3175 if (hi2c->hdmarx != NULL)
3176 {
3177
3178 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
3179
3180
3181 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
3182
3183
3184 hi2c->hdmarx->XferHalfCpltCallback = NULL;
3185 hi2c->hdmarx->XferAbortCallback = NULL;
3186
3187
3188 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData,
3189 hi2c->XferSize);
3190 }
3191 else
3192 {
3193
3194 hi2c->State = HAL_I2C_STATE_READY;
3195 hi2c->Mode = HAL_I2C_MODE_NONE;
3196
3197
3198 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3199
3200
3201 __HAL_UNLOCK(hi2c);
3202
3203 return HAL_ERROR;
3204 }
3205
3206 if (dmaxferstatus == HAL_OK)
3207 {
3208
3209 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE);
3210
3211
3212 __HAL_UNLOCK(hi2c);
3213
3214
3215
3216
3217
3218
3219
3220
3221 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3222 }
3223 else
3224 {
3225
3226 hi2c->State = HAL_I2C_STATE_READY;
3227 hi2c->Mode = HAL_I2C_MODE_NONE;
3228
3229
3230 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3231
3232
3233 __HAL_UNLOCK(hi2c);
3234
3235 return HAL_ERROR;
3236 }
3237
3238 return HAL_OK;
3239 }
3240 else
3241 {
3242 return HAL_BUSY;
3243 }
3244 }
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257 HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials,
3258 uint32_t Timeout)
3259 {
3260 uint32_t tickstart;
3261
3262 __IO uint32_t I2C_Trials = 0UL;
3263
3264 FlagStatus tmp1;
3265 FlagStatus tmp2;
3266
3267 if (hi2c->State == HAL_I2C_STATE_READY)
3268 {
3269 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET)
3270 {
3271 return HAL_BUSY;
3272 }
3273
3274
3275 __HAL_LOCK(hi2c);
3276
3277 hi2c->State = HAL_I2C_STATE_BUSY;
3278 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3279
3280 do
3281 {
3282
3283 hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode, DevAddress);
3284
3285
3286
3287 tickstart = HAL_GetTick();
3288
3289 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
3290 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3291
3292 while ((tmp1 == RESET) && (tmp2 == RESET))
3293 {
3294 if (Timeout != HAL_MAX_DELAY)
3295 {
3296 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
3297 {
3298
3299 hi2c->State = HAL_I2C_STATE_READY;
3300
3301
3302 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3303
3304
3305 __HAL_UNLOCK(hi2c);
3306
3307 return HAL_ERROR;
3308 }
3309 }
3310
3311 tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF);
3312 tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF);
3313 }
3314
3315
3316 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET)
3317 {
3318
3319 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
3320 {
3321 return HAL_ERROR;
3322 }
3323
3324
3325 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
3326
3327
3328 hi2c->State = HAL_I2C_STATE_READY;
3329
3330
3331 __HAL_UNLOCK(hi2c);
3332
3333 return HAL_OK;
3334 }
3335 else
3336 {
3337
3338 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK)
3339 {
3340 return HAL_ERROR;
3341 }
3342
3343
3344 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
3345
3346
3347 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
3348 }
3349
3350
3351 I2C_Trials++;
3352 } while (I2C_Trials < Trials);
3353
3354
3355 hi2c->State = HAL_I2C_STATE_READY;
3356
3357
3358 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
3359
3360
3361 __HAL_UNLOCK(hi2c);
3362
3363 return HAL_ERROR;
3364 }
3365 else
3366 {
3367 return HAL_BUSY;
3368 }
3369 }
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383 HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
3384 uint16_t Size, uint32_t XferOptions)
3385 {
3386 uint32_t xfermode;
3387 uint32_t xferrequest = I2C_GENERATE_START_WRITE;
3388 uint32_t sizetoxfer = 0U;
3389
3390
3391 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3392
3393 if (hi2c->State == HAL_I2C_STATE_READY)
3394 {
3395
3396 __HAL_LOCK(hi2c);
3397
3398 hi2c->State = HAL_I2C_STATE_BUSY_TX;
3399 hi2c->Mode = HAL_I2C_MODE_MASTER;
3400 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3401
3402
3403 hi2c->pBuffPtr = pData;
3404 hi2c->XferCount = Size;
3405 hi2c->XferOptions = XferOptions;
3406 hi2c->XferISR = I2C_Master_ISR_IT;
3407
3408
3409 if (hi2c->XferCount > MAX_NBYTE_SIZE)
3410 {
3411 hi2c->XferSize = MAX_NBYTE_SIZE;
3412 xfermode = I2C_RELOAD_MODE;
3413 }
3414 else
3415 {
3416 hi2c->XferSize = hi2c->XferCount;
3417 xfermode = hi2c->XferOptions;
3418 }
3419
3420 if ((hi2c->XferSize > 0U) && ((XferOptions == I2C_FIRST_FRAME) || \
3421 (XferOptions == I2C_FIRST_AND_LAST_FRAME)))
3422 {
3423
3424
3425 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
3426
3427
3428 hi2c->pBuffPtr++;
3429
3430 sizetoxfer = hi2c->XferSize;
3431 hi2c->XferCount--;
3432 hi2c->XferSize--;
3433 }
3434
3435
3436
3437
3438 if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && \
3439 (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3440 {
3441 xferrequest = I2C_NO_STARTSTOP;
3442 }
3443 else
3444 {
3445
3446 I2C_ConvertOtherXferOptions(hi2c);
3447
3448
3449 if (hi2c->XferCount <= MAX_NBYTE_SIZE)
3450 {
3451 xfermode = hi2c->XferOptions;
3452 }
3453 }
3454
3455
3456 if ((XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_FIRST_AND_LAST_FRAME))
3457 {
3458 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)sizetoxfer, xfermode, xferrequest);
3459 }
3460 else
3461 {
3462 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3463 }
3464
3465
3466 __HAL_UNLOCK(hi2c);
3467
3468
3469
3470
3471
3472
3473
3474
3475 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3476
3477 return HAL_OK;
3478 }
3479 else
3480 {
3481 return HAL_BUSY;
3482 }
3483 }
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497 HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
3498 uint16_t Size, uint32_t XferOptions)
3499 {
3500 uint32_t xfermode;
3501 uint32_t xferrequest = I2C_GENERATE_START_WRITE;
3502 HAL_StatusTypeDef dmaxferstatus;
3503 uint32_t sizetoxfer = 0U;
3504
3505
3506 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3507
3508 if (hi2c->State == HAL_I2C_STATE_READY)
3509 {
3510
3511 __HAL_LOCK(hi2c);
3512
3513 hi2c->State = HAL_I2C_STATE_BUSY_TX;
3514 hi2c->Mode = HAL_I2C_MODE_MASTER;
3515 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3516
3517
3518 hi2c->pBuffPtr = pData;
3519 hi2c->XferCount = Size;
3520 hi2c->XferOptions = XferOptions;
3521 hi2c->XferISR = I2C_Master_ISR_DMA;
3522
3523
3524 if (hi2c->XferCount > MAX_NBYTE_SIZE)
3525 {
3526 hi2c->XferSize = MAX_NBYTE_SIZE;
3527 xfermode = I2C_RELOAD_MODE;
3528 }
3529 else
3530 {
3531 hi2c->XferSize = hi2c->XferCount;
3532 xfermode = hi2c->XferOptions;
3533 }
3534
3535 if ((hi2c->XferSize > 0U) && ((XferOptions == I2C_FIRST_FRAME) || \
3536 (XferOptions == I2C_FIRST_AND_LAST_FRAME)))
3537 {
3538
3539
3540 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
3541
3542
3543 hi2c->pBuffPtr++;
3544
3545 sizetoxfer = hi2c->XferSize;
3546 hi2c->XferCount--;
3547 hi2c->XferSize--;
3548 }
3549
3550
3551
3552
3553 if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && \
3554 (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3555 {
3556 xferrequest = I2C_NO_STARTSTOP;
3557 }
3558 else
3559 {
3560
3561 I2C_ConvertOtherXferOptions(hi2c);
3562
3563
3564 if (hi2c->XferCount <= MAX_NBYTE_SIZE)
3565 {
3566 xfermode = hi2c->XferOptions;
3567 }
3568 }
3569
3570 if (hi2c->XferSize > 0U)
3571 {
3572 if (hi2c->hdmatx != NULL)
3573 {
3574
3575 hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt;
3576
3577
3578 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
3579
3580
3581 hi2c->hdmatx->XferHalfCpltCallback = NULL;
3582 hi2c->hdmatx->XferAbortCallback = NULL;
3583
3584
3585 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr,
3586 (uint32_t)&hi2c->Instance->TXDR, hi2c->XferSize);
3587 }
3588 else
3589 {
3590
3591 hi2c->State = HAL_I2C_STATE_READY;
3592 hi2c->Mode = HAL_I2C_MODE_NONE;
3593
3594
3595 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3596
3597
3598 __HAL_UNLOCK(hi2c);
3599
3600 return HAL_ERROR;
3601 }
3602
3603 if (dmaxferstatus == HAL_OK)
3604 {
3605
3606 if ((XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_FIRST_AND_LAST_FRAME))
3607 {
3608 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)sizetoxfer, xfermode, xferrequest);
3609 }
3610 else
3611 {
3612 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3613 }
3614
3615
3616 hi2c->XferCount -= hi2c->XferSize;
3617
3618
3619 __HAL_UNLOCK(hi2c);
3620
3621
3622
3623
3624
3625 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
3626
3627
3628 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
3629 }
3630 else
3631 {
3632
3633 hi2c->State = HAL_I2C_STATE_READY;
3634 hi2c->Mode = HAL_I2C_MODE_NONE;
3635
3636
3637 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3638
3639
3640 __HAL_UNLOCK(hi2c);
3641
3642 return HAL_ERROR;
3643 }
3644 }
3645 else
3646 {
3647
3648 hi2c->XferISR = I2C_Master_ISR_IT;
3649
3650
3651
3652 if ((XferOptions == I2C_FIRST_FRAME) || (XferOptions == I2C_FIRST_AND_LAST_FRAME))
3653 {
3654 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)sizetoxfer, xfermode, xferrequest);
3655 }
3656 else
3657 {
3658 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3659 }
3660
3661
3662 __HAL_UNLOCK(hi2c);
3663
3664
3665
3666
3667
3668
3669
3670
3671 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
3672 }
3673
3674 return HAL_OK;
3675 }
3676 else
3677 {
3678 return HAL_BUSY;
3679 }
3680 }
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694 HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
3695 uint16_t Size, uint32_t XferOptions)
3696 {
3697 uint32_t xfermode;
3698 uint32_t xferrequest = I2C_GENERATE_START_READ;
3699
3700
3701 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3702
3703 if (hi2c->State == HAL_I2C_STATE_READY)
3704 {
3705
3706 __HAL_LOCK(hi2c);
3707
3708 hi2c->State = HAL_I2C_STATE_BUSY_RX;
3709 hi2c->Mode = HAL_I2C_MODE_MASTER;
3710 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3711
3712
3713 hi2c->pBuffPtr = pData;
3714 hi2c->XferCount = Size;
3715 hi2c->XferOptions = XferOptions;
3716 hi2c->XferISR = I2C_Master_ISR_IT;
3717
3718
3719 if (hi2c->XferCount > MAX_NBYTE_SIZE)
3720 {
3721 hi2c->XferSize = MAX_NBYTE_SIZE;
3722 xfermode = I2C_RELOAD_MODE;
3723 }
3724 else
3725 {
3726 hi2c->XferSize = hi2c->XferCount;
3727 xfermode = hi2c->XferOptions;
3728 }
3729
3730
3731
3732
3733 if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && \
3734 (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3735 {
3736 xferrequest = I2C_NO_STARTSTOP;
3737 }
3738 else
3739 {
3740
3741 I2C_ConvertOtherXferOptions(hi2c);
3742
3743
3744 if (hi2c->XferCount <= MAX_NBYTE_SIZE)
3745 {
3746 xfermode = hi2c->XferOptions;
3747 }
3748 }
3749
3750
3751 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3752
3753
3754 __HAL_UNLOCK(hi2c);
3755
3756
3757
3758
3759 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
3760
3761 return HAL_OK;
3762 }
3763 else
3764 {
3765 return HAL_BUSY;
3766 }
3767 }
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781 HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData,
3782 uint16_t Size, uint32_t XferOptions)
3783 {
3784 uint32_t xfermode;
3785 uint32_t xferrequest = I2C_GENERATE_START_READ;
3786 HAL_StatusTypeDef dmaxferstatus;
3787
3788
3789 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3790
3791 if (hi2c->State == HAL_I2C_STATE_READY)
3792 {
3793
3794 __HAL_LOCK(hi2c);
3795
3796 hi2c->State = HAL_I2C_STATE_BUSY_RX;
3797 hi2c->Mode = HAL_I2C_MODE_MASTER;
3798 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
3799
3800
3801 hi2c->pBuffPtr = pData;
3802 hi2c->XferCount = Size;
3803 hi2c->XferOptions = XferOptions;
3804 hi2c->XferISR = I2C_Master_ISR_DMA;
3805
3806
3807 if (hi2c->XferCount > MAX_NBYTE_SIZE)
3808 {
3809 hi2c->XferSize = MAX_NBYTE_SIZE;
3810 xfermode = I2C_RELOAD_MODE;
3811 }
3812 else
3813 {
3814 hi2c->XferSize = hi2c->XferCount;
3815 xfermode = hi2c->XferOptions;
3816 }
3817
3818
3819
3820
3821 if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && \
3822 (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0))
3823 {
3824 xferrequest = I2C_NO_STARTSTOP;
3825 }
3826 else
3827 {
3828
3829 I2C_ConvertOtherXferOptions(hi2c);
3830
3831
3832 if (hi2c->XferCount <= MAX_NBYTE_SIZE)
3833 {
3834 xfermode = hi2c->XferOptions;
3835 }
3836 }
3837
3838 if (hi2c->XferSize > 0U)
3839 {
3840 if (hi2c->hdmarx != NULL)
3841 {
3842
3843 hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt;
3844
3845
3846 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
3847
3848
3849 hi2c->hdmarx->XferHalfCpltCallback = NULL;
3850 hi2c->hdmarx->XferAbortCallback = NULL;
3851
3852
3853 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData,
3854 hi2c->XferSize);
3855 }
3856 else
3857 {
3858
3859 hi2c->State = HAL_I2C_STATE_READY;
3860 hi2c->Mode = HAL_I2C_MODE_NONE;
3861
3862
3863 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
3864
3865
3866 __HAL_UNLOCK(hi2c);
3867
3868 return HAL_ERROR;
3869 }
3870
3871 if (dmaxferstatus == HAL_OK)
3872 {
3873
3874 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest);
3875
3876
3877 hi2c->XferCount -= hi2c->XferSize;
3878
3879
3880 __HAL_UNLOCK(hi2c);
3881
3882
3883
3884
3885
3886 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
3887
3888
3889 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
3890 }
3891 else
3892 {
3893
3894 hi2c->State = HAL_I2C_STATE_READY;
3895 hi2c->Mode = HAL_I2C_MODE_NONE;
3896
3897
3898 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
3899
3900
3901 __HAL_UNLOCK(hi2c);
3902
3903 return HAL_ERROR;
3904 }
3905 }
3906 else
3907 {
3908
3909 hi2c->XferISR = I2C_Master_ISR_IT;
3910
3911
3912
3913 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE,
3914 I2C_GENERATE_START_READ);
3915
3916
3917 __HAL_UNLOCK(hi2c);
3918
3919
3920
3921
3922
3923
3924
3925
3926 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
3927 }
3928
3929 return HAL_OK;
3930 }
3931 else
3932 {
3933 return HAL_BUSY;
3934 }
3935 }
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
3948 uint32_t XferOptions)
3949 {
3950
3951 FlagStatus tmp;
3952
3953
3954 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
3955
3956 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
3957 {
3958 if ((pData == NULL) || (Size == 0U))
3959 {
3960 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
3961 return HAL_ERROR;
3962 }
3963
3964
3965 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
3966
3967
3968 __HAL_LOCK(hi2c);
3969
3970
3971
3972 if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
3973 {
3974
3975 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
3976
3977
3978 if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
3979 {
3980 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
3981
3982 if (hi2c->hdmarx != NULL)
3983 {
3984
3985
3986 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
3987
3988
3989 if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
3990 {
3991
3992 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
3993 }
3994 }
3995 }
3996 }
3997
3998 hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN;
3999 hi2c->Mode = HAL_I2C_MODE_SLAVE;
4000 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4001
4002
4003 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
4004
4005
4006 hi2c->pBuffPtr = pData;
4007 hi2c->XferCount = Size;
4008 hi2c->XferSize = hi2c->XferCount;
4009 hi2c->XferOptions = XferOptions;
4010 hi2c->XferISR = I2C_Slave_ISR_IT;
4011
4012 tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
4013 if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) && (tmp != RESET))
4014 {
4015
4016
4017 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
4018 }
4019
4020
4021 __HAL_UNLOCK(hi2c);
4022
4023
4024
4025
4026
4027 I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT);
4028
4029 return HAL_OK;
4030 }
4031 else
4032 {
4033 return HAL_ERROR;
4034 }
4035 }
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
4048 uint32_t XferOptions)
4049 {
4050
4051 FlagStatus tmp;
4052 HAL_StatusTypeDef dmaxferstatus;
4053
4054
4055 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4056
4057 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4058 {
4059 if ((pData == NULL) || (Size == 0U))
4060 {
4061 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
4062 return HAL_ERROR;
4063 }
4064
4065
4066 __HAL_LOCK(hi2c);
4067
4068
4069 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
4070
4071
4072
4073 if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
4074 {
4075
4076 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
4077
4078 if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
4079 {
4080
4081 if (hi2c->hdmarx != NULL)
4082 {
4083 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
4084
4085
4086
4087 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
4088
4089
4090 if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
4091 {
4092
4093 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4094 }
4095 }
4096 }
4097 }
4098 else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
4099 {
4100 if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
4101 {
4102 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
4103
4104
4105 if (hi2c->hdmatx != NULL)
4106 {
4107
4108
4109 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4110
4111
4112 if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
4113 {
4114
4115 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4116 }
4117 }
4118 }
4119 }
4120 else
4121 {
4122
4123 }
4124
4125 hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN;
4126 hi2c->Mode = HAL_I2C_MODE_SLAVE;
4127 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4128
4129
4130 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
4131
4132
4133 hi2c->pBuffPtr = pData;
4134 hi2c->XferCount = Size;
4135 hi2c->XferSize = hi2c->XferCount;
4136 hi2c->XferOptions = XferOptions;
4137 hi2c->XferISR = I2C_Slave_ISR_DMA;
4138
4139 if (hi2c->hdmatx != NULL)
4140 {
4141
4142 hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt;
4143
4144
4145 hi2c->hdmatx->XferErrorCallback = I2C_DMAError;
4146
4147
4148 hi2c->hdmatx->XferHalfCpltCallback = NULL;
4149 hi2c->hdmatx->XferAbortCallback = NULL;
4150
4151
4152 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR,
4153 hi2c->XferSize);
4154 }
4155 else
4156 {
4157
4158 hi2c->State = HAL_I2C_STATE_LISTEN;
4159 hi2c->Mode = HAL_I2C_MODE_NONE;
4160
4161
4162 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4163
4164
4165 __HAL_UNLOCK(hi2c);
4166
4167 return HAL_ERROR;
4168 }
4169
4170 if (dmaxferstatus == HAL_OK)
4171 {
4172
4173 hi2c->XferCount -= hi2c->XferSize;
4174
4175
4176 hi2c->XferSize = 0;
4177 }
4178 else
4179 {
4180
4181 hi2c->State = HAL_I2C_STATE_LISTEN;
4182 hi2c->Mode = HAL_I2C_MODE_NONE;
4183
4184
4185 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4186
4187
4188 __HAL_UNLOCK(hi2c);
4189
4190 return HAL_ERROR;
4191 }
4192
4193 tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
4194 if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) && (tmp != RESET))
4195 {
4196
4197
4198 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
4199 }
4200
4201
4202 __HAL_UNLOCK(hi2c);
4203
4204
4205 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
4206
4207
4208
4209
4210
4211 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
4212
4213 return HAL_OK;
4214 }
4215 else
4216 {
4217 return HAL_ERROR;
4218 }
4219 }
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
4232 uint32_t XferOptions)
4233 {
4234
4235 FlagStatus tmp;
4236
4237
4238 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4239
4240 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4241 {
4242 if ((pData == NULL) || (Size == 0U))
4243 {
4244 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
4245 return HAL_ERROR;
4246 }
4247
4248
4249 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);
4250
4251
4252 __HAL_LOCK(hi2c);
4253
4254
4255
4256 if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
4257 {
4258
4259 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
4260
4261 if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
4262 {
4263 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
4264
4265
4266 if (hi2c->hdmatx != NULL)
4267 {
4268
4269
4270 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4271
4272
4273 if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
4274 {
4275
4276 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4277 }
4278 }
4279 }
4280 }
4281
4282 hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN;
4283 hi2c->Mode = HAL_I2C_MODE_SLAVE;
4284 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4285
4286
4287 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
4288
4289
4290 hi2c->pBuffPtr = pData;
4291 hi2c->XferCount = Size;
4292 hi2c->XferSize = hi2c->XferCount;
4293 hi2c->XferOptions = XferOptions;
4294 hi2c->XferISR = I2C_Slave_ISR_IT;
4295
4296 tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
4297 if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) && (tmp != RESET))
4298 {
4299
4300
4301 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
4302 }
4303
4304
4305 __HAL_UNLOCK(hi2c);
4306
4307
4308
4309
4310
4311 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
4312
4313 return HAL_OK;
4314 }
4315 else
4316 {
4317 return HAL_ERROR;
4318 }
4319 }
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331 HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size,
4332 uint32_t XferOptions)
4333 {
4334
4335 FlagStatus tmp;
4336 HAL_StatusTypeDef dmaxferstatus;
4337
4338
4339 assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions));
4340
4341 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
4342 {
4343 if ((pData == NULL) || (Size == 0U))
4344 {
4345 hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM;
4346 return HAL_ERROR;
4347 }
4348
4349
4350 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);
4351
4352
4353 __HAL_LOCK(hi2c);
4354
4355
4356
4357 if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
4358 {
4359
4360 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
4361
4362 if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
4363 {
4364
4365 if (hi2c->hdmatx != NULL)
4366 {
4367 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
4368
4369
4370
4371 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
4372
4373
4374 if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
4375 {
4376
4377 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
4378 }
4379 }
4380 }
4381 }
4382 else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
4383 {
4384 if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
4385 {
4386 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
4387
4388
4389 if (hi2c->hdmarx != NULL)
4390 {
4391
4392
4393 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
4394
4395
4396 if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
4397 {
4398
4399 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
4400 }
4401 }
4402 }
4403 }
4404 else
4405 {
4406
4407 }
4408
4409 hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN;
4410 hi2c->Mode = HAL_I2C_MODE_SLAVE;
4411 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
4412
4413
4414 hi2c->Instance->CR2 &= ~I2C_CR2_NACK;
4415
4416
4417 hi2c->pBuffPtr = pData;
4418 hi2c->XferCount = Size;
4419 hi2c->XferSize = hi2c->XferCount;
4420 hi2c->XferOptions = XferOptions;
4421 hi2c->XferISR = I2C_Slave_ISR_DMA;
4422
4423 if (hi2c->hdmarx != NULL)
4424 {
4425
4426 hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt;
4427
4428
4429 hi2c->hdmarx->XferErrorCallback = I2C_DMAError;
4430
4431
4432 hi2c->hdmarx->XferHalfCpltCallback = NULL;
4433 hi2c->hdmarx->XferAbortCallback = NULL;
4434
4435
4436 dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR,
4437 (uint32_t)pData, hi2c->XferSize);
4438 }
4439 else
4440 {
4441
4442 hi2c->State = HAL_I2C_STATE_LISTEN;
4443 hi2c->Mode = HAL_I2C_MODE_NONE;
4444
4445
4446 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM;
4447
4448
4449 __HAL_UNLOCK(hi2c);
4450
4451 return HAL_ERROR;
4452 }
4453
4454 if (dmaxferstatus == HAL_OK)
4455 {
4456
4457 hi2c->XferCount -= hi2c->XferSize;
4458
4459
4460 hi2c->XferSize = 0;
4461 }
4462 else
4463 {
4464
4465 hi2c->State = HAL_I2C_STATE_LISTEN;
4466 hi2c->Mode = HAL_I2C_MODE_NONE;
4467
4468
4469 hi2c->ErrorCode |= HAL_I2C_ERROR_DMA;
4470
4471
4472 __HAL_UNLOCK(hi2c);
4473
4474 return HAL_ERROR;
4475 }
4476
4477 tmp = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_ADDR);
4478 if ((I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) && (tmp != RESET))
4479 {
4480
4481
4482 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
4483 }
4484
4485
4486 __HAL_UNLOCK(hi2c);
4487
4488
4489 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
4490
4491
4492
4493
4494
4495 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT);
4496
4497 return HAL_OK;
4498 }
4499 else
4500 {
4501 return HAL_ERROR;
4502 }
4503 }
4504
4505
4506
4507
4508
4509
4510
4511 HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c)
4512 {
4513 if (hi2c->State == HAL_I2C_STATE_READY)
4514 {
4515 hi2c->State = HAL_I2C_STATE_LISTEN;
4516 hi2c->XferISR = I2C_Slave_ISR_IT;
4517
4518
4519 I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
4520
4521 return HAL_OK;
4522 }
4523 else
4524 {
4525 return HAL_BUSY;
4526 }
4527 }
4528
4529
4530
4531
4532
4533
4534
4535 HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c)
4536 {
4537
4538 uint32_t tmp;
4539
4540
4541 if (hi2c->State == HAL_I2C_STATE_LISTEN)
4542 {
4543 tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK;
4544 hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode);
4545 hi2c->State = HAL_I2C_STATE_READY;
4546 hi2c->Mode = HAL_I2C_MODE_NONE;
4547 hi2c->XferISR = NULL;
4548
4549
4550 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
4551
4552 return HAL_OK;
4553 }
4554 else
4555 {
4556 return HAL_BUSY;
4557 }
4558 }
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568 HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress)
4569 {
4570 if (hi2c->Mode == HAL_I2C_MODE_MASTER)
4571 {
4572
4573 __HAL_LOCK(hi2c);
4574
4575
4576 if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
4577 {
4578 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
4579 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
4580 }
4581 else if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
4582 {
4583 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
4584 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
4585 }
4586 else
4587 {
4588
4589 }
4590
4591
4592 hi2c->State = HAL_I2C_STATE_ABORT;
4593
4594
4595
4596 I2C_TransferConfig(hi2c, DevAddress, 1, I2C_AUTOEND_MODE, I2C_GENERATE_STOP);
4597
4598
4599 __HAL_UNLOCK(hi2c);
4600
4601
4602
4603
4604 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
4605
4606 return HAL_OK;
4607 }
4608 else
4609 {
4610
4611
4612 return HAL_ERROR;
4613 }
4614 }
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631 void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c)
4632 {
4633
4634 uint32_t itflags = READ_REG(hi2c->Instance->ISR);
4635 uint32_t itsources = READ_REG(hi2c->Instance->CR1);
4636
4637
4638 if (hi2c->XferISR != NULL)
4639 {
4640 hi2c->XferISR(hi2c, itflags, itsources);
4641 }
4642 }
4643
4644
4645
4646
4647
4648
4649
4650 void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c)
4651 {
4652 uint32_t itflags = READ_REG(hi2c->Instance->ISR);
4653 uint32_t itsources = READ_REG(hi2c->Instance->CR1);
4654 uint32_t tmperror;
4655
4656
4657 if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_BERR) != RESET) && \
4658 (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET))
4659 {
4660 hi2c->ErrorCode |= HAL_I2C_ERROR_BERR;
4661
4662
4663 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
4664 }
4665
4666
4667 if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_OVR) != RESET) && \
4668 (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET))
4669 {
4670 hi2c->ErrorCode |= HAL_I2C_ERROR_OVR;
4671
4672
4673 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
4674 }
4675
4676
4677 if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_ARLO) != RESET) && \
4678 (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET))
4679 {
4680 hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO;
4681
4682
4683 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
4684 }
4685
4686
4687 tmperror = hi2c->ErrorCode;
4688
4689
4690 if ((tmperror & (HAL_I2C_ERROR_BERR | HAL_I2C_ERROR_OVR | HAL_I2C_ERROR_ARLO)) != HAL_I2C_ERROR_NONE)
4691 {
4692 I2C_ITError(hi2c, tmperror);
4693 }
4694 }
4695
4696
4697
4698
4699
4700
4701
4702 __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
4703 {
4704
4705 UNUSED(hi2c);
4706
4707
4708
4709
4710 }
4711
4712
4713
4714
4715
4716
4717
4718 __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
4719 {
4720
4721 UNUSED(hi2c);
4722
4723
4724
4725
4726 }
4727
4728
4729
4730
4731
4732
4733 __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c)
4734 {
4735
4736 UNUSED(hi2c);
4737
4738
4739
4740
4741 }
4742
4743
4744
4745
4746
4747
4748
4749 __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c)
4750 {
4751
4752 UNUSED(hi2c);
4753
4754
4755
4756
4757 }
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767 __weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode)
4768 {
4769
4770 UNUSED(hi2c);
4771 UNUSED(TransferDirection);
4772 UNUSED(AddrMatchCode);
4773
4774
4775
4776
4777 }
4778
4779
4780
4781
4782
4783
4784
4785 __weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
4786 {
4787
4788 UNUSED(hi2c);
4789
4790
4791
4792
4793 }
4794
4795
4796
4797
4798
4799
4800
4801 __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
4802 {
4803
4804 UNUSED(hi2c);
4805
4806
4807
4808
4809 }
4810
4811
4812
4813
4814
4815
4816
4817 __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
4818 {
4819
4820 UNUSED(hi2c);
4821
4822
4823
4824
4825 }
4826
4827
4828
4829
4830
4831
4832
4833 __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
4834 {
4835
4836 UNUSED(hi2c);
4837
4838
4839
4840
4841 }
4842
4843
4844
4845
4846
4847
4848
4849 __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c)
4850 {
4851
4852 UNUSED(hi2c);
4853
4854
4855
4856
4857 }
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885 HAL_I2C_StateTypeDef HAL_I2C_GetState(const I2C_HandleTypeDef *hi2c)
4886 {
4887
4888 return hi2c->State;
4889 }
4890
4891
4892
4893
4894
4895
4896
4897 HAL_I2C_ModeTypeDef HAL_I2C_GetMode(const I2C_HandleTypeDef *hi2c)
4898 {
4899 return hi2c->Mode;
4900 }
4901
4902
4903
4904
4905
4906
4907
4908 uint32_t HAL_I2C_GetError(const I2C_HandleTypeDef *hi2c)
4909 {
4910 return hi2c->ErrorCode;
4911 }
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933 static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
4934 uint32_t ITSources)
4935 {
4936 uint16_t devaddress;
4937 uint32_t tmpITFlags = ITFlags;
4938
4939
4940 __HAL_LOCK(hi2c);
4941
4942 if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \
4943 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))
4944 {
4945
4946 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
4947
4948
4949
4950
4951 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
4952
4953
4954 I2C_Flush_TXDR(hi2c);
4955 }
4956 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \
4957 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET))
4958 {
4959
4960 tmpITFlags &= ~I2C_FLAG_RXNE;
4961
4962
4963 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
4964
4965
4966 hi2c->pBuffPtr++;
4967
4968 hi2c->XferSize--;
4969 hi2c->XferCount--;
4970 }
4971 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) == RESET) && \
4972 ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \
4973 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)))
4974 {
4975
4976 if (hi2c->XferCount != 0U)
4977 {
4978
4979 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
4980
4981
4982 hi2c->pBuffPtr++;
4983
4984 hi2c->XferSize--;
4985 hi2c->XferCount--;
4986 }
4987 }
4988 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TCR) != RESET) && \
4989 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
4990 {
4991 if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
4992 {
4993 devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD);
4994
4995 if (hi2c->XferCount > MAX_NBYTE_SIZE)
4996 {
4997 hi2c->XferSize = MAX_NBYTE_SIZE;
4998 I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
4999 }
5000 else
5001 {
5002 hi2c->XferSize = hi2c->XferCount;
5003 if (hi2c->XferOptions != I2C_NO_OPTION_FRAME)
5004 {
5005 I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize,
5006 hi2c->XferOptions, I2C_NO_STARTSTOP);
5007 }
5008 else
5009 {
5010 I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize,
5011 I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
5012 }
5013 }
5014 }
5015 else
5016 {
5017
5018 if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)
5019 {
5020
5021 I2C_ITMasterSeqCplt(hi2c);
5022 }
5023 else
5024 {
5025
5026
5027 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
5028 }
5029 }
5030 }
5031 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) != RESET) && \
5032 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5033 {
5034 if (hi2c->XferCount == 0U)
5035 {
5036 if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)
5037 {
5038
5039 if (hi2c->XferOptions == I2C_NO_OPTION_FRAME)
5040 {
5041
5042 hi2c->Instance->CR2 |= I2C_CR2_STOP;
5043 }
5044 else
5045 {
5046
5047 I2C_ITMasterSeqCplt(hi2c);
5048 }
5049 }
5050 }
5051 else
5052 {
5053
5054
5055 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
5056 }
5057 }
5058 else
5059 {
5060
5061 }
5062
5063 if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \
5064 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))
5065 {
5066
5067 I2C_ITMasterCplt(hi2c, tmpITFlags);
5068 }
5069
5070
5071 __HAL_UNLOCK(hi2c);
5072
5073 return HAL_OK;
5074 }
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084 static HAL_StatusTypeDef I2C_Mem_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
5085 uint32_t ITSources)
5086 {
5087 uint32_t direction = I2C_GENERATE_START_WRITE;
5088 uint32_t tmpITFlags = ITFlags;
5089
5090
5091 __HAL_LOCK(hi2c);
5092
5093 if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \
5094 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))
5095 {
5096
5097 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5098
5099
5100
5101
5102 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
5103
5104
5105 I2C_Flush_TXDR(hi2c);
5106 }
5107 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \
5108 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET))
5109 {
5110
5111 tmpITFlags &= ~I2C_FLAG_RXNE;
5112
5113
5114 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
5115
5116
5117 hi2c->pBuffPtr++;
5118
5119 hi2c->XferSize--;
5120 hi2c->XferCount--;
5121 }
5122 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \
5123 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET))
5124 {
5125 if (hi2c->Memaddress == 0xFFFFFFFFU)
5126 {
5127
5128 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
5129
5130
5131 hi2c->pBuffPtr++;
5132
5133 hi2c->XferSize--;
5134 hi2c->XferCount--;
5135 }
5136 else
5137 {
5138
5139 hi2c->Instance->TXDR = hi2c->Memaddress;
5140
5141
5142 hi2c->Memaddress = 0xFFFFFFFFU;
5143 }
5144 }
5145 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TCR) != RESET) && \
5146 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5147 {
5148 if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U))
5149 {
5150 if (hi2c->XferCount > MAX_NBYTE_SIZE)
5151 {
5152 hi2c->XferSize = MAX_NBYTE_SIZE;
5153 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5154 I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
5155 }
5156 else
5157 {
5158 hi2c->XferSize = hi2c->XferCount;
5159 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5160 I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
5161 }
5162 }
5163 else
5164 {
5165
5166
5167 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
5168 }
5169 }
5170 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) != RESET) && \
5171 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5172 {
5173
5174 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
5175
5176
5177 I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);
5178
5179 if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5180 {
5181 direction = I2C_GENERATE_START_READ;
5182 }
5183
5184 if (hi2c->XferCount > MAX_NBYTE_SIZE)
5185 {
5186 hi2c->XferSize = MAX_NBYTE_SIZE;
5187
5188
5189 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5190 I2C_RELOAD_MODE, direction);
5191 }
5192 else
5193 {
5194 hi2c->XferSize = hi2c->XferCount;
5195
5196
5197 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5198 I2C_AUTOEND_MODE, direction);
5199 }
5200 }
5201 else
5202 {
5203
5204 }
5205
5206 if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \
5207 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))
5208 {
5209
5210 I2C_ITMasterCplt(hi2c, tmpITFlags);
5211 }
5212
5213
5214 __HAL_UNLOCK(hi2c);
5215
5216 return HAL_OK;
5217 }
5218
5219
5220
5221
5222
5223
5224
5225
5226
5227 static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
5228 uint32_t ITSources)
5229 {
5230 uint32_t tmpoptions = hi2c->XferOptions;
5231 uint32_t tmpITFlags = ITFlags;
5232
5233
5234 __HAL_LOCK(hi2c);
5235
5236
5237 if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \
5238 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))
5239 {
5240
5241 I2C_ITSlaveCplt(hi2c, tmpITFlags);
5242 }
5243 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \
5244 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))
5245 {
5246
5247
5248
5249
5250 if (hi2c->XferCount == 0U)
5251 {
5252 if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME))
5253
5254
5255 {
5256
5257 I2C_ITListenCplt(hi2c, tmpITFlags);
5258 }
5259 else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME))
5260 {
5261
5262 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5263
5264
5265 I2C_Flush_TXDR(hi2c);
5266
5267
5268
5269 I2C_ITSlaveSeqCplt(hi2c);
5270 }
5271 else
5272 {
5273
5274 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5275 }
5276 }
5277 else
5278 {
5279
5280
5281 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5282
5283
5284 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
5285
5286 if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME))
5287 {
5288
5289 I2C_ITError(hi2c, hi2c->ErrorCode);
5290 }
5291 }
5292 }
5293 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \
5294 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET))
5295 {
5296 if (hi2c->XferCount > 0U)
5297 {
5298
5299 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
5300
5301
5302 hi2c->pBuffPtr++;
5303
5304 hi2c->XferSize--;
5305 hi2c->XferCount--;
5306 }
5307
5308 if ((hi2c->XferCount == 0U) && \
5309 (tmpoptions != I2C_NO_OPTION_FRAME))
5310 {
5311
5312 I2C_ITSlaveSeqCplt(hi2c);
5313 }
5314 }
5315 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_ADDR) != RESET) && \
5316 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET))
5317 {
5318 I2C_ITAddrCplt(hi2c, tmpITFlags);
5319 }
5320 else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \
5321 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET))
5322 {
5323
5324
5325
5326
5327 if (hi2c->XferCount > 0U)
5328 {
5329
5330 hi2c->Instance->TXDR = *hi2c->pBuffPtr;
5331
5332
5333 hi2c->pBuffPtr++;
5334
5335 hi2c->XferCount--;
5336 hi2c->XferSize--;
5337 }
5338 else
5339 {
5340 if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME))
5341 {
5342
5343
5344 I2C_ITSlaveSeqCplt(hi2c);
5345 }
5346 }
5347 }
5348 else
5349 {
5350
5351 }
5352
5353
5354 __HAL_UNLOCK(hi2c);
5355
5356 return HAL_OK;
5357 }
5358
5359
5360
5361
5362
5363
5364
5365
5366
5367 static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
5368 uint32_t ITSources)
5369 {
5370 uint16_t devaddress;
5371 uint32_t xfermode;
5372
5373
5374 __HAL_LOCK(hi2c);
5375
5376 if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \
5377 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))
5378 {
5379
5380 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5381
5382
5383 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
5384
5385
5386
5387
5388 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
5389
5390
5391 I2C_Flush_TXDR(hi2c);
5392 }
5393 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TCR) != RESET) && \
5394 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5395 {
5396
5397 __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_TCI);
5398
5399 if (hi2c->XferCount != 0U)
5400 {
5401
5402 devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD);
5403
5404
5405 if (hi2c->XferCount > MAX_NBYTE_SIZE)
5406 {
5407 hi2c->XferSize = MAX_NBYTE_SIZE;
5408 xfermode = I2C_RELOAD_MODE;
5409 }
5410 else
5411 {
5412 hi2c->XferSize = hi2c->XferCount;
5413 if (hi2c->XferOptions != I2C_NO_OPTION_FRAME)
5414 {
5415 xfermode = hi2c->XferOptions;
5416 }
5417 else
5418 {
5419 xfermode = I2C_AUTOEND_MODE;
5420 }
5421 }
5422
5423
5424 I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP);
5425
5426
5427 hi2c->XferCount -= hi2c->XferSize;
5428
5429
5430 if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5431 {
5432 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
5433 }
5434 else
5435 {
5436 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
5437 }
5438 }
5439 else
5440 {
5441
5442 if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)
5443 {
5444
5445 I2C_ITMasterSeqCplt(hi2c);
5446 }
5447 else
5448 {
5449
5450
5451 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
5452 }
5453 }
5454 }
5455 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TC) != RESET) && \
5456 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5457 {
5458 if (hi2c->XferCount == 0U)
5459 {
5460 if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE)
5461 {
5462
5463 if (hi2c->XferOptions == I2C_NO_OPTION_FRAME)
5464 {
5465
5466 hi2c->Instance->CR2 |= I2C_CR2_STOP;
5467 }
5468 else
5469 {
5470
5471 I2C_ITMasterSeqCplt(hi2c);
5472 }
5473 }
5474 }
5475 else
5476 {
5477
5478
5479 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
5480 }
5481 }
5482 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \
5483 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))
5484 {
5485
5486 I2C_ITMasterCplt(hi2c, ITFlags);
5487 }
5488 else
5489 {
5490
5491 }
5492
5493
5494 __HAL_UNLOCK(hi2c);
5495
5496 return HAL_OK;
5497 }
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507 static HAL_StatusTypeDef I2C_Mem_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
5508 uint32_t ITSources)
5509 {
5510 uint32_t direction = I2C_GENERATE_START_WRITE;
5511
5512
5513 __HAL_LOCK(hi2c);
5514
5515 if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \
5516 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))
5517 {
5518
5519 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5520
5521
5522 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
5523
5524
5525
5526
5527 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
5528
5529
5530 I2C_Flush_TXDR(hi2c);
5531 }
5532 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TXIS) != RESET) && \
5533 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET))
5534 {
5535
5536 hi2c->Instance->TXDR = hi2c->Memaddress;
5537
5538
5539 hi2c->Memaddress = 0xFFFFFFFFU;
5540 }
5541 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TCR) != RESET) && \
5542 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5543 {
5544
5545 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
5546
5547
5548 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
5549
5550 if (hi2c->XferCount != 0U)
5551 {
5552
5553 if (hi2c->XferCount > MAX_NBYTE_SIZE)
5554 {
5555 hi2c->XferSize = MAX_NBYTE_SIZE;
5556 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5557 I2C_RELOAD_MODE, I2C_NO_STARTSTOP);
5558 }
5559 else
5560 {
5561 hi2c->XferSize = hi2c->XferCount;
5562 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5563 I2C_AUTOEND_MODE, I2C_NO_STARTSTOP);
5564 }
5565
5566
5567 hi2c->XferCount -= hi2c->XferSize;
5568
5569
5570 if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5571 {
5572 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
5573 }
5574 else
5575 {
5576 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
5577 }
5578 }
5579 else
5580 {
5581
5582
5583 I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE);
5584 }
5585 }
5586 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TC) != RESET) && \
5587 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET))
5588 {
5589
5590 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
5591
5592
5593 I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT);
5594
5595 if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5596 {
5597 direction = I2C_GENERATE_START_READ;
5598 }
5599
5600 if (hi2c->XferCount > MAX_NBYTE_SIZE)
5601 {
5602 hi2c->XferSize = MAX_NBYTE_SIZE;
5603
5604
5605 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5606 I2C_RELOAD_MODE, direction);
5607 }
5608 else
5609 {
5610 hi2c->XferSize = hi2c->XferCount;
5611
5612
5613 I2C_TransferConfig(hi2c, (uint16_t)hi2c->Devaddress, (uint8_t)hi2c->XferSize,
5614 I2C_AUTOEND_MODE, direction);
5615 }
5616
5617
5618 hi2c->XferCount -= hi2c->XferSize;
5619
5620
5621 if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
5622 {
5623 hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN;
5624 }
5625 else
5626 {
5627 hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN;
5628 }
5629 }
5630 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \
5631 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))
5632 {
5633
5634 I2C_ITMasterCplt(hi2c, ITFlags);
5635 }
5636 else
5637 {
5638
5639 }
5640
5641
5642 __HAL_UNLOCK(hi2c);
5643
5644 return HAL_OK;
5645 }
5646
5647
5648
5649
5650
5651
5652
5653
5654
5655 static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags,
5656 uint32_t ITSources)
5657 {
5658 uint32_t tmpoptions = hi2c->XferOptions;
5659 uint32_t treatdmanack = 0U;
5660 HAL_I2C_StateTypeDef tmpstate;
5661
5662
5663 __HAL_LOCK(hi2c);
5664
5665
5666 if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \
5667 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET))
5668 {
5669
5670 I2C_ITSlaveCplt(hi2c, ITFlags);
5671 }
5672 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \
5673 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET))
5674 {
5675
5676
5677
5678
5679 if ((I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET) ||
5680 (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET))
5681 {
5682
5683 if (hi2c->hdmarx != NULL)
5684 {
5685 if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET)
5686 {
5687 if (I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx) == 0U)
5688 {
5689 treatdmanack = 1U;
5690 }
5691 }
5692 }
5693
5694
5695 if (hi2c->hdmatx != NULL)
5696 {
5697 if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET)
5698 {
5699 if (I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx) == 0U)
5700 {
5701 treatdmanack = 1U;
5702 }
5703 }
5704 }
5705
5706 if (treatdmanack == 1U)
5707 {
5708 if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME))
5709
5710
5711 {
5712
5713 I2C_ITListenCplt(hi2c, ITFlags);
5714 }
5715 else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME))
5716 {
5717
5718 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5719
5720
5721 I2C_Flush_TXDR(hi2c);
5722
5723
5724
5725 I2C_ITSlaveSeqCplt(hi2c);
5726 }
5727 else
5728 {
5729
5730 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5731 }
5732 }
5733 else
5734 {
5735
5736
5737 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5738
5739
5740 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
5741
5742
5743 tmpstate = hi2c->State;
5744
5745 if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME))
5746 {
5747 if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN))
5748 {
5749 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
5750 }
5751 else if ((tmpstate == HAL_I2C_STATE_BUSY_RX) || (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN))
5752 {
5753 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
5754 }
5755 else
5756 {
5757
5758 }
5759
5760
5761 I2C_ITError(hi2c, hi2c->ErrorCode);
5762 }
5763 }
5764 }
5765 else
5766 {
5767
5768 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
5769 }
5770 }
5771 else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_ADDR) != RESET) && \
5772 (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET))
5773 {
5774 I2C_ITAddrCplt(hi2c, ITFlags);
5775 }
5776 else
5777 {
5778
5779 }
5780
5781
5782 __HAL_UNLOCK(hi2c);
5783
5784 return HAL_OK;
5785 }
5786
5787
5788
5789
5790
5791
5792
5793
5794
5795
5796
5797
5798
5799 static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
5800 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
5801 uint32_t Tickstart)
5802 {
5803 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE);
5804
5805
5806 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
5807 {
5808 return HAL_ERROR;
5809 }
5810
5811
5812 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
5813 {
5814
5815 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
5816 }
5817
5818 else
5819 {
5820
5821 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
5822
5823
5824 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
5825 {
5826 return HAL_ERROR;
5827 }
5828
5829
5830 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
5831 }
5832
5833
5834 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, Tickstart) != HAL_OK)
5835 {
5836 return HAL_ERROR;
5837 }
5838
5839 return HAL_OK;
5840 }
5841
5842
5843
5844
5845
5846
5847
5848
5849
5850
5851
5852
5853
5854 static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
5855 uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout,
5856 uint32_t Tickstart)
5857 {
5858 I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE);
5859
5860
5861 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
5862 {
5863 return HAL_ERROR;
5864 }
5865
5866
5867 if (MemAddSize == I2C_MEMADD_SIZE_8BIT)
5868 {
5869
5870 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
5871 }
5872
5873 else
5874 {
5875
5876 hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress);
5877
5878
5879 if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK)
5880 {
5881 return HAL_ERROR;
5882 }
5883
5884
5885 hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress);
5886 }
5887
5888
5889 if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout, Tickstart) != HAL_OK)
5890 {
5891 return HAL_ERROR;
5892 }
5893
5894 return HAL_OK;
5895 }
5896
5897
5898
5899
5900
5901
5902
5903 static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
5904 {
5905 uint8_t transferdirection;
5906 uint16_t slaveaddrcode;
5907 uint16_t ownadd1code;
5908 uint16_t ownadd2code;
5909
5910
5911 UNUSED(ITFlags);
5912
5913
5914 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN)
5915 {
5916 transferdirection = I2C_GET_DIR(hi2c);
5917 slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c);
5918 ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c);
5919 ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c);
5920
5921
5922 if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT)
5923 {
5924 if ((slaveaddrcode & SLAVE_ADDR_MSK) == ((ownadd1code >> SLAVE_ADDR_SHIFT) & SLAVE_ADDR_MSK))
5925 {
5926 slaveaddrcode = ownadd1code;
5927 hi2c->AddrEventCount++;
5928 if (hi2c->AddrEventCount == 2U)
5929 {
5930
5931 hi2c->AddrEventCount = 0U;
5932
5933
5934 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
5935
5936
5937 __HAL_UNLOCK(hi2c);
5938
5939
5940 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5941 hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode);
5942 #else
5943 HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);
5944 #endif
5945 }
5946 }
5947 else
5948 {
5949 slaveaddrcode = ownadd2code;
5950
5951
5952 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
5953
5954
5955 __HAL_UNLOCK(hi2c);
5956
5957
5958 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5959 hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode);
5960 #else
5961 HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);
5962 #endif
5963 }
5964 }
5965
5966 else
5967 {
5968
5969 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT);
5970
5971
5972 __HAL_UNLOCK(hi2c);
5973
5974
5975 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
5976 hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode);
5977 #else
5978 HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode);
5979 #endif
5980 }
5981 }
5982
5983 else
5984 {
5985
5986 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
5987
5988
5989 __HAL_UNLOCK(hi2c);
5990 }
5991 }
5992
5993
5994
5995
5996
5997
5998 static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c)
5999 {
6000
6001 hi2c->Mode = HAL_I2C_MODE_NONE;
6002
6003
6004
6005 if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
6006 {
6007 hi2c->State = HAL_I2C_STATE_READY;
6008 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
6009 hi2c->XferISR = NULL;
6010
6011
6012 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
6013
6014
6015 __HAL_UNLOCK(hi2c);
6016
6017
6018 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6019 hi2c->MasterTxCpltCallback(hi2c);
6020 #else
6021 HAL_I2C_MasterTxCpltCallback(hi2c);
6022 #endif
6023 }
6024
6025 else
6026 {
6027 hi2c->State = HAL_I2C_STATE_READY;
6028 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
6029 hi2c->XferISR = NULL;
6030
6031
6032 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
6033
6034
6035 __HAL_UNLOCK(hi2c);
6036
6037
6038 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6039 hi2c->MasterRxCpltCallback(hi2c);
6040 #else
6041 HAL_I2C_MasterRxCpltCallback(hi2c);
6042 #endif
6043 }
6044 }
6045
6046
6047
6048
6049
6050
6051 static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c)
6052 {
6053 uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1);
6054
6055
6056 hi2c->Mode = HAL_I2C_MODE_NONE;
6057
6058
6059 if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET)
6060 {
6061
6062 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
6063 }
6064 else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET)
6065 {
6066
6067 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
6068 }
6069 else
6070 {
6071
6072 }
6073
6074 if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN)
6075 {
6076
6077 hi2c->State = HAL_I2C_STATE_LISTEN;
6078 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6079
6080
6081 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
6082
6083
6084 __HAL_UNLOCK(hi2c);
6085
6086
6087 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6088 hi2c->SlaveTxCpltCallback(hi2c);
6089 #else
6090 HAL_I2C_SlaveTxCpltCallback(hi2c);
6091 #endif
6092 }
6093
6094 else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN)
6095 {
6096
6097 hi2c->State = HAL_I2C_STATE_LISTEN;
6098 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
6099
6100
6101 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
6102
6103
6104 __HAL_UNLOCK(hi2c);
6105
6106
6107 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6108 hi2c->SlaveRxCpltCallback(hi2c);
6109 #else
6110 HAL_I2C_SlaveRxCpltCallback(hi2c);
6111 #endif
6112 }
6113 else
6114 {
6115
6116 }
6117 }
6118
6119
6120
6121
6122
6123
6124
6125 static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
6126 {
6127 uint32_t tmperror;
6128 uint32_t tmpITFlags = ITFlags;
6129 __IO uint32_t tmpreg;
6130
6131
6132 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
6133
6134
6135 if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
6136 {
6137 I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);
6138 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX;
6139 }
6140 else if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
6141 {
6142 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT);
6143 hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX;
6144 }
6145 else
6146 {
6147
6148 }
6149
6150
6151 I2C_RESET_CR2(hi2c);
6152
6153
6154 hi2c->XferISR = NULL;
6155 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6156
6157 if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET)
6158 {
6159
6160 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6161
6162
6163 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6164 }
6165
6166
6167 if ((hi2c->State == HAL_I2C_STATE_ABORT) && (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET))
6168 {
6169
6170 tmpreg = (uint8_t)hi2c->Instance->RXDR;
6171 UNUSED(tmpreg);
6172 }
6173
6174
6175 I2C_Flush_TXDR(hi2c);
6176
6177
6178 tmperror = hi2c->ErrorCode;
6179
6180
6181 if ((hi2c->State == HAL_I2C_STATE_ABORT) || (tmperror != HAL_I2C_ERROR_NONE))
6182 {
6183
6184 I2C_ITError(hi2c, hi2c->ErrorCode);
6185 }
6186
6187 else if (hi2c->State == HAL_I2C_STATE_BUSY_TX)
6188 {
6189 hi2c->State = HAL_I2C_STATE_READY;
6190 hi2c->PreviousState = I2C_STATE_NONE;
6191
6192 if (hi2c->Mode == HAL_I2C_MODE_MEM)
6193 {
6194 hi2c->Mode = HAL_I2C_MODE_NONE;
6195
6196
6197 __HAL_UNLOCK(hi2c);
6198
6199
6200 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6201 hi2c->MemTxCpltCallback(hi2c);
6202 #else
6203 HAL_I2C_MemTxCpltCallback(hi2c);
6204 #endif
6205 }
6206 else
6207 {
6208 hi2c->Mode = HAL_I2C_MODE_NONE;
6209
6210
6211 __HAL_UNLOCK(hi2c);
6212
6213
6214 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6215 hi2c->MasterTxCpltCallback(hi2c);
6216 #else
6217 HAL_I2C_MasterTxCpltCallback(hi2c);
6218 #endif
6219 }
6220 }
6221
6222 else if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
6223 {
6224 hi2c->State = HAL_I2C_STATE_READY;
6225 hi2c->PreviousState = I2C_STATE_NONE;
6226
6227 if (hi2c->Mode == HAL_I2C_MODE_MEM)
6228 {
6229 hi2c->Mode = HAL_I2C_MODE_NONE;
6230
6231
6232 __HAL_UNLOCK(hi2c);
6233
6234
6235 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6236 hi2c->MemRxCpltCallback(hi2c);
6237 #else
6238 HAL_I2C_MemRxCpltCallback(hi2c);
6239 #endif
6240 }
6241 else
6242 {
6243 hi2c->Mode = HAL_I2C_MODE_NONE;
6244
6245
6246 __HAL_UNLOCK(hi2c);
6247
6248
6249 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6250 hi2c->MasterRxCpltCallback(hi2c);
6251 #else
6252 HAL_I2C_MasterRxCpltCallback(hi2c);
6253 #endif
6254 }
6255 }
6256 else
6257 {
6258
6259 }
6260 }
6261
6262
6263
6264
6265
6266
6267
6268 static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
6269 {
6270 uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1);
6271 uint32_t tmpITFlags = ITFlags;
6272 uint32_t tmpoptions = hi2c->XferOptions;
6273 HAL_I2C_StateTypeDef tmpstate = hi2c->State;
6274
6275
6276 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
6277
6278
6279 if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN))
6280 {
6281 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT);
6282 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX;
6283 }
6284 else if ((tmpstate == HAL_I2C_STATE_BUSY_RX) || (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN))
6285 {
6286 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT);
6287 hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX;
6288 }
6289 else if (tmpstate == HAL_I2C_STATE_LISTEN)
6290 {
6291 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT | I2C_XFER_RX_IT);
6292 hi2c->PreviousState = I2C_STATE_NONE;
6293 }
6294 else
6295 {
6296
6297 }
6298
6299
6300 hi2c->Instance->CR2 |= I2C_CR2_NACK;
6301
6302
6303 I2C_RESET_CR2(hi2c);
6304
6305
6306 I2C_Flush_TXDR(hi2c);
6307
6308
6309 if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET)
6310 {
6311
6312 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
6313
6314 if (hi2c->hdmatx != NULL)
6315 {
6316 hi2c->XferCount = (uint16_t)I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx);
6317 }
6318 }
6319 else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET)
6320 {
6321
6322 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
6323
6324 if (hi2c->hdmarx != NULL)
6325 {
6326 hi2c->XferCount = (uint16_t)I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx);
6327 }
6328 }
6329 else
6330 {
6331
6332 }
6333
6334
6335 if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET)
6336 {
6337
6338 tmpITFlags &= ~I2C_FLAG_RXNE;
6339
6340
6341 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
6342
6343
6344 hi2c->pBuffPtr++;
6345
6346 if ((hi2c->XferSize > 0U))
6347 {
6348 hi2c->XferSize--;
6349 hi2c->XferCount--;
6350 }
6351 }
6352
6353
6354 if (hi2c->XferCount != 0U)
6355 {
6356
6357 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6358 }
6359
6360 if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \
6361 (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_IT_NACKI) != RESET))
6362 {
6363
6364
6365
6366
6367 if (hi2c->XferCount == 0U)
6368 {
6369 if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME))
6370
6371
6372 {
6373
6374 I2C_ITListenCplt(hi2c, tmpITFlags);
6375 }
6376 else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME))
6377 {
6378
6379 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6380
6381
6382 I2C_Flush_TXDR(hi2c);
6383
6384
6385
6386 I2C_ITSlaveSeqCplt(hi2c);
6387 }
6388 else
6389 {
6390
6391 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6392 }
6393 }
6394 else
6395 {
6396
6397
6398 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6399
6400
6401 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6402
6403 if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME))
6404 {
6405
6406 I2C_ITError(hi2c, hi2c->ErrorCode);
6407 }
6408 }
6409 }
6410
6411 hi2c->Mode = HAL_I2C_MODE_NONE;
6412 hi2c->XferISR = NULL;
6413
6414 if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE)
6415 {
6416
6417 I2C_ITError(hi2c, hi2c->ErrorCode);
6418
6419
6420 if (hi2c->State == HAL_I2C_STATE_LISTEN)
6421 {
6422
6423 I2C_ITListenCplt(hi2c, tmpITFlags);
6424 }
6425 }
6426 else if (hi2c->XferOptions != I2C_NO_OPTION_FRAME)
6427 {
6428
6429 I2C_ITSlaveSeqCplt(hi2c);
6430
6431 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6432 hi2c->State = HAL_I2C_STATE_READY;
6433 hi2c->PreviousState = I2C_STATE_NONE;
6434
6435
6436 __HAL_UNLOCK(hi2c);
6437
6438
6439 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6440 hi2c->ListenCpltCallback(hi2c);
6441 #else
6442 HAL_I2C_ListenCpltCallback(hi2c);
6443 #endif
6444 }
6445
6446 else if (hi2c->State == HAL_I2C_STATE_BUSY_RX)
6447 {
6448 hi2c->State = HAL_I2C_STATE_READY;
6449 hi2c->PreviousState = I2C_STATE_NONE;
6450
6451
6452 __HAL_UNLOCK(hi2c);
6453
6454
6455 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6456 hi2c->SlaveRxCpltCallback(hi2c);
6457 #else
6458 HAL_I2C_SlaveRxCpltCallback(hi2c);
6459 #endif
6460 }
6461 else
6462 {
6463 hi2c->State = HAL_I2C_STATE_READY;
6464 hi2c->PreviousState = I2C_STATE_NONE;
6465
6466
6467 __HAL_UNLOCK(hi2c);
6468
6469
6470 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6471 hi2c->SlaveTxCpltCallback(hi2c);
6472 #else
6473 HAL_I2C_SlaveTxCpltCallback(hi2c);
6474 #endif
6475 }
6476 }
6477
6478
6479
6480
6481
6482
6483
6484 static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags)
6485 {
6486
6487 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6488 hi2c->PreviousState = I2C_STATE_NONE;
6489 hi2c->State = HAL_I2C_STATE_READY;
6490 hi2c->Mode = HAL_I2C_MODE_NONE;
6491 hi2c->XferISR = NULL;
6492
6493
6494 if (I2C_CHECK_FLAG(ITFlags, I2C_FLAG_RXNE) != RESET)
6495 {
6496
6497 *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR;
6498
6499
6500 hi2c->pBuffPtr++;
6501
6502 if ((hi2c->XferSize > 0U))
6503 {
6504 hi2c->XferSize--;
6505 hi2c->XferCount--;
6506
6507
6508 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6509 }
6510 }
6511
6512
6513 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);
6514
6515
6516 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6517
6518
6519 __HAL_UNLOCK(hi2c);
6520
6521
6522 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6523 hi2c->ListenCpltCallback(hi2c);
6524 #else
6525 HAL_I2C_ListenCpltCallback(hi2c);
6526 #endif
6527 }
6528
6529
6530
6531
6532
6533
6534
6535 static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode)
6536 {
6537 HAL_I2C_StateTypeDef tmpstate = hi2c->State;
6538
6539 uint32_t tmppreviousstate;
6540
6541
6542 hi2c->Mode = HAL_I2C_MODE_NONE;
6543 hi2c->XferOptions = I2C_NO_OPTION_FRAME;
6544 hi2c->XferCount = 0U;
6545
6546
6547 hi2c->ErrorCode |= ErrorCode;
6548
6549
6550 if ((tmpstate == HAL_I2C_STATE_LISTEN) ||
6551 (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) ||
6552 (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN))
6553 {
6554
6555 I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_TX_IT);
6556
6557
6558 hi2c->State = HAL_I2C_STATE_LISTEN;
6559 hi2c->XferISR = I2C_Slave_ISR_IT;
6560 }
6561 else
6562 {
6563
6564 I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT);
6565
6566
6567 I2C_Flush_TXDR(hi2c);
6568
6569
6570
6571 if (hi2c->State != HAL_I2C_STATE_ABORT)
6572 {
6573
6574 hi2c->State = HAL_I2C_STATE_READY;
6575
6576
6577 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET)
6578 {
6579 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
6580 {
6581 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
6582 hi2c->ErrorCode |= HAL_I2C_ERROR_AF;
6583 }
6584
6585
6586 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
6587 }
6588
6589 }
6590 hi2c->XferISR = NULL;
6591 }
6592
6593
6594 tmppreviousstate = hi2c->PreviousState;
6595
6596 if ((hi2c->hdmatx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_TX) || \
6597 (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX)))
6598 {
6599 if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN)
6600 {
6601 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
6602 }
6603
6604 if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY)
6605 {
6606
6607
6608 hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort;
6609
6610
6611 __HAL_UNLOCK(hi2c);
6612
6613
6614 if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK)
6615 {
6616
6617 hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx);
6618 }
6619 }
6620 else
6621 {
6622 I2C_TreatErrorCallback(hi2c);
6623 }
6624 }
6625
6626 else if ((hi2c->hdmarx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_RX) || \
6627 (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX)))
6628 {
6629 if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN)
6630 {
6631 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
6632 }
6633
6634 if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY)
6635 {
6636
6637
6638 hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort;
6639
6640
6641 __HAL_UNLOCK(hi2c);
6642
6643
6644 if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK)
6645 {
6646
6647 hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx);
6648 }
6649 }
6650 else
6651 {
6652 I2C_TreatErrorCallback(hi2c);
6653 }
6654 }
6655 else
6656 {
6657 I2C_TreatErrorCallback(hi2c);
6658 }
6659 }
6660
6661
6662
6663
6664
6665
6666 static void I2C_TreatErrorCallback(I2C_HandleTypeDef *hi2c)
6667 {
6668 if (hi2c->State == HAL_I2C_STATE_ABORT)
6669 {
6670 hi2c->State = HAL_I2C_STATE_READY;
6671 hi2c->PreviousState = I2C_STATE_NONE;
6672
6673
6674 __HAL_UNLOCK(hi2c);
6675
6676
6677 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6678 hi2c->AbortCpltCallback(hi2c);
6679 #else
6680 HAL_I2C_AbortCpltCallback(hi2c);
6681 #endif
6682 }
6683 else
6684 {
6685 hi2c->PreviousState = I2C_STATE_NONE;
6686
6687
6688 __HAL_UNLOCK(hi2c);
6689
6690
6691 #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
6692 hi2c->ErrorCallback(hi2c);
6693 #else
6694 HAL_I2C_ErrorCallback(hi2c);
6695 #endif
6696 }
6697 }
6698
6699
6700
6701
6702
6703
6704 static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c)
6705 {
6706
6707
6708 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) != RESET)
6709 {
6710 hi2c->Instance->TXDR = 0x00U;
6711 }
6712
6713
6714 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET)
6715 {
6716 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_TXE);
6717 }
6718 }
6719
6720
6721
6722
6723
6724
6725 static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma)
6726 {
6727
6728 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent);
6729
6730
6731 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
6732
6733
6734 if (hi2c->XferCount == 0U)
6735 {
6736
6737 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
6738 }
6739
6740 else
6741 {
6742
6743 hi2c->pBuffPtr += hi2c->XferSize;
6744
6745
6746 if (hi2c->XferCount > MAX_NBYTE_SIZE)
6747 {
6748 hi2c->XferSize = MAX_NBYTE_SIZE;
6749 }
6750 else
6751 {
6752 hi2c->XferSize = hi2c->XferCount;
6753 }
6754
6755
6756 if (HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR,
6757 hi2c->XferSize) != HAL_OK)
6758 {
6759
6760 I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);
6761 }
6762 else
6763 {
6764
6765 I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT);
6766 }
6767 }
6768 }
6769
6770
6771
6772
6773
6774
6775
6776 static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma)
6777 {
6778
6779 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent);
6780 uint32_t tmpoptions = hi2c->XferOptions;
6781
6782 if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME))
6783 {
6784
6785 hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN;
6786
6787
6788
6789 I2C_ITSlaveSeqCplt(hi2c);
6790 }
6791 else
6792 {
6793
6794
6795
6796 }
6797 }
6798
6799
6800
6801
6802
6803
6804
6805 static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma)
6806 {
6807
6808 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent);
6809
6810
6811 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
6812
6813
6814 if (hi2c->XferCount == 0U)
6815 {
6816
6817 I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT);
6818 }
6819
6820 else
6821 {
6822
6823 hi2c->pBuffPtr += hi2c->XferSize;
6824
6825
6826 if (hi2c->XferCount > MAX_NBYTE_SIZE)
6827 {
6828 hi2c->XferSize = MAX_NBYTE_SIZE;
6829 }
6830 else
6831 {
6832 hi2c->XferSize = hi2c->XferCount;
6833 }
6834
6835
6836 if (HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr,
6837 hi2c->XferSize) != HAL_OK)
6838 {
6839
6840 I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);
6841 }
6842 else
6843 {
6844
6845 I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT);
6846 }
6847 }
6848 }
6849
6850
6851
6852
6853
6854
6855
6856 static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma)
6857 {
6858
6859 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent);
6860 uint32_t tmpoptions = hi2c->XferOptions;
6861
6862 if ((I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx) == 0U) && \
6863 (tmpoptions != I2C_NO_OPTION_FRAME))
6864 {
6865
6866 hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN;
6867
6868
6869 I2C_ITSlaveSeqCplt(hi2c);
6870 }
6871 else
6872 {
6873
6874
6875
6876 }
6877 }
6878
6879
6880
6881
6882
6883
6884
6885 static void I2C_DMAError(DMA_HandleTypeDef *hdma)
6886 {
6887 uint32_t treatdmaerror = 0U;
6888
6889 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent);
6890
6891 if (hi2c->hdmatx != NULL)
6892 {
6893 if (I2C_GET_DMA_REMAIN_DATA(hi2c->hdmatx) == 0U)
6894 {
6895 treatdmaerror = 1U;
6896 }
6897 }
6898
6899 if (hi2c->hdmarx != NULL)
6900 {
6901 if (I2C_GET_DMA_REMAIN_DATA(hi2c->hdmarx) == 0U)
6902 {
6903 treatdmaerror = 1U;
6904 }
6905 }
6906
6907
6908 if (!((HAL_DMA_GetError(hdma) == HAL_DMA_ERROR_FE)) && (treatdmaerror != 0U))
6909 {
6910
6911 hi2c->Instance->CR2 |= I2C_CR2_NACK;
6912
6913
6914 I2C_ITError(hi2c, HAL_I2C_ERROR_DMA);
6915 }
6916 }
6917
6918
6919
6920
6921
6922
6923
6924
6925 static void I2C_DMAAbort(DMA_HandleTypeDef *hdma)
6926 {
6927
6928 I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent);
6929
6930
6931 if (hi2c->hdmatx != NULL)
6932 {
6933 hi2c->hdmatx->XferAbortCallback = NULL;
6934 }
6935 if (hi2c->hdmarx != NULL)
6936 {
6937 hi2c->hdmarx->XferAbortCallback = NULL;
6938 }
6939
6940 I2C_TreatErrorCallback(hi2c);
6941 }
6942
6943
6944
6945
6946
6947
6948
6949
6950
6951
6952
6953
6954
6955 static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagStatus Status,
6956 uint32_t Timeout, uint32_t Tickstart)
6957 {
6958 while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status)
6959 {
6960
6961 if (I2C_IsErrorOccurred(hi2c, Timeout, Tickstart) != HAL_OK)
6962 {
6963 return HAL_ERROR;
6964 }
6965
6966
6967 if (Timeout != HAL_MAX_DELAY)
6968 {
6969 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
6970 {
6971 if ((__HAL_I2C_GET_FLAG(hi2c, Flag) == Status))
6972 {
6973 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
6974 hi2c->State = HAL_I2C_STATE_READY;
6975 hi2c->Mode = HAL_I2C_MODE_NONE;
6976
6977
6978 __HAL_UNLOCK(hi2c);
6979 return HAL_ERROR;
6980 }
6981 }
6982 }
6983 }
6984 return HAL_OK;
6985 }
6986
6987
6988
6989
6990
6991
6992
6993
6994
6995 static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
6996 uint32_t Tickstart)
6997 {
6998 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)
6999 {
7000
7001 if (I2C_IsErrorOccurred(hi2c, Timeout, Tickstart) != HAL_OK)
7002 {
7003 return HAL_ERROR;
7004 }
7005
7006
7007 if (Timeout != HAL_MAX_DELAY)
7008 {
7009 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7010 {
7011 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET))
7012 {
7013 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7014 hi2c->State = HAL_I2C_STATE_READY;
7015 hi2c->Mode = HAL_I2C_MODE_NONE;
7016
7017
7018 __HAL_UNLOCK(hi2c);
7019
7020 return HAL_ERROR;
7021 }
7022 }
7023 }
7024 }
7025 return HAL_OK;
7026 }
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036 static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
7037 uint32_t Tickstart)
7038 {
7039 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
7040 {
7041
7042 if (I2C_IsErrorOccurred(hi2c, Timeout, Tickstart) != HAL_OK)
7043 {
7044 return HAL_ERROR;
7045 }
7046
7047
7048 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
7049 {
7050 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET))
7051 {
7052 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7053 hi2c->State = HAL_I2C_STATE_READY;
7054 hi2c->Mode = HAL_I2C_MODE_NONE;
7055
7056
7057 __HAL_UNLOCK(hi2c);
7058
7059 return HAL_ERROR;
7060 }
7061 }
7062 }
7063 return HAL_OK;
7064 }
7065
7066
7067
7068
7069
7070
7071
7072
7073
7074 static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout,
7075 uint32_t Tickstart)
7076 {
7077 HAL_StatusTypeDef status = HAL_OK;
7078
7079 while ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) && (status == HAL_OK))
7080 {
7081
7082 if (I2C_IsErrorOccurred(hi2c, Timeout, Tickstart) != HAL_OK)
7083 {
7084 status = HAL_ERROR;
7085 }
7086
7087
7088 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) && (status == HAL_OK))
7089 {
7090
7091
7092 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) && (hi2c->XferSize > 0U))
7093 {
7094
7095
7096 status = HAL_OK;
7097 }
7098
7099
7100 if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
7101 {
7102 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
7103 hi2c->ErrorCode = HAL_I2C_ERROR_AF;
7104
7105
7106 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
7107
7108
7109 I2C_RESET_CR2(hi2c);
7110
7111 hi2c->State = HAL_I2C_STATE_READY;
7112 hi2c->Mode = HAL_I2C_MODE_NONE;
7113
7114
7115 __HAL_UNLOCK(hi2c);
7116
7117 status = HAL_ERROR;
7118 }
7119 else
7120 {
7121 hi2c->ErrorCode = HAL_I2C_ERROR_NONE;
7122 }
7123 }
7124
7125
7126 if ((((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) && (status == HAL_OK))
7127 {
7128 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET))
7129 {
7130 hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT;
7131 hi2c->State = HAL_I2C_STATE_READY;
7132
7133
7134 __HAL_UNLOCK(hi2c);
7135
7136 status = HAL_ERROR;
7137 }
7138 }
7139 }
7140 return status;
7141 }
7142
7143
7144
7145
7146
7147
7148
7149
7150
7151 static HAL_StatusTypeDef I2C_IsErrorOccurred(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart)
7152 {
7153 HAL_StatusTypeDef status = HAL_OK;
7154 uint32_t itflag = hi2c->Instance->ISR;
7155 uint32_t error_code = 0;
7156 uint32_t tickstart = Tickstart;
7157 uint32_t tmp1;
7158 HAL_I2C_ModeTypeDef tmp2;
7159
7160 if (HAL_IS_BIT_SET(itflag, I2C_FLAG_AF))
7161 {
7162
7163 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
7164
7165
7166
7167 while ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) && (status == HAL_OK))
7168 {
7169
7170 if (Timeout != HAL_MAX_DELAY)
7171 {
7172 if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U))
7173 {
7174 tmp1 = (uint32_t)(hi2c->Instance->CR2 & I2C_CR2_STOP);
7175 tmp2 = hi2c->Mode;
7176
7177
7178 if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET) && \
7179 (tmp1 != I2C_CR2_STOP) && \
7180 (tmp2 != HAL_I2C_MODE_SLAVE))
7181 {
7182
7183 hi2c->Instance->CR2 |= I2C_CR2_STOP;
7184
7185
7186 tickstart = HAL_GetTick();
7187 }
7188
7189 while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
7190 {
7191
7192 if ((HAL_GetTick() - tickstart) > I2C_TIMEOUT_STOPF)
7193 {
7194 error_code |= HAL_I2C_ERROR_TIMEOUT;
7195
7196 status = HAL_ERROR;
7197
7198 break;
7199 }
7200 }
7201 }
7202 }
7203 }
7204
7205
7206 if (status == HAL_OK)
7207 {
7208
7209 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
7210 }
7211
7212 error_code |= HAL_I2C_ERROR_AF;
7213
7214 status = HAL_ERROR;
7215 }
7216
7217
7218 itflag = hi2c->Instance->ISR;
7219
7220
7221
7222 if (HAL_IS_BIT_SET(itflag, I2C_FLAG_BERR))
7223 {
7224 error_code |= HAL_I2C_ERROR_BERR;
7225
7226
7227 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
7228
7229 status = HAL_ERROR;
7230 }
7231
7232
7233 if (HAL_IS_BIT_SET(itflag, I2C_FLAG_OVR))
7234 {
7235 error_code |= HAL_I2C_ERROR_OVR;
7236
7237
7238 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
7239
7240 status = HAL_ERROR;
7241 }
7242
7243
7244 if (HAL_IS_BIT_SET(itflag, I2C_FLAG_ARLO))
7245 {
7246 error_code |= HAL_I2C_ERROR_ARLO;
7247
7248
7249 __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
7250
7251 status = HAL_ERROR;
7252 }
7253
7254 if (status != HAL_OK)
7255 {
7256
7257 I2C_Flush_TXDR(hi2c);
7258
7259
7260 I2C_RESET_CR2(hi2c);
7261
7262 hi2c->ErrorCode |= error_code;
7263 hi2c->State = HAL_I2C_STATE_READY;
7264 hi2c->Mode = HAL_I2C_MODE_NONE;
7265
7266
7267 __HAL_UNLOCK(hi2c);
7268 }
7269
7270 return status;
7271 }
7272
7273
7274
7275
7276
7277
7278
7279
7280
7281
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292 static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode,
7293 uint32_t Request)
7294 {
7295
7296 assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance));
7297 assert_param(IS_TRANSFER_MODE(Mode));
7298 assert_param(IS_TRANSFER_REQUEST(Request));
7299
7300
7301 uint32_t tmp = ((uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | \
7302 (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \
7303 (uint32_t)Mode | (uint32_t)Request) & (~0x80000000U));
7304
7305
7306 MODIFY_REG(hi2c->Instance->CR2, \
7307 ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | \
7308 (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | \
7309 I2C_CR2_START | I2C_CR2_STOP)), tmp);
7310 }
7311
7312
7313
7314
7315
7316
7317
7318
7319 static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
7320 {
7321 uint32_t tmpisr = 0U;
7322
7323 if ((hi2c->XferISR != I2C_Master_ISR_DMA) && \
7324 (hi2c->XferISR != I2C_Slave_ISR_DMA) && \
7325 (hi2c->XferISR != I2C_Mem_ISR_DMA))
7326 {
7327 if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
7328 {
7329
7330 tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
7331 }
7332
7333 if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)
7334 {
7335
7336 tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI;
7337 }
7338
7339 if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)
7340 {
7341
7342 tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI;
7343 }
7344
7345 if (InterruptRequest == I2C_XFER_ERROR_IT)
7346 {
7347
7348 tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;
7349 }
7350
7351 if (InterruptRequest == I2C_XFER_CPLT_IT)
7352 {
7353
7354 tmpisr |= I2C_IT_STOPI;
7355 }
7356 }
7357
7358 else
7359 {
7360 if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
7361 {
7362
7363 tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
7364 }
7365
7366 if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)
7367 {
7368
7369 tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI;
7370 }
7371
7372 if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)
7373 {
7374
7375 tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI;
7376 }
7377
7378 if (InterruptRequest == I2C_XFER_ERROR_IT)
7379 {
7380
7381 tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;
7382 }
7383
7384 if (InterruptRequest == I2C_XFER_CPLT_IT)
7385 {
7386
7387 tmpisr |= (I2C_IT_STOPI | I2C_IT_TCI);
7388 }
7389
7390 if (InterruptRequest == I2C_XFER_RELOAD_IT)
7391 {
7392
7393 tmpisr |= I2C_IT_TCI;
7394 }
7395 }
7396
7397
7398
7399
7400 __HAL_I2C_ENABLE_IT(hi2c, tmpisr);
7401 }
7402
7403
7404
7405
7406
7407
7408
7409
7410 static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest)
7411 {
7412 uint32_t tmpisr = 0U;
7413
7414 if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT)
7415 {
7416
7417 tmpisr |= I2C_IT_TCI | I2C_IT_TXI;
7418
7419 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN)
7420 {
7421
7422 tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
7423 }
7424 }
7425
7426 if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT)
7427 {
7428
7429 tmpisr |= I2C_IT_TCI | I2C_IT_RXI;
7430
7431 if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN)
7432 {
7433
7434 tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
7435 }
7436 }
7437
7438 if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT)
7439 {
7440
7441 tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI;
7442 }
7443
7444 if (InterruptRequest == I2C_XFER_ERROR_IT)
7445 {
7446
7447 tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI;
7448 }
7449
7450 if (InterruptRequest == I2C_XFER_CPLT_IT)
7451 {
7452
7453 tmpisr |= I2C_IT_STOPI;
7454 }
7455
7456 if (InterruptRequest == I2C_XFER_RELOAD_IT)
7457 {
7458
7459 tmpisr |= I2C_IT_TCI;
7460 }
7461
7462
7463
7464
7465 __HAL_I2C_DISABLE_IT(hi2c, tmpisr);
7466 }
7467
7468
7469
7470
7471
7472
7473 static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c)
7474 {
7475
7476
7477
7478 if (hi2c->XferOptions == I2C_OTHER_FRAME)
7479 {
7480 hi2c->XferOptions = I2C_FIRST_FRAME;
7481 }
7482
7483
7484
7485
7486 else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME)
7487 {
7488 hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME;
7489 }
7490 else
7491 {
7492
7493 }
7494 }
7495
7496
7497
7498
7499
7500 #endif
7501
7502
7503
7504
7505
7506
7507