原子哥,现象:我在eeprom某个地址写个数,然后在读出来显示,但是返回的数据老是不对 。帮忙看一下到底是除了什么问题。谢谢!!
#include "iic.h"
#include "delay.h"
//iic初始化
void iicinit(void)
{
RCC->APB2ENR|=1<<4;//开启portc的时钟
GPIOC->CRH&=0XFFF00FFF;
GPIOC->CRH|=0X00033000; //设置c 11 12为推挽输出
GPIOC->ODR|=3<<11; //PC11,12 输出高
}
//iic起始信号
void iicstart(void)
{
//sda线输出
sda_out();
iic_sda=1;
delay_us(7);
iic_scl=1;
delay_us(7);
iic_sda=0;//START:when CLK is high,DATA change form high to low
delay_us(7);
iic_scl=0;//钳住I2C总线,准备发送或接收数据
}
//iic终止信号
void iicstop(void)
{
//sda线输出
sda_out();
iic_sda=0;
delay_us(7);
iic_scl=1; //STOP:when CLK is high DATA change form low to high
delay_us(7);
iic_sda=1;//发送I2C总线结束信号
delay_us(4);
// iic_scl=0 ;
}
//应答信号ack=1,应答,ack=1,不应答
u8 iic_ack(void)
{
u8 ack ;
sda_in();
//read_sda=1;
//delay_us(5);
iic_scl=1;
delay_us(7);
ack =read_sda;
delay_us(5);
iic_scl=0;
delay_us(5);
return (ack);
}
//通过icc总线写1位数据
void iic_write_onebit(u8 data)
{
sda_out();
iic_sda=data;
delay_us(10);
iic_scl=1;
delay_us(10);
iic_scl=0;
delay_us(10);
}
//写一个字节
void iic_write_onebyte(u8 data) //写数据时,从高位往低位写,先写第8位
{
u8 t;
u8 temp;
sda_out();
temp=data;
for(t=8;t>0;t--)
{
if(temp&0x80)
iic_write_onebit(1);
else
iic_write_onebit(0);
temp<<=1;
}
}
//读一个字节
u8 iic_read_onebyte(void)
{
u8 t,flag=0;
u8 data=0;
sda_in();
iic_scl=0;
delay_us(10);
iic_scl=1;
delay_us(5);
for(t=0;t<8;t++)
{
flag=read_sda;
data<<=1; //8位数据传完后,要scl清零
if(flag)
data|= 0x01;
}
iic_scl=0;
delay_us(10);
return (data);
}
//向24c02某个地址写数据
void write_24c02_onebyte(u16 add ,u8 data)
{
iicstart();
iic_write_onebyte(0xa0);
iic_ack();
iic_write_onebyte(add);
iic_ack();
iic_write_onebyte(data);
iic_ack();
iicstop();
delay_ms(5);
}
//从24c02里读数据
u8 read_24c02_onebyte(u16 add)
{
u8 data;
iicstart();
iic_write_onebyte(0xa0); //开始写
iic_ack();
iic_write_onebyte(add);
iic_ack();
iicstart();
iic_write_onebyte(0xa1);//开始读
iic_ack();
data=iic_read_onebyte();
iic_ack();
iicstop();
return (data);
}
ALIENTEK MINISTM32 实验16 IIC实验.zip (1.77 MB )