完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位好,我这段时间弄STM8L151的I2C与MTK处理器的手机的I2C通信(手机I2C的程序是另一个人写的),弄了一个多星期没搞定。不知道是哪里的原因,我用俩个单片机通信,一个作主机,另一个作从
机(从机接收用中断方式),主机可以正常向从机收发数据,当手机作主机时,一个单片机作从机就出问题了,从机地址匹配正确后不断地进入中断。强制在中断中打印中断事件值为0x6D0。手机电平( 1.8V)已经过电平芯片转换成3.3V电平。用示波器量手机I2C时SCL有一个正脉冲,SDA没响应。希望高手可以给我指出问题。我的代码如下: 主机代码(Master) INTERRUPT_HANDLER(I2C1_SPI2_IRQHandler, 29) { switch (I2C_GetLastEvent(I2C1)) { /* EV5 */ case I2C_EVENT_MASTER_MODE_SELECT : /* Send slave Address for write */ //I2C_Direction_Receiver I2C_Direction_Transmitter I2C_Send7bitAddress(I2C1, SLAVE_ADDRESS, I2C_Direction_Transmitter); break; /* EV6 */ case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: break; /* EV8 */ case I2C_EVENT_MASTER_BYTE_TRANSMITTING: /* Transmit Data */ I2C_SendData(I2C1,5); break; /* EV8_2 */ case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* Send STOP condition */ I2C_GenerateSTOP(I2C1, ENABLE); I2C_ITConfig(I2C1, I2C_IT_EVT, DISABLE); break; default: break; } } void main() { /* I2C clock Enable*/ CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE); /* system_clock / 1 */ CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); /* Initialize I2C peripheral */ I2C_Init(I2C1, I2C_SPEED, 0xA0, I2C_Mode_I2C, I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit); /* Enable Buffer and Event Interrupt*/ I2C_ITConfig(I2C1, (I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF) , ENABLE); enableInterrupts(); /* TXBuffer initialization */ for (i = 0; i < BUFFERSIZE; i++) TxBuffer[i] = i; USART1_INIT(); printf("I2C test!rn"); I2C_GenerateSTART(I2C1, ENABLE); printf("2C_IT = 1;rn"); while (1) { /***** reception phase ***/ /* Wait while the bus is busy */ while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); /* Test on EV5 and clear it */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /* Send slave Address for write */ I2C_Send7bitAddress(I2C1, SLAVE_ADDRESS, I2C_Direction_Receiver); /* Test on EV6 and clear it */ while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); /* Disable Acknowledgement */ I2C_AcknowledgeConfig(I2C1, DISABLE); /* Send STOP Condition */ I2C_GenerateSTOP(I2C1, ENABLE); /* Poll on RxNE Flag */ while ((I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET)); /* Read a byte from the Slave */ RxBuffer[0] = I2C_ReceiveData(I2C1); printf("RxBuffer[0] = 0x%xrn",RxBuffer[0]); } } 从机代码(Slave): INTERRUPT_HANDLER(I2C1_SPI2_IRQHandler, 29) { /* Read SR2 register to get I2C error */ if(I2C_ReadRegister(I2C1, I2C_Register_SR2)) { /* Clears SR2 register */ I2C1->SR2 = 0; /* Set LED2 */ } switch (I2C_GetLastEvent(I2C1)) { /******* Slave transmitter ******/ /* check on EV1*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: Rx_Idx = 0; I2C_state[0] = 1; break; /* Check on EV2*/ case I2C_EVENT_SLAVE_BYTE_RECEIVED: Slave_Buffer_Rx[0] = I2C_ReceiveData(I2C1); I2C_state[1] = 1; break; /******* Slave transmitter ******/ /* check on EV1 */ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: I2C_state[2] = 1; break; /* check on EV3 */ case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: GPIO_ResetBits(GPIOA,GPIO_Pin_6); /* Transmit data */ I2C_SendData(I2C1, 0x48); I2C_state[3] = 1; break; /* Check on EV4 */ case (I2C_EVENT_SLAVE_STOP_DETECTED): //GPIO_ResetBits(GPIOA,GPIO_Pin_6); /* write to CR2 to clear STOPF flag */ Rx_Idx = 0; I2C_state[4] = 1; I2C_state[5] = 1; I2C1->CR2 |= I2C_CR2_ACK; break; default: break; } } void main(void) { int i=0; //initialize I2C GPIO PC0-->I2C_SDA PC1-->I2C_SCL //GPIO_Init(GPIOC, GPIO_Pin_0 | GPIO_Pin_1, GPIO_Mode_Out_OD_HiZ_Fast); /* system_clock / 1 */ CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); /* I2C clock Enable*/ CLK_PeripheralClockConfig(CLK_Peripheral_I2C1, ENABLE); USART1_INIT(); LED_INIT(); I2C_DeInit(I2C1); I2C_Cmd(I2C1, ENABLE); I2C_AcknowledgeConfig(I2C1, ENABLE); /* Initialize I2C peripheral */ I2C_Init(I2C1, 100000, SLAVE_ADDRESS, I2C_Mode_I2C, I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit); /* Enable Error Interrupt*/// I2C_ITConfig(I2C1, (I2C_IT_TypeDef)(I2C_IT_ERR |I2C_IT_EVT |I2C_IT_BUF), ENABLE); /* Enable general interrupts */ enableInterrupts(); GPIO_SetBits(GPIOA,GPIO_Pin_6); printf("I2C test!rn"); /*Main Loop */ while (1) { Delay(0x5000); GPIO_SetBits(GPIOA,GPIO_Pin_6); GPIO_SetBits(GPIOA,GPIO_Pin_5); Delay(0x5000); GPIO_ResetBits(GPIOA,GPIO_Pin_5); if(I2C_state[5] == 1) { if(I2C_state[0] == 1) { DEBUG("从机地址匹配正确"); //GPIO_ResetBits(GPIOA,GPIO_Pin_6); } if(I2C_state[1] == 1) { DEBUG("从机接收到数据"); printf("Slave_Buffer_Rx[0] = %drn",Slave_Buffer_Rx[0]); i++; //GPIO_ResetBits(GPIOA,GPIO_Pin_6); } if(I2C_state[2] == 1) { DEBUG("发送地址匹配"); } if(I2C_state[3] == 1) { DEBUG("从机发送数据"); } if(I2C_state[4] == 1) { DEBUG("通信结束"); } if(aaa == 100) { aaa=0; DEBUG(" 56415312"); } for(i=0;i<6;i++) { I2C_state[i] = 0; } } } } |
|
相关推荐
1个回答
|
|
首先,了解您在使用STM8L151与MTK手机进行I2C通信时遇到的问题。从您的描述中,我了解到您已经成功地在两个单片机之间进行了I2C通信,但当手机作为主机时,从机(STM8L151)出现问题。以下是一些建议和可能的解决方案:
1. 检查I2C时钟速率:确保STM8L151和MTK手机之间的I2C通信时钟速率兼容。过高的时钟速率可能导致通信失败。您可以尝试降低STM8L151的I2C时钟速率,以匹配手机的I2C速率。 2. 检查I2C通信协议:确保STM8L151和MTK手机遵循相同的I2C通信协议。这包括起始条件、应答位、停止条件等。如果协议不匹配,可能导致通信失败。 3. 检查电平转换:您提到已经使用电平转换芯片将手机的1.8V电平转换为3.3V。请确保电平转换是正确的,并且没有引入任何噪声或干扰。 4. 检查STM8L151的I2C配置:确保STM8L151的I2C配置正确,包括地址、时钟速率、通信模式等。错误的配置可能导致通信失败。 5. 检查STM8L151的中断设置:您提到从机地址匹配正确后,不断地进入中断。请检查STM8L151的中断设置,确保中断触发条件正确。此外,检查中断服务程序(ISR)以确保正确处理中断事件。 6. 使用逻辑分析仪:如果可能的话,使用逻辑分析仪来监视I2C通信。这可以帮助您更详细地了解通信过程中的问题。 7. 与手机开发者合作:由于手机的I2C程序是另一个人写的,与手机开发者合作以确保双方的I2C实现兼容是很重要的。他们可能能提供关于手机I2C实现的更多信息,以及如何解决您遇到的问题。 8. 检查STM8L151的固件:确保STM8L151的固件是最新的,并且没有已知的与I2C通信相关的问题。 9. 检查硬件连接:确保STM8L151和MTK手机之间的硬件连接正确,包括I2C数据线、电源线和地线。任何不良的连接都可能导致通信问题。 10. 调试和测试:使用调试器逐步执行STM8L151的代码,以查找可能导致问题的代码段。此外,尝试使用不同的STM8L151单片机和MTK手机,以排除硬件故障的可能性。 希望这些建议能帮助您解决STM8L151与MTK手机之间的I2C通信问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析和解决问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1142 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1167 浏览 1 评论
596 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
445 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1072 浏览 2 评论
1638浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
305浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
308浏览 3评论
299浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
274浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-25 11:07 , Processed in 0.767853 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191