?? twi.c
字號:
#include <iom128v.h>
#include <iom128.h>
#include <macros.h>
#include "TWI.h"
#define uchar unsigned char
#define uint unsigned int
#define Page_size 8
#define Page_mask Page_size-1
//#pragma data:code
//const
char table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char table1[8]={0,0,0,0,0,0,0,0};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1100;y>0;y--);
}
/*
函數(shù):TWI_init()
功能:I2C總線初始化,使總線處于空閑狀態(tài)
說明:在main()函數(shù)的開始處,通常應(yīng)當(dāng)要執(zhí)行一次本函數(shù)
*/
void TWI_init()
{
TWBR=0X22;
TWSR=0;
TWCR=0X44;
}
/*
函數(shù):TWI_start()
功能:產(chǎn)生I2C總線的起始狀態(tài)
說明:
本函數(shù)也可以用來產(chǎn)生重復(fù)起始狀態(tài)
本函數(shù)執(zhí)行后,I2C總線處于忙狀態(tài)
*/
uchar TWI_start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
return 1;
}
void TWI_stop(void)
{
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
/*
函數(shù):TWI_writeB()
功能:向I2C總線寫1個字節(jié)的數(shù)據(jù)
返回:
0: 從機(jī)無應(yīng)答
1:從機(jī)應(yīng)答
參數(shù):
c:要寫到總線上的數(shù)據(jù)
*/
uchar TWI_writeB(uchar c)
{
uchar ack=1;
TWDR=c;
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if((TWSR&0xF8)!=SLA_W_ACK)
ack=0;
return ack;
}
/*
函數(shù):TWI_readB()
功能:從從機(jī)讀取1個字節(jié)的數(shù)據(jù)
返回:讀取的一個字節(jié)數(shù)據(jù)
說明:ack=0; 不應(yīng)答
ack=1; 應(yīng)答
*/
uchar TWI_readB(uchar ack)
{
if(ack)
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
else
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
return(TWDR);
}
/*
函數(shù):TWI_page_write()
功能:I2C總線綜合發(fā)送函數(shù),向從機(jī)發(fā)送多個字節(jié)的數(shù)據(jù),整頁發(fā)送
參數(shù):
SlaveAddr:從機(jī)地址(7位純地址,不含讀寫位)
addr:從機(jī)的子地址
*arr:要發(fā)送的數(shù)據(jù)
n:數(shù)據(jù)的字節(jié)數(shù)
返回:
1:發(fā)送成功
0:在發(fā)送過程中出現(xiàn)異常
說明:
本函數(shù)能夠很好地適應(yīng)所有常見的I2C器件,不論其是否有子地址
當(dāng)從機(jī)沒有子地址時,參數(shù)addr任意
*/
uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
{
uchar i;
TWI_start();
TWI_writeB(devadd);
TWI_writeB(addr);
for(i=1;i<=n;i++)
{
//TWI_writeB(i);
//table[i]=i;
TWI_writeB(*arr);
arr++;
}
TWI_stop();
delay(80);
}
/*
函數(shù):TWI_page_write()
功能:I2C總線綜合發(fā)送函數(shù),向從機(jī)發(fā)送多個字節(jié)的數(shù)據(jù)
參數(shù):
SlaveAddr:從機(jī)地址(7位純地址,不含讀寫位)
addr:從機(jī)的子地址
*arr:要發(fā)送的數(shù)據(jù)
n:數(shù)據(jù)的字節(jié)數(shù)
返回:
1:發(fā)送成功
0:在發(fā)送過程中出現(xiàn)異常
說明:
本函數(shù)能夠很好地適應(yīng)所有常見的I2C器件,不論其是否有子地址
當(dāng)從機(jī)沒有子地址時,參數(shù)addr任意
*/
uchar TWI_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
{
uchar n_tmp;
n_tmp=Page_size-(uchar)(addr&Page_mask);
if((n>n_tmp)&&(n_tmp!=0))
{
TWI_page_write(devadd,addr,n_tmp,arr);//
addr+=n_tmp;
n-=n_tmp;
arr+=n_tmp;
}
while(n>=Page_size)
{
TWI_page_write(devadd,addr,Page_size,arr);//
addr+=Page_size;
n-=Page_size;
arr+=Page_size;
}
if(n!=0)
TWI_page_write(devadd,addr,n,arr);//
}
/*
函數(shù):TWI_read()
功能:I2C總線綜合接收函數(shù),從從機(jī)接收多個字節(jié)的數(shù)據(jù)
參數(shù):
SlaveAddr:從機(jī)地址(7位純地址,不含讀寫位)
addr:從機(jī)的子地址
*arr:要發(fā)送的數(shù)據(jù)
n:數(shù)據(jù)的字節(jié)數(shù)
返回:
1:接收成功
0:在接收過程中出現(xiàn)異常
說明:
本函數(shù)能夠很好地適應(yīng)所有常見的I2C器件,不論其是否有子地址
當(dāng)從機(jī)沒有子地址時,參數(shù)addr任意
*/
uchar TWI_read(uchar devadd,uchar addr,uchar n,uchar *arr)
{
uchar i;
TWI_start();
TWI_writeB(devadd);
TWI_writeB(addr);
TWI_start();
TWI_writeB(devadd|1);
for(i=1;i<=n-1;i++)
{
*arr= TWI_readB(1);
arr++;
}
*arr= TWI_readB(0);
TWI_stop();
}
/*void main()
{
uchar i;
DDRA=0xff;
TWI_init();
// PORTD|=0XFF;
// TWI_write(0xa0,1,8,table);//
// TWI_write(0x38,1,1,table);
// delay(50);
// TWI_read(0xa0,1,8,table1);
// TWI_read(0x38,1,1,table1);
while(1)
{
TWI_read(0x70,0x00,2,table1);
if(table1[1] == 2)
PORTA=0X55;
else
PORTA=0X01;
//for(i=0;i<8;i++)
// {
// PORTA=table1[i];
// delay(500);
// }
}
}*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -