完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32 IIC做从设备,从接收数据,回复数据。调试了好几天,试了好多种方法,终于调通了。
在网上看到其他人有调IIC的中断优先级的,有用DMA作的。 最后还是用硬件中断实现,因为作为从设备,没办法用模拟的。 下面是代码 void I2C1_Configuration(void)//初始化 { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; I2C_DeInit(I2C1) ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // I2C1 SDA and SCL configuration GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //复用开漏输出 设置成开漏,必须IO口外部上拉,内部不能设置上拉,外部上拉电阻3.3V,10K GPIO_Init(GPIOB, &GPIO_InitStructure); /* GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOB, &GPIO_InitStructure); */ /* I2C1 configuration */ I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //选择为I2C模式 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //该参数只有在I2C 工作在快速模式(时钟工作频率高于 100KHz)下才有意义。 I2C_InitStructure.I2C_OwnAddress1 = 0x68; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //收到数据后通过硬件自动发出应答信号 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; //该参数用来设置时钟频率,这个值不能高于400KHz。频率为100KHZ I2C_Init(I2C1, &I2C_InitStructure); I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_ERR| I2C_IT_BUF , ENABLE);//OpenInit //开启缓存器中断和事件中断, I2C_Cmd(I2C1, ENABLE); } void I2C1_EV_IRQHandler(void)//中断处理 { uint32_t tmp; uint8_t i; tmp = I2C_GetLastEvent(I2C1); switch(tmp) //I2C_GetLastEvent(I2C_TypeDef* I2Cx):返回最近一次I2C 事件 { /* Slave Transmitter ---------------------------------------------------*/ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: /* EV1 */ break; case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: /* EV3 */ /* Transmit I2C2 data */ ///////////////////////////////////////////// if ( I2C1_Buffer_Rx[0] == 0x01 ) { I2C_SendData(I2C1, b); } if ( I2C1_Buffer_Rx[0] == 0x02 ) { I2C_SendData(I2C1, duibidu); } ///////////////////////////////////////////// break; /* Slave Receiver ------------------------------------------------------*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: break; case I2C_EVENT_SLAVE_BYTE_RECEIVED: I2C1_Buffer_Rx[Rx_Counter++] = I2C_ReceiveData(I2C1); if (I2C1_Buffer_Rx[0]==0xbb) { BackLight_Percent = I2C1_Buffer_Rx[1]; } else if (I2C1_Buffer_Rx[0]==0xbc) { duibidu = I2C1_Buffer_Rx[1]; } else if (I2C1_Buffer_Rx[0]==0x01) { Rx_Counter = 0; } else if (I2C1_Buffer_Rx[0]==0x02) { Rx_Counter = 0; } else if (I2C1_Buffer_Rx[0]==0x03) { Rx_Counter = 0; } break; /* Case of data not yet read and STOP is generated on the bus */ /* case I2C_EVENT_SLAVE_BYTE_RECEIVED_NO_BUSY: I2C1_Buffer_Rx[Rx_Counter++] = I2C_ReceiveData(I2C1); break; */ /* Case of data not yet read and STOPF flag is set */ /*case I2C_EVENT_SLAVE_BYTE_RECEIVED_STOPF: I2C1_Buffer_Rx[Rx_Counter++] = I2C_ReceiveData(I2C1); I2C_Cmd(I2C1, ENABLE); break; */ case I2C_EVENT_SLAVE_STOP_DETECTED: /* Clear I2C1 STOPF flag: read of I2C_SR1 followed by a write on I2C_CR1 */ I2C_Cmd(I2C1, ENABLE); Rx_Counter = 0 ; break; default: // I2C1_Configuration(); break; } } |
|
相关推荐
|
|
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 06:08 , Processed in 0.530074 second(s), Total 68, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号