程序如下:
void IIC_Start(uchar a)
{
{ IIC_SDA=1;
IIC_SCL=1;
SDA_OUT();
delay_us(400);
IIC_SDA=0;
delay_us(300);
IIC_SCL=0;
delay_us(300);}
}
void IIC_Ack(uchar a)
{ IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(200);
IIC_SCL=1;
delay_us(200);
IIC_SCL=0;}
}
void IIC_Stop(uchar a)
{
{
{IIC_SCL=0;
IIC_SDA=0;
SDA_OUT();
delay_us(200);
IIC_SCL=1;
delay_us(200);
IIC_SDA=1;
delay_us(200);
}
}
}
u8 I2C_WaitToAck(uchar a)
{
{
SDA_IN();
delay_us(300);
IIC_SCL=1;
delay_us(200);
if(READ_SDA)
{
return 1;
}
else
{IIC_SCL=0;
delay_us(200);
return 0;
} }
}
void IIC_NAck(uchar a)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(200);
IIC_SCL=0;
delay_us(200);
IIC_SCL=1;
}
void I2C_SendByte(uchar txd,uchar a)
{
{IIC_SCL=0;
SDA_OUT();
for(t=0;t<8;t++)
{
if((txd&0x80)>0)
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(200);
IIC_SCL=1;
delay_us(200);
IIC_SCL=0;
}}
}
u8 IIC_Read_Byte(unsigned char ack,uchar a)
{
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(200);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(200);
}
if (!ack)
IIC_NAck();
else
IIC_Ack();
return receive;
}
void delay_us(u32 i)
{u32 temp;
SysTick->LOAD=9*i;
SysTick->CTRL=0x01;
SysTick->VAL=0;
do
{
temp=SysTick->CTRL;
}
while((temp&0x01)&&(!(temp&(1<<16))));
SysTick->CTRL=0;
SysTick->VAL=0;
}
u8 ReadByte(uchar Reg_Addr )
{
u32 data;
IIC_Start();
I2C_SendByte(0x54|0);
I2C_WaitToAck();
I2C_SendByte(Reg_Addr);
I2C_WaitToAck();
// IIC_Start();
I2C_SendByte(0x54|1);
I2C_WaitToAck(0);
data=IIC_Read_Byte(0);
// IIC_NAck();
IIC_Stop();
return data;
}
时序图是这样子的
求大神赐教,我是菜鸟。
不是的,0x23就是寄存器地址
一周热门 更多>