📄 i2c.h
字号:
//i2c通信子程序
//初始化
void i2c_init()
{
DDRC|=(1<<6);
PORTC&=~(1<<6); //WP 使能
TWBR=0x01 ; //速率=16M/(16+2*16)=33.3k
TWSR=0x01 ; //分频因子=4
}
//开始信号
void i2c_start()
{
TWCR=0xa4 ;
while(!(TWCR&0x80));
}
//写数据
void i2c_wrdata(uchar i2c_data)
{
TWDR=(i2c_data);
TWCR=0x84 ;
while(!(TWCR&0x80));
}
//读数据noack
uchar i2c_redata()
{
uchar i2c_data ;
TWCR=0x84 ;
while(!(TWCR&0x80));
i2c_data=TWDR ;
return(i2c_data);
}
//读数据ack
uchar i2c_redataack()
{
uchar i2c_data ;
TWCR=0xc4 ;
while(!(TWCR&0x80));
i2c_data=TWDR ;
return(i2c_data);
}
//停止信号
void i2c_stop()
{
TWCR=0x94 ;
}
//i2c的写字节子程序
void i2c_wrbyte(uchar i2c_data,uchar i2c_add)
{
do
{
i2c_start();
i2c_wrdata(0xa0);
}
while((TWSR&0xf8)!=0x18); //判断总线是否可以操作
i2c_wrdata(i2c_add);
i2c_wrdata(i2c_data);
i2c_stop();
}
//i2c的页写子程序
//参数1:要写入的数组指针
//参数2:写入的首地址
//参数3:数组的单元数
void i2c_wrpage(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
{
uchar i;
do
{
i2c_start();
i2c_wrdata(0xa0);
}
while((TWSR&0xf8)!=0x18);
//判断总线是否可以操作
i2c_wrdata(i2c_add);
for(i=0;i<i2c_nub;i++)
{
i2c_wrdata(*i2c_data++);
}
i2c_stop();
}
//i2c读一个字节子程序
uchar i2c_rebyte(uchar i2c_add)
{
uchar i2c_data ;
do
{
i2c_start();
i2c_wrdata(0xa0);
}
while((TWSR&0xf8)!=0x18);
//判断总线是否可以操作
i2c_wrdata(i2c_add);
i2c_start();
i2c_wrdata(0xa1);
i2c_data=i2c_redata();
i2c_stop();
return(i2c_data);
}
//i2c连续读子程序
//参数1:16位地址
//参数2:读取字节数 注:<=64
//读出的数据只能从全局数组变量获得
void i2c_rese(uchar *i2c_data,uchar i2c_add,uchar i2c_nub)
{
uchar i;
do
{
i2c_start();
i2c_wrdata(0xa0);
}
while((TWSR&0xf8)!=0x18);
//判断总线是否可以操作
i2c_wrdata(i2c_add);
i2c_start();
i2c_wrdata(0xa1);
for(i=0;i<(i2c_nub-1);i++) //少循环一次,留给最后发出no ack信号
{
*i2c_data=i2c_redataack();
i2c_data++;
}
*i2c_data=i2c_redata(); //最后一个字节发出no ack信号
i2c_stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -