完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用STM32F103ZE I2C2读取AT24C02一直没有调通,有谁用寄存器写的发一个程序出来看看,或帮忙分析分析程序,
/************************************************** I2C2初始化函数 PB10---SCL PB11---SDA ***************************************************/ void iic2_init(void) { RCC->APB1RSTR|=(1<<22);//I2C2复位 RCC->APB1RSTR&=~(1<<22); RCC->APB1ENR|=(1<<22);//I2C2时钟开启 RCC->APB2ENR|=(1<<3);//IO端口B时钟开启 GPIOB->CRH&=0XFFFF00FF; GPIOB->CRH|=0X0000DD00;//复用开漏输出 I2C2->CR1&=~(1<<0);//关闭I2C模块 I2C2->CR1&=~(1<<1);//0-->I2C模式 1-->SMBus模式 I2C2->CR2|=(2<<0);//I2C模块时钟频率100k FREQ[5:0]=2为2M I2C2->CCR&=~(1<<15);//标准模式的I2C I2C2->CCR|=(10<<0); //分频系数CCR Thigh= CCR ×TPCLK1 Tlow= CCR ×TPCLK1 //1/100K=Thigh+Tlow=2 X CCR ×TPCLK1 //CCR=10 I2C2->TRISE=0X03;//标准100K TPCLK1=1000ns/FREQ[5:0]=1000/2=500ns //I2C2->TRISE=(1000ns/TPCLK1)+1=3 I2C2->OAR1=0;//自身地址寄存器 I2C2->OAR2=0; I2C2->CR1|=(1<<10);//应答使能ACK I2C2->CR1|=(1<<0);//启用I2C模块 } /************************************************** 功能:24C02读一个数据 入口:无 出口:无 ***************************************************/ u8 at24c02_read_data(u8 Reg_addr) { u8 rdata=0; while((I2C2->SR2)&0x02);//总线忙检测 0-->空闲 1-->忙 I2C2->CR1|=1<<8;//起始条件产生 while(((I2C2->SR1)&0x01)!=0x01);//起始条件已发送 0-->未发送 1-->已发送 I2C2->DR=I2C_addr;//24C02地址 while((I2C2->SR1)&0X82);//TxE 0-->数据寄存器非空 1-->数据寄存器空 ADDR 0-->地址发送没有结束 1-->地址发送结束 I2C2->SR1; I2C2->SR2;//读SR1然后读SR2将清除ADDR=1事件 I2C2->DR=Reg_addr;//24C02地址 while((I2C2->SR1)&0X80); I2C2->CR1|=1<<8;//起始条件产生 while(((I2C2->SR1)&0x01)!=0x01);//起始条件已发送 0-->未发送 1-->已发送 I2C2->DR=I2C_addr|0x01;//24C02地址 while((I2C2->SR1)&0X82); I2C2->SR1; I2C2->SR2;//读SR1然后读SR2将清除ADDR=1事件 while(((I2C2->SR1)&0X40)!=0X40);//数据寄存器非空(接收时) rdata=I2C2->DR; I2C2->CR1&=~(1<<10);//不应答ACK I2C2->CR1|=1<<9;//停止条件产生 return rdata; } |
|
相关推荐
9个回答
|
|
没有用过寄存器方式,Cube MX还是方便的;
|
|
|
|
周末花了一个多小时,终于把I2C2调通了,
|
|
|
|
|
|
|
|
我用I2c2也出问题了,发送STAR后就死在读事件上,最后发现是PB10,PB11置为上拉后,就变成低电平了,不知是什么原因,现在还没解决
|
|
|
|
楼主能说下问题原因与解决方法吗?
|
|
|
|
先确认一下你的IIC地址,其次是IIC初始化是否正确,下面是我写的初始化和启动函数 /************************************************** 功能:iic初始化函数 iic2 PB10---SCL PB11---SDA 入口:无 出口:无 ***************************************************/ void iic2_init(void) { RCC->APB1RSTR|=(1<<22);//I2C2复位 RCC->APB1RSTR&=~(1<<22); RCC->APB1ENR|=(1<<22);//I2C2时钟开启 RCC->APB2ENR|=(1<<3);//IO端口B时钟开启 GPIOB->CRH&=0XFFFF00FF; GPIOB->CRH|=0X0000FF00;//复用开漏输出 I2C2->CR1&=~(1<<0);//关闭I2C模块 I2C2->CR1&=~(1<<1);//0-->I2C模式 1-->SMBus模式 I2C2->CR2|=(2<<0);//I2C模块时钟频率100k FREQ[5:0]=2为2M I2C2->CCR&=~(1<<15);//标准模式的I2C I2C2->CCR|=(10<<0); //分频系数CCR Thigh= CCR ×TPCLK1 Tlow= CCR ×TPCLK1 //1/100K=Thigh+Tlow=2 X CCR ×TPCLK1 //CCR=10 I2C2->TRISE=0X03;//标准100K TPCLK1=1000ns/FREQ[5:0]=1000/2=500ns //I2C2->TRISE=(1000ns/TPCLK1)+1=3 I2C2->OAR1=0;//从模式的自身地址寄存器 I2C2->OAR2=0; I2C2->CR1|=(1<<10);//应答使能ACK I2C2->CR1|=(1<<0);//启用I2C模块 } /************************************************** 功能:iic2启动 入口:无 出口:无 ***************************************************/ u8 iic2_Hardware_Start(void) { u16 cnt=0; I2C2->CR1|=1<<8;//起始条件产生 while(((I2C2->SR1)&0x01)!=0x01)//起始条件已发送 0-->未发送 1-->已发送 { if(++cnt>1000)return 0; } while(((I2C2->SR2)&0x03)!=0x03)//MSL+BUSY { if(++cnt>1000)return 0; } return 1; } |
|
|
|
|
|
|
|
I2C的问题比较多,还是用模拟的比较好。
|
|
|
|
寄存器配置问题
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1252 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1184 浏览 3 评论
2263 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1351 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1774 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 18:27 , Processed in 0.977573 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号