完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32 i2c中断接收,一直不能收到,配置如下,ST的FAE请帮助解答,谢谢!
各位大神,如有遇到类似问题,请提供解决方案, 我的配置如下: void I2C_Master_Receive_Config(I2C_DataStruct *st_RxData, uint8_t u8_MemAddr, uint8_t *pu8_Data, uint16_t u16_Size ) { uint32_t u32_timeOut; if (((uint8_t *)NULL == pu8_Data) || (0 == u16_Size)) { return; } st_RxData->pu8_BuffPtr = pu8_Data; st_RxData->u16_Size = u16_Size; //I2C_Master_Config( gst_RxData,u8_MemAddr,st_RxData->u16_Size, I2C_GENERATE_START_READ,I2C_ISR_TC); u32_TimeOut = GET_SYSTEM_TICK_VALUE(); while (__HAL_I2C_GET_FLAG(I2C_ISR_BUSY)) { if (GET_SYSTEM_TICK_ECLIPSE(u32_TimeOut) > CHECK_STATUS_TIMEROUT_TICK) { break; } } /* 1: send 1 byte EEPROM start address */ I2C_TransferConfig(I2C1_SLAVE_ADDR, 1, I2C_CR2_AUTOEND, I2C_GENERATE_START_WRITE); u32_TimeOut = GET_SYSTEM_TICK_VALUE(); while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS)) { if (GET_SYSTEM_TICK_ECLIPSE(u32_TimeOut) > CHECK_STATUS_TIMEROUT_TICK) { break; } } I2C_CHANNEL->TXDR = u8_MemAddr; u32_TimeOut = GET_SYSTEM_TICK_VALUE(); /* Wait until TXE flag is set */ while (!__HAL_I2C_GET_FLAG(I2C_ISR_TC)) { if (GET_SYSTEM_TICK_ECLIPSE(u32_TimeOut) > CHECK_STATUS_TIMEROUT_TICK) { break; } } if (u16_Size > TXRX_DATA_MAX) { st_RxData->u16_Count = TXRX_DATA_MAX; } else { st_RxData->u16_Count = u16_Size; } if ((st_RxData->u16_Count == TXRX_DATA_MAX) (st_RxData->u16_Count < u16_Size)) { I2C_TransferConfig(I2C1_SLAVE_ADDR, st_RxData->u16_Count, I2C_CR2_RELOAD, I2C_GENERATE_START_READ); } else { I2C_TransferConfig(I2C1_SLAVE_ADDR, st_RxData->u16_Count, I2C_CR2_AUTOEND, I2C_GENERATE_START_READ); } I2C_CHANNEL->CR1 |= I2C_CR1_NACKIE | I2C_CR1_RXIE | I2C_CR1_TCIE;// | I2C_CR1_STOPIE;[/td] |
|
相关推荐
1个回答
|
|
1. 确保I2C外设时钟已启用:在初始化I2C之前,确保已经启用了I2C外设的时钟。 2. 配置I2C时钟:根据您的STM32型号,配置I2C的时钟频率。例如,使用RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); 来启用I2C1的时钟。 3. 初始化I2C:使用I2C_Init()函数初始化I2C外设,设置I2C模式、通信速率等参数。 4. 配置I2C中断:使用I2C_ITConfig()函数启用I2C中断,并配置中断优先级。 5. 配置NVIC:启用I2C中断,使用NVIC_Init()函数设置NVIC中断优先级。 6. 启动I2C:使用I2C_Cmd(ENABLE)函数启动I2C。 7. 发送I2C地址和读取数据:使用I2C_AcknowledgeConfig(ENABLE)函数启用应答,然后使用I2C_Send7bitAddress()函数发送目标设备的7位地址。接下来,使用I2C_ReceiveData()函数读取数据。 8. 检查I2C中断状态:在中断服务例程中,检查I2C中断状态,如I2C_GetITStatus()函数。 9. 清除I2C中断标志:在中断服务例程中,使用I2C_ClearITPendingBit()函数清除I2C中断标志。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1678 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1580 浏览 1 评论
1012 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1626 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
673浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
537浏览 3评论
556浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
524浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 00:00 , Processed in 1.055874 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号