完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
现有一个项目,因为其他串口应用很多,无奈打算采取I2C与51单片机通讯,
想法是,51单片机做主,STM32做从,通过硬件接收中断获取51单片机的数据,但现在无法接收到数据,却在中断循环判断。寻求大侠们帮助,STM32代码如下: #define I2C1_OWN_ADDRESS7 0xA0 #define I2C_Speed 222222; void I2C1_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 使能与 I2C1 有关的时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); /* PB6-I2C1_SCL、PB7-I2C1_SDA*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏输出 GPIO_Init(GPIOB, &GPIO_InitStructure); /* I2C 配置 */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 =I2C1_OWN_ADDRESS7; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; I2C_ITConfig(I2C1,I2C_IT_EVT | I2C_IT_BUF, ENABLE); //开启I2C1中断的事件、缓存中断 /* 使能 I2C1 */ I2C_Cmd(I2C1, ENABLE); /* I2C1 初始化 */ I2C_Init(I2C1, &I2C_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn; //使能USART2的IRQ通道() NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /***************************************************************** 函数功能 :I2C1接收中断 ******************************************************************/ void I2C1_EV_IRQHandler(void) { switch(I2C_GetLastEvent(I2C1)) { case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED : //接收到匹配的地址数据 { break; } case I2C_EVENT_SLAVE_BYTE_RECEIVED : { if(I2C1_Rx_Idx < I2C1_BufferSize) { I2C1_Buffer_Rx[I2C1_Rx_Idx] = I2C_ReceiveData(I2C1); } break; } case I2C_EVENT_SLAVE_STOP_DETECTED : { I2C_ClearFlag(I2C1 , I2C_FLAG_STOPF); I2C1_Flag = 1; printf("i2crn"); break; } default: { break; } } } |
|
相关推荐
8个回答
|
|
|
|
|
|
没这样干过
|
|
|
|
帮顶吧,顺便学习学习
|
|
|
|
不懂帮顶
|
|
|
|
用PS2协议试试哈
|
|
|
|
看看学习一下
|
|
|
|
帮顶吧,顺便学习学习
|
|
|
|
进入了中断,楼主看一下中断寄存器的值
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 00:42 , Processed in 0.943620 second(s), Total 86, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号