?? i2c.h
字號:
/*
AVR單片機I2C總線實驗
I2C總線/TWI操作模塊
1、讀取和寫入函數
2、地址有效范圍255
3、數據長度為單字節
4、函數采用查詢方式
5、可直接嵌入到項目中使用
6、晶振頻率:1M
7、總線速度:50K AVR_AFA
www.iccavr.com
*/
//#include "iom16v.h" I2C總線主機模式錯誤處理
void error(unsigned char type)
{
switch (type & 0xF8)
{
case 0x20: /*址址寫失敗*/
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
break;
case 0x30: /*數據寫失敗*/
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
break;
case 0x38: /*仲裁失敗*/
break;
case 0x48: /*址址讀失敗*/
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
break;
}
}
/*I2C總線單字節寫入*/
unsigned char twi_write(unsigned char addr, unsigned char dd)
{
TWBR = 2; /*start 啟動*/
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x08)
{
error(TWSR);
return 0;
}
/*SLA_W 芯片地址*/
TWDR = 0xA0;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x18)
{
error(TWSR);
return 0;
}
/*addr 操作地址*/
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x28)
{
error(TWSR);
return 0;
}
/*dd 寫入數據*/
TWDR = dd;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x28) {
error(TWSR);
return 0;
}
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);
return 1;
}
/*I2C總線單字節讀取*/
unsigned char twi_read(unsigned char addr, unsigned char *dd)
{
TWBR = 2; /*start 啟動*/
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)))
;
if ((TWSR & 0xF8) != 0x08)
{
error(TWSR);
return 0;
}
/*SLA_W 芯片地址*/
TWDR = 0xA0;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x18)
{
error(TWSR);
return 0;
}
/*addr 操作地址*/
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x28)
{
error(TWSR);
return 0;
}
/*start 啟動*/
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x10)
{
error(TWSR);
return 0;
}
/*SLA_R 芯片地址*/
TWDR = 0xA1;
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x40)
{
error(TWSR);
return 0;
}
/*讀取數據*/
TWCR = (1 << TWINT) | (1 << TWEN);
while (!(TWCR & (1 << TWINT)))
;
if ((TWSR & 0xF8) != 0x58)
{
error(TWSR);
return 0;
}
*dd = TWDR;
/*stop 停止*/
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -