STM32H7 I2C主机读数据【寄存器操作】
I2C初始化
/* I2C2 init function */ void MX_I2C2_Init(void) { /* USER CODE BEGIN I2C2_Init 0 */ /* USER CODE END I2C2_Init 0 */ LL_I2C_InitTypeDef I2C_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; LL_RCC_SetI2CClockSource(LL_RCC_I2C123_CLKSOURCE_PCLK1); LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB); /**I2C2 GPIO Configuration PB10 ------> I2C2_SCL PB11 ------> I2C2_SDA */ GPIO_InitStruct.Pin = LL_GPIO_PIN_10|LL_GPIO_PIN_11; GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; GPIO_InitStruct.Pull = LL_GPIO_PULL_UP; GPIO_InitStruct.Alternate = LL_GPIO_AF_4; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral clock enable */ LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C2); /* I2C2 interrupt Init */ NVIC_SetPriority(I2C2_EV_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0)); NVIC_EnableIRQ(I2C2_EV_IRQn); NVIC_SetPriority(I2C2_ER_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0)); NVIC_EnableIRQ(I2C2_ER_IRQn); /* USER CODE BEGIN I2C2_Init 1 */ /* USER CODE END I2C2_Init 1 */ /** I2C Initialization */ LL_I2C_EnableAutoEndMode(I2C2); LL_I2C_SetOwnAddress2(I2C2, 0, LL_I2C_OWNADDRESS2_NOMASK); LL_I2C_DisableOwnAddress2(I2C2); LL_I2C_DisableGeneralCall(I2C2); LL_I2C_EnableClockStretching(I2C2); I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; I2C_InitStruct.Timing = 0x20B0CCFF; I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; I2C_InitStruct.DigitalFilter = 0; I2C_InitStruct.OwnAddress1 = 0; I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; LL_I2C_Init(I2C2, &I2C_InitStruct); /* USER CODE BEGIN I2C2_Init 2 */ /* USER CODE END I2C2_Init 2 */ }
uint8_t I2C_RegRead(I2C_TypeDef *I2CX, uint8_t DevAddr, uint8_t DataAddr, uint8_t *data, uint32_t len) { uint32_t _Len = 0; I2CX->CR2 |= ((DevAddr<<1)); //设置设备地址 I2CX->CR2 |= (1<<16); //设置长度,最大256Bytes I2CX->CR1 |= (1UL<<0); //使能I2C外设 I2CX->CR2 &= ~(1UL<<10); //set 0; requests a write transfer I2CX->CR2 |= (1UL<<13); //START while(1 == (I2CX->CR2&(1UL<<13))); I2CX->TXDR = (DataAddr); while(0 == (I2CX->ISR&(1UL<<0))){}; I2CX->CR2 |= (1UL<<14); //STOP I2CX->ISR |= (1UL<<5); //clear STOPF if(len>255) {_Len = 255; len = len - 255;} else {_Len = len; len = 0;} I2CX->CR2 |= (_Len<<16); //设置长度,最大256Bytes I2CX->CR2 |= (1UL<<10); //set 1; requests a read transfer I2CX->CR1 |= (1UL<<0); //使能I2C外设 I2CX->CR2 |= (1UL<<13); //START while(1 == (I2CX->CR2&(1UL<<13))); while(_Len) { for(int i = 0; i<_Len; i++) { while(0 == (I2CX->ISR&(1UL<<2))){}; *data++ = I2CX->RXDR; } if(len>255) { _Len = 255; len = len - 255; } else { _Len = len; len = 0; } if(_Len) { I2CX->CR2 &= ~(1UL<<13); //START I2CX->CR2 |= (_Len<<16); //设置长度,最大256Bytes I2CX->CR2 |= (1UL<<13); //START } } I2CX->CR2 |= (1UL<<14); //STOP I2CX->ISR |= (1UL<<5); //clear STOPF } uint8_t I2C_Read(I2C_TypeDef *I2CX, uint8_t DevAddr, uint8_t *data, uint32_t len) { uint32_t _Len = 0; I2CX->CR2 |= ((DevAddr<<1)); //设置设备地址 // I2CX->CR2 |= ((1UL<<24)); // I2CX->CR2 |= ((1UL<<25)); if(len>255) {_Len = 255; len = len - 255;} else {_Len = len; len = 0;} I2CX->CR2 |= (_Len<<16); //设置长度,最大256Bytes I2CX->CR2 |= (1UL<<10); //set 1; requests a read transfer I2CX->CR1 |= (1UL<<0); //使能I2C外设 I2CX->CR2 |= (1UL<<13); //START while(1 == (I2CX->CR2&(1UL<<13))); while(_Len) { for(int i = 0; i<_Len; i++) { while(0 == (I2CX->ISR&(1UL<<2))){}; *data++ = I2CX->RXDR; } if(len>255) { _Len = 255; len = len - 255; } else { _Len = len; len = 0; } if(_Len) { I2CX->CR2 &= ~(1UL<<13); //START I2CX->CR2 |= (_Len<<16); //设置长度,最大256Bytes I2CX->CR2 |= (1UL<<13); //START } } I2CX->CR2 |= (1UL<<14); //STOP I2CX->ISR |= (1UL<<5); //clear STOPF }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~