完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
采用DISCOVERYF0调试IIC接口,对应24C02芯片。
在发送地址时,加了一个超时循环判断 //第一步发送START信号和器件固定地址 I2C_TransferHandling(I2C1,AT24C02_AD,1,I2C_Reload_Mode, I2C_Generate_Start_Write); //设置24C02地址,启动start信号传输 IIC_timeout=AT24C02_DELAY_TIME; while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET) //等待TXIS标志位 { if((IIC_Timeout--) == 0) return IIC_TIMEOUT_UserCallback(); //超出时间门限,仍未发送完毕,则进入回调函数 } 在发送地址后,I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)返回值始终为RESET,进入内部看I2Cx->ISR等于0x00008001, 其中BUSY和TXE位为1,而TXIS始终为0, 求助! |
|
相关推荐
14个回答
|
|
|
基础配置检查一下,最好对着例程看看。
|
|
|
|
|
|
基础配置为:
GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /*-------------------初始化PB8和PB9--------------------------------*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); //使能I2C1时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能SDA、SCL时钟,PB8和PB9 GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1); //设定复用通道 GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; //GPB8-I2C1_SCL GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //GPIO Alternate function Mode GPIO_InitStructure.GPIO_OType=GPIO_OType_OD; //open drain mode GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //high speed模式 GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; //GPB9-I2C1_SDA GPIO_Init(GPIOB,&GPIO_InitStructure); /*--------------------IIC参数设置-----------------------------------*/ I2C_InitStructure.I2C_Timing=AT24C02_IIC_TIMING; //设置SCL和SDA时序关系 I2C_InitStructure.I2C_AnalogFilter=I2C_AnalogFilter_Enable; //使能模拟滤波 I2C_InitStructure.I2C_DigitalFilter=0; I2C_InitStructure.I2C_Mode=I2C_Mode_I2C; //配置IIC模式 I2C_InitStructure.I2C_OwnAddress1=0; I2C_InitStructure.I2C_Ack=I2C_Ack_Enable; //ack设置 I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit; I2C_Init(I2C1,&I2C_InitStructure); I2C_Cmd(I2C1,ENABLE); //使能I2C1 |
|
|
|
|
|
一直用的是模拟I2C。
|
|
|
|
|
|
我也出现跟楼主一模一样的问题I2Cx->ISR等于0x00008001,应该是等于0x00008003估计就是对的.但是一直不复位.请问现在楼主找到解决办法了么,或者其它大神能知道问题在哪? 求指导!!
|
|
|
|
|
|
楼主问题解决了吗?
|
|
|
|
|
|
不懂帮顶下!
|
|
|
|
|
|
楼主,问题解决了吗?求程序
|
|
|
|
|
|
我用硬件I2C也是遇到这样的问题,写入是正确的(我用模拟I2C读出来确认过),但是用硬件I2C读就是不行,不知道怎么回事了!
|
|
|
|
|
|
我也遇到了这个问题,请问楼主能复活下,讲下你当时的解决办法吗
|
|
|
|
|
|
楼主解决了吗?和你遇到的问题一样
|
|
|
|
|
|
现在解决了吗 |
|
|
|
|
|
|
|
|
|
|
|
关键在于这个函数的配置I2C_TransferHandling(I2C1,AT24C02_AD,1,I2C_Reload_Mode, I2C_Generate_Start_Write); 要弄清楚这个函数的配置含义,此函数是用于配置I2C发送的时候的参数,第3个参数是你接下来实际要写的数据的字节数,如果你实际只写1个字节,那么你不应该等待TXIS(这个是发送完成中断标志位,如果接下来还要数据要发送,则等待该标志位),而应该等待TC(发送完成标志)。这里要注意的是TXIS要和I2C_TransferHandling();函数的第3个参数相配合使用,如果发送的是最后一个字节了,那就不要等待TXIS而应该等待TC。
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
818 浏览 1 评论
994 浏览 0 评论
877 浏览 0 评论
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
4892 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
3696 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 09:11 , Processed in 1.030325 second(s), Total 69, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1785