用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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>