?? i2c.h
字號:
///////////////////////i2c通信子程序///////////////////////
///////////////////////////////////////////////////////////
//初始化
void i2c_init()
{
PORTD&=~0x80;
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 + -