完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
采用STM8S003F硬件I2C进行双机通讯,两个片子都使用内部16M,从机采用中断方式进行接收和发送数据(官方DEMO),主机是调用库函数向从机传数据。在主机里第一步就是检测总线是否忙,结果一直处于总线忙状态,从机也没有进入中断,硬件检查没接错线,是什么原因呢?
while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)) ; // 等待总线释放 主机卡在这一直总线忙,从机进不了中断 从机初始化: void main(void) { Init_Clk(); Init_IO(); Init_timer(); Init_I2C(); enableInterrupts(); while(1) {; } } void Init_Clk(void) { // CLK_DeInit(); CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); CLK_HSICmd(ENABLE); // 内部时钟默认8分频 // CLK_HSECmd(ENABLE); } void Init_I2C(void) { I2C_DeInit(); I2C_Init(I2C_FREQUENCY, SLAVE_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16); I2C_ITConfig( (I2C_IT_TypeDef)(I2C_IT_ERR | I2C_IT_EVT | I2C_IT_BUF), ENABLE); I2C_Cmd(ENABLE); } 中断: INTERRUPT_HANDLER(I2C_IRQHandler, 19) { if ((I2C->SR2) != 0) // 读I2C错误,清状态位。 { I2C->SR2 = 0; state1 = I2C_SR1; state2 = I2C_SR3; I2C_CR2 |= 0x04; LedStatus(1); // Test } WORD Event = I2C_GetLastEvent(); switch (Event) { /******* Slave transmitter ******/ /* check on EV1 */ case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: Tx_Idx = 0; break; /* check on EV3 */ case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: /* Transmit data */ I2C_SendData(Slave_Buffer_Rx[Tx_Idx++]); break; /******* Slave receiver **********/ /* check on EV1*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: // 清接受地址 // Rx_Idx = 0; I2C->SR1; I2C->SR3; break; /* Check on EV2*/ case I2C_EVENT_SLAVE_BYTE_RECEIVED: Slave_Buffer_Rx[Rx_Idx] = I2C_ReceiveData(); break; /* Check on EV4 */ case (I2C_EVENT_SLAVE_STOP_DETECTED): /* write to CR2 to clear STOPF flag */ I2C->SR1; I2C->CR2 |= I2C_CR2_ACK; break; default: break; } } 主机: void main(void) { Init_Clk(); Init_IO(); Init_Timer(); Init_I2C(); enableInterrupts(); IIC_WriteByte(SLAVE_ADDRESS, DATA_ADDRESS,TestDataIIC); while (1) { Test(); } } void Init_Clk(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); CLK_HSICmd(ENABLE); } void Init_I2C(void) { I2C_DeInit(); I2C_Init(I2C_FREQUENCY, SLAVE_ADDRESS, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16); I2C_ITConfig( (I2C_IT_TypeDef)(I2C_IT_EVT | I2C_IT_BUF), DISABLE); //禁用中断 I2C_Cmd(ENABLE); } void IIC_WriteByte(BYTE bDevice_ID, BYTE bwrite_Data_address, BYTE bData) { while(I2C_GetFlagStatus(I2C_FLAG_BUSBUSY)) ; // 等待总线释放 主机卡在这一直总线忙,从机进不了中断 I2C_GenerateSTART(ENABLE); // 开始信号 while( !I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT)) ; // 等待应答 EV5 I2C_Send7bitAddress(bDevice_ID, I2C_DIRECTION_TX); // 写选择芯片地址 while( !I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) ; // 等待应答 EV6 I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED); I2C_SendData(bwrite_Data_address); // 写芯片起始地址 while( !I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING) ) ;// 等待应答 EV8 I2C_SendData(bData); // 写数据 while( !I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED) ) ; // 等待应答 EV8_2 I2C_GenerateSTOP(ENABLE); // 停止信号 } |
|
相关推荐
1个回答
|
|
初始问题。
GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_SLOW ); // 定义B口推挽低速输出 GPIO_Init(GPIOB, ( (GPIO_Pin_TypeDef)(SCL | SDA) ), GPIO_MODE_OUT_OD_HIZ_FAST ); 第一个初始导致了第二个初始不成功 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1804 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1097 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
736 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1686 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
747浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
580浏览 3评论
602浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 09:06 , Processed in 0.872506 second(s), Total 43, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号