I2CMaster::I2CMaster( I2C_TypeDef* i2c_device, uint32_t clock_speed, uint32_t duty_cycle, uint32_t addressing_mode, uint32_t timeout, std::vector<GPIOPin> data_pins ) : timeout_(timeout) { for (auto& data_pin : data_pins) data_pin.init(); if (i2c_device == I2C1) { __HAL_RCC_I2C1_CLK_ENABLE(); } else if (i2c_device == I2C2) { __HAL_RCC_I2C2_CLK_ENABLE(); } else if (i2c_device == I2C3) { __HAL_RCC_I2C3_CLK_ENABLE(); } handle_.Instance = i2c_device; handle_.Init.AddressingMode = addressing_mode; handle_.Init.ClockSpeed = clock_speed; handle_.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; handle_.Init.DutyCycle = duty_cycle; handle_.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; handle_.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; handle_.Init.OwnAddress1 = 0x00; handle_.Init.OwnAddress2 = 0xFE; init(); }
bool ADXL345::init(RANGE range, DATA_RATE dataRate){ GPIO PB10(GPIOB, GPIO::PIN10); GPIO PB11(GPIOB, GPIO::PIN11); PB10.init(GPIO::AF, GPIO::OD, GPIO::NONE, GPIO::MEDIUM); PB11.init(GPIO::AF, GPIO::OD, GPIO::NONE, GPIO::MEDIUM); /* Init I2C peripherals */ __HAL_RCC_I2C2_CLK_ENABLE(); i2c2.Instance = I2C2; i2c2.Init.ClockSpeed = 100000; // clock speed 100kHz i2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; i2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; i2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; i2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; i2c2.Init.OwnAddress1 = 0x00; i2c2.Init.OwnAddress2 = 0x00; i2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; HAL_I2C_Init(&i2c2); if(this->getDevID() != 0xE5){ return false; } this->writeByte(POWER_CTL_REG, 0x08); // enable mesuare mode this->clearSettings(); this->setRange(range); this->setDataRate(dataRate); return true; }
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) { GPIO_InitTypeDef GPIO_InitStruct; if(i2cHandle->Instance==I2C2) { /* USER CODE BEGIN I2C2_MspInit 0 */ /* USER CODE END I2C2_MspInit 0 */ /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C2_CLK_ENABLE(); /* USER CODE BEGIN I2C2_MspInit 1 */ /* USER CODE END I2C2_MspInit 1 */ } }
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA */ GPIO_InitStruct.Pin = I2C1_SCL_POT1_Pin|I2C1_SDA_POT1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); /* USER CODE BEGIN I2C1_MspInit 1 */ /* USER CODE END I2C1_MspInit 1 */ } else if(hi2c->Instance==I2C2) { /* USER CODE BEGIN I2C2_MspInit 0 */ /* USER CODE END I2C2_MspInit 0 */ /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = I2C2_SCL_POT2_Pin|I2C2_SDA_POT2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C2_CLK_ENABLE(); /* USER CODE BEGIN I2C2_MspInit 1 */ /* USER CODE END I2C2_MspInit 1 */ } }
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB7 ------> I2C1_SDA PB6 ------> I2C1_SCL */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN I2C1_MspInit 1 */ __HAL_RCC_I2C1_CLK_ENABLE(); /* USER CODE END I2C1_MspInit 1 */ } else if(hi2c->Instance==I2C2) { /* USER CODE BEGIN I2C2_MspInit 0 */ __HAL_RCC_GPIOB_CLK_ENABLE(); /* USER CODE END I2C2_MspInit 0 */ /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN I2C2_MspInit 1 */ __HAL_RCC_I2C2_CLK_ENABLE(); /* USER CODE END I2C2_MspInit 1 */ } }
void LSM_initI2C() { GPIO_InitTypeDef i2c_pins; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_I2C2_CLK_ENABLE(); i2c_pins.Pin=SDA_PIN|SCL_PIN; i2c_pins.Mode=GPIO_MODE_AF_OD; i2c_pins.Alternate = GPIO_AF4_I2C2; i2c_pins.Speed=GPIO_SPEED_FAST; i2c_pins.Pull=GPIO_NOPULL; HAL_GPIO_Init(I2C_PORT,&i2c_pins); imu_i2c_handler.Instance = I2C2; imu_i2c_handler.Init.AddressingMode=I2C_ADDRESSINGMODE_7BIT; //an i dieuthinsi tou periferiakou einai 7 h 10 bit imu_i2c_handler.Init.ClockSpeed=100000;//100 khz imu_i2c_handler.Init.DualAddressMode=I2C_DUALADDRESS_DISABLE; imu_i2c_handler.Init.DutyCycle=I2C_DUTYCYCLE_16_9; imu_i2c_handler.Init.GeneralCallMode=I2C_GENERALCALL_DISABLE; // imu_i2c_handler.Init.NoStretchMode=I2C_NOSTRETCH_DISABLE; //den kserw ti kanei imu_i2c_handler.Init.OwnAddress1=0x01; //dieuthinsi pou akouei o master HAL_I2C_Init(&imu_i2c_handler); }
void i2cInit(I2CDevice device) { /*## Configure the I2C clock source. The clock is derived from the SYSCLK #*/ // RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct; // RCC_PeriphCLKInitStruct.PeriphClockSelection = i2cHardwareMap[device].clk; // RCC_PeriphCLKInitStruct.I2c1ClockSelection = i2cHardwareMap[device].clk_src; // HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct); switch (device) { case I2CDEV_1: __HAL_RCC_I2C1_CLK_ENABLE(); break; case I2CDEV_2: __HAL_RCC_I2C2_CLK_ENABLE(); break; case I2CDEV_3: __HAL_RCC_I2C3_CLK_ENABLE(); break; case I2CDEV_4: __HAL_RCC_I2C4_CLK_ENABLE(); break; default: break; } if (device == I2CINVALID) return; i2cDevice_t *i2c; i2c = &(i2cHardwareMap[device]); //I2C_InitTypeDef i2cInit; IO_t scl = IOGetByTag(i2c->scl); IO_t sda = IOGetByTag(i2c->sda); IOInit(scl, OWNER_I2C_SCL, RESOURCE_INDEX(device)); IOInit(sda, OWNER_I2C_SDA, RESOURCE_INDEX(device)); // Enable RCC RCC_ClockCmd(i2c->rcc, ENABLE); i2cUnstick(scl, sda); // Init pins #ifdef STM32F7 IOConfigGPIOAF(scl, IOCFG_I2C, i2c->af); IOConfigGPIOAF(sda, IOCFG_I2C, i2c->af); #else IOConfigGPIO(scl, IOCFG_AF_OD); IOConfigGPIO(sda, IOCFG_AF_OD); #endif // Init I2C peripheral HAL_I2C_DeInit(&i2cHandle[device].Handle); i2cHandle[device].Handle.Instance = i2cHardwareMap[device].dev; /// TODO: HAL check if I2C timing is correct i2cHandle[device].Handle.Init.Timing = 0x00B01B59; //i2cHandle[device].Handle.Init.Timing = 0x00D00E28; /* (Rise time = 120ns, Fall time = 25ns) */ i2cHandle[device].Handle.Init.OwnAddress1 = 0x0; i2cHandle[device].Handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; i2cHandle[device].Handle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; i2cHandle[device].Handle.Init.OwnAddress2 = 0x0; i2cHandle[device].Handle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; i2cHandle[device].Handle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&i2cHandle[device].Handle); /* Enable the Analog I2C Filter */ HAL_I2CEx_ConfigAnalogFilter(&i2cHandle[device].Handle,I2C_ANALOGFILTER_ENABLE); HAL_NVIC_SetPriority(i2cHardwareMap[device].er_irq, NVIC_PRIORITY_BASE(NVIC_PRIO_I2C_ER), NVIC_PRIORITY_SUB(NVIC_PRIO_I2C_ER)); HAL_NVIC_EnableIRQ(i2cHardwareMap[device].er_irq); HAL_NVIC_SetPriority(i2cHardwareMap[device].ev_irq, NVIC_PRIORITY_BASE(NVIC_PRIO_I2C_EV), NVIC_PRIORITY_SUB(NVIC_PRIO_I2C_EV)); HAL_NVIC_EnableIRQ(i2cHardwareMap[device].ev_irq); }
/** * @brief Initializes peripherals used by the I2C EEPROM driver. * @param None * @retval None */ void sEE_LowLevel_Init(new_twi* TwiStruct) { GPIO_InitTypeDef GPIO_InitStructure; /*!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable */ //RCC_APB2PeriphClockCmd(GET_PORT_CLK_ADDR[TwiStruct->SclPort] | GET_PORT_CLK_ADDR[TwiStruct->SdaPort], ENABLE); _gpio_init(TwiStruct->SclPort); _gpio_init(TwiStruct->SdaPort); /*!< sEE_I2C Periph clock enable */ //RCC_APB1PeriphClockCmd(I2C_CLK[TwiStruct->TwiNr], ENABLE); switch(TwiStruct->TwiNr) { #ifdef __HAL_RCC_I2C1_CLK_ENABLE case 0: __HAL_RCC_I2C1_CLK_ENABLE(); break; #endif #ifdef __HAL_RCC_I2C2_CLK_ENABLE case 1: __HAL_RCC_I2C2_CLK_ENABLE(); break; #endif #ifdef __HAL_RCC_I2C3_CLK_ENABLE case 2: __HAL_RCC_I2C3_CLK_ENABLE(); break; #endif #ifdef __HAL_RCC_I2C4_CLK_ENABLE case 3: __HAL_RCC_I2C4_CLK_ENABLE(); break; #endif #ifdef __HAL_RCC_I2C5_CLK_ENABLE case 4: __HAL_RCC_I2C5_CLK_ENABLE(); break; #endif #ifdef __HAL_RCC_I2C6_CLK_ENABLE case 5: __HAL_RCC_I2C6_CLK_ENABLE(); break; #endif } /*!< GPIO configuration */ /*!< Configure sEE_I2C pins: SCL */ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM; GPIO_InitStructure.Alternate = GPIO_AF4_I2C1; GPIO_InitStructure.Mode = GPIO_MODE_AF_OD; GPIO_InitStructure.Pull = GPIO_PULLUP; if(TwiStruct->TwiNr == 3 && TwiStruct->SclPort == IOB && TwiStruct->SclPin == 8) GPIO_InitStructure.Alternate = GPIO_AF1_I2C4; GPIO_InitStructure.Pin = 1 << TwiStruct->SclPin; HAL_GPIO_Init(GET_GPIO_PORT_ADDR[TwiStruct->SclPort], &GPIO_InitStructure); GPIO_InitStructure.Alternate = GPIO_AF4_I2C1; if(TwiStruct->TwiNr == 3 && TwiStruct->SdaPort == IOB && TwiStruct->SdaPin == 7) GPIO_InitStructure.Alternate = GPIO_AF11_I2C4; else if(TwiStruct->TwiNr == 3 && TwiStruct->SdaPort == IOB && TwiStruct->SdaPin == 9) GPIO_InitStructure.Alternate = GPIO_AF1_I2C4; /*!< Configure sEE_I2C pins: SDA */ //GPIO_InitStructure.Mode = GPIO_OType_OD; GPIO_InitStructure.Pin = 1 << TwiStruct->SdaPin; HAL_GPIO_Init(GET_GPIO_PORT_ADDR[TwiStruct->SdaPort], &GPIO_InitStructure); }
void enableGPIOPowerUsageAndNoiseReductions(void) { // AHB1 __HAL_RCC_BKPSRAM_CLK_ENABLE(); __HAL_RCC_DTCMRAMEN_CLK_ENABLE(); __HAL_RCC_DMA2_CLK_ENABLE(); __HAL_RCC_USB_OTG_HS_CLK_ENABLE(); __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); #ifndef STM32F722xx __HAL_RCC_DMA2D_CLK_ENABLE(); __HAL_RCC_GPIOJ_CLK_ENABLE(); __HAL_RCC_GPIOK_CLK_ENABLE(); #endif //APB1 __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); __HAL_RCC_TIM4_CLK_ENABLE(); __HAL_RCC_TIM5_CLK_ENABLE(); __HAL_RCC_TIM6_CLK_ENABLE(); __HAL_RCC_TIM7_CLK_ENABLE(); __HAL_RCC_TIM12_CLK_ENABLE(); __HAL_RCC_TIM13_CLK_ENABLE(); __HAL_RCC_TIM14_CLK_ENABLE(); __HAL_RCC_LPTIM1_CLK_ENABLE(); __HAL_RCC_SPI2_CLK_ENABLE(); __HAL_RCC_SPI3_CLK_ENABLE(); __HAL_RCC_USART2_CLK_ENABLE(); __HAL_RCC_USART3_CLK_ENABLE(); __HAL_RCC_UART4_CLK_ENABLE(); __HAL_RCC_UART5_CLK_ENABLE(); __HAL_RCC_I2C1_CLK_ENABLE(); __HAL_RCC_I2C2_CLK_ENABLE(); __HAL_RCC_I2C3_CLK_ENABLE(); __HAL_RCC_CAN1_CLK_ENABLE(); __HAL_RCC_DAC_CLK_ENABLE(); __HAL_RCC_UART7_CLK_ENABLE(); __HAL_RCC_UART8_CLK_ENABLE(); #ifndef STM32F722xx __HAL_RCC_I2C4_CLK_ENABLE(); __HAL_RCC_CAN2_CLK_ENABLE(); __HAL_RCC_CEC_CLK_ENABLE(); #endif //APB2 __HAL_RCC_TIM1_CLK_ENABLE(); __HAL_RCC_TIM8_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); __HAL_RCC_USART6_CLK_ENABLE(); __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_ADC2_CLK_ENABLE(); __HAL_RCC_ADC3_CLK_ENABLE(); __HAL_RCC_SDMMC1_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_SPI4_CLK_ENABLE(); __HAL_RCC_TIM9_CLK_ENABLE(); __HAL_RCC_TIM10_CLK_ENABLE(); __HAL_RCC_TIM11_CLK_ENABLE(); __HAL_RCC_SPI5_CLK_ENABLE(); __HAL_RCC_SAI1_CLK_ENABLE(); __HAL_RCC_SAI2_CLK_ENABLE(); #ifndef STM32F722xx __HAL_RCC_SPI6_CLK_ENABLE(); #endif // // GPIO_InitTypeDef GPIO_InitStructure; // GPIO_StructInit(&GPIO_InitStructure); // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // default is un-pulled input // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // GPIO_InitStructure.GPIO_Pin &= ~(GPIO_Pin_11 | GPIO_Pin_12); // leave USB D+/D- alone // // GPIO_InitStructure.GPIO_Pin &= ~(GPIO_Pin_13 | GPIO_Pin_14); // leave JTAG pins alone // GPIO_Init(GPIOA, &GPIO_InitStructure); // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // GPIO_Init(GPIOB, &GPIO_InitStructure); // // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; // GPIO_Init(GPIOC, &GPIO_InitStructure); // GPIO_Init(GPIOD, &GPIO_InitStructure); // GPIO_Init(GPIOE, &GPIO_InitStructure); }
void I2C_Init() { __HAL_RCC_I2C2_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1_Channel4_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 1, 4); HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn); /* DMA1_Channel5_IRQn interrupt configuration */ HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 1, 3); HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn); hi2c2.Instance = I2C2; hi2c2.Init.ClockSpeed = 100000; hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c2.Init.OwnAddress1 = 0; hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c2.Init.OwnAddress2 = 0; hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; HAL_I2C_Init(&hi2c2); GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /* USER CODE BEGIN I2C2_MspInit 0 */ /* USER CODE END I2C2_MspInit 0 */ /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C2_CLK_ENABLE(); /* Peripheral DMA init*/ hdma_i2c2_rx.Instance = DMA1_Channel5; hdma_i2c2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_i2c2_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_i2c2_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_i2c2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_i2c2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_i2c2_rx.Init.Mode = DMA_NORMAL; hdma_i2c2_rx.Init.Priority = DMA_PRIORITY_MEDIUM; HAL_DMA_Init(&hdma_i2c2_rx); __HAL_LINKDMA(&hi2c2,hdmarx,hdma_i2c2_rx); hdma_i2c2_tx.Instance = DMA1_Channel4; hdma_i2c2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_i2c2_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_i2c2_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_i2c2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_i2c2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_i2c2_tx.Init.Mode = DMA_NORMAL; hdma_i2c2_tx.Init.Priority = DMA_PRIORITY_MEDIUM; HAL_DMA_Init(&hdma_i2c2_tx); __HAL_LINKDMA(&hi2c2,hdmatx,hdma_i2c2_tx); /* Peripheral interrupt init */ HAL_NVIC_SetPriority(I2C2_EV_IRQn, 0, 0); HAL_NVIC_EnableIRQ(I2C2_EV_IRQn); HAL_NVIC_SetPriority(I2C2_ER_IRQn, 0, 0); HAL_NVIC_EnableIRQ(I2C2_ER_IRQn); /* USER CODE BEGIN I2C2_MspInit 1 */ /* USER CODE END I2C2_MspInit 1 */ }
void pyb_i2c_init(I2C_HandleTypeDef *i2c) { int i2c_unit; const pin_obj_t *scl_pin; const pin_obj_t *sda_pin; if (0) { #if defined(MICROPY_HW_I2C1_SCL) } else if (i2c == &I2CHandle1) { i2c_unit = 1; scl_pin = MICROPY_HW_I2C1_SCL; sda_pin = MICROPY_HW_I2C1_SDA; __HAL_RCC_I2C1_CLK_ENABLE(); #endif #if defined(MICROPY_HW_I2C2_SCL) } else if (i2c == &I2CHandle2) { i2c_unit = 2; scl_pin = MICROPY_HW_I2C2_SCL; sda_pin = MICROPY_HW_I2C2_SDA; __HAL_RCC_I2C2_CLK_ENABLE(); #endif #if defined(MICROPY_HW_I2C3_SCL) } else if (i2c == &I2CHandle3) { i2c_unit = 3; scl_pin = MICROPY_HW_I2C3_SCL; sda_pin = MICROPY_HW_I2C3_SDA; __HAL_RCC_I2C3_CLK_ENABLE(); #endif #if defined(MICROPY_HW_I2C4_SCL) } else if (i2c == &I2CHandle4) { i2c_unit = 4; scl_pin = MICROPY_HW_I2C4_SCL; sda_pin = MICROPY_HW_I2C4_SDA; __HAL_RCC_I2C4_CLK_ENABLE(); #endif } else { // I2C does not exist for this board (shouldn't get here, should be checked by caller) return; } // init the GPIO lines uint32_t mode = MP_HAL_PIN_MODE_ALT_OPEN_DRAIN; uint32_t pull = MP_HAL_PIN_PULL_NONE; // have external pull-up resistors on both lines mp_hal_pin_config_alt(scl_pin, mode, pull, AF_FN_I2C, i2c_unit); mp_hal_pin_config_alt(sda_pin, mode, pull, AF_FN_I2C, i2c_unit); // init the I2C device if (HAL_I2C_Init(i2c) != HAL_OK) { // init error // TODO should raise an exception, but this function is not necessarily going to be // called via Python, so may not be properly wrapped in an NLR handler printf("OSError: HAL_I2C_Init failed\n"); return; } // invalidate the DMA channels so they are initialised on first use const pyb_i2c_obj_t *self = &pyb_i2c_obj[i2c_unit - 1]; dma_invalidate_channel(self->tx_dma_descr); dma_invalidate_channel(self->rx_dma_descr); if (0) { #if defined(MICROPY_HW_I2C1_SCL) } else if (i2c->Instance == I2C1) { HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); #endif #if defined(MICROPY_HW_I2C2_SCL) } else if (i2c->Instance == I2C2) { HAL_NVIC_EnableIRQ(I2C2_EV_IRQn); HAL_NVIC_EnableIRQ(I2C2_ER_IRQn); #endif #if defined(MICROPY_HW_I2C3_SCL) } else if (i2c->Instance == I2C3) { HAL_NVIC_EnableIRQ(I2C3_EV_IRQn); HAL_NVIC_EnableIRQ(I2C3_ER_IRQn); #endif #if defined(MICROPY_HW_I2C4_SCL) } else if (i2c->Instance == I2C4) { HAL_NVIC_EnableIRQ(I2C4_EV_IRQn); HAL_NVIC_EnableIRQ(I2C4_ER_IRQn); #endif } }
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); /* Peripheral DMA init*/ hdma_i2c1_tx.Instance = DMA1_Channel6; hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_i2c1_tx.Init.Mode = DMA_NORMAL; hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH; HAL_DMA_Init(&hdma_i2c1_tx); __HAL_LINKDMA(hi2c,hdmatx,hdma_i2c1_tx); /* USER CODE BEGIN I2C1_MspInit 1 */ /* USER CODE END I2C1_MspInit 1 */ } else if(hi2c->Instance==I2C2) { /* USER CODE BEGIN I2C2_MspInit 0 */ /* USER CODE END I2C2_MspInit 0 */ /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C2_CLK_ENABLE(); /* USER CODE BEGIN I2C2_MspInit 1 */ /* USER CODE END I2C2_MspInit 1 */ } }