新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2014-3-5
- 在线时间
- 0 小时
|

楼主 |
发表于 2014-3-5 12:11:36
|
显示全部楼层
贴程序:
//产生IIC起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
SDA_H;
SCL_H;
delay_nnus(4);
SDA_L;//START:when CLK is high,DATA change form high to low
delay_nnus(4);
SCL_L;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{
SDA_OUT();//sda线输出
SCL_L;
SDA_L;//STOP:when CLK is high DATA change form low to high
delay_nnus(4);
SCL_H;
SDA_H;//发送I2C总线结束信号
delay_nnus(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
SDA_H;delay_nnus(1);
SCL_H;delay_nnus(1);
while(SDA_read)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
SCL_L;//时钟输出0
return 0;
}
//产生ACK应答
void IIC_Ack(void)
{
SCL_L;
SDA_OUT();
SDA_L;
delay_nnus(2);
SCL_H;
delay_nnus(2);
SCL_L;
}
//不产生ACK应答
void IIC_NAck(void)
{
SCL_L;
SDA_OUT();
SDA_H;
delay_nnus(2);
SCL_H;
delay_nnus(2);
SCL_L;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
SCL_L;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if(txd&0x80)
SDA_H;
else
SDA_L;
txd<<=1;
delay_nnus(2); //对TEA5767这三个延时都是必须的
SCL_H;
delay_nnus(2);
SCL_L;
delay_nnus(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(u8 ack)
{
u8 i,receive=0;
SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
SCL_L;
delay_nnus(2);
SCL_H;
receive<<=1;
if(SDA_read)receive++;
delay_nnus(1);
}
if (!ack)
IIC_NAck();//发送nACK
else
IIC_Ack(); //发送ACK
return receive;
}
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值:读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(e2prom>16) //AT24C16
{
IIC_Send_Byte(0xA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
}else IIC_Send_Byte(0xA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0xA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop(); //产生一个停止条件
return temp;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr:写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
if(e2prom>16) //AT24C16
{
IIC_Send_Byte(0xA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址
}else IIC_Send_Byte(0xA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //发送字节
IIC_Wait_Ack();
IIC_Stop(); //产生一个停止条件
delay_nnms(50);
} |
|