avr單片機(jī)的TWI兩線串行接口
unsigned char twi_write(unsigned char addr, unsigned char dd)
{
IIC_Start();
IIC_Wait();
if ((TWSR & 0xF8) != 0x08) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量,如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWDR = EEPROM_BUS_ADDRESS ;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x18) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWDR = dd;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0本文引用地址:http://m.butianyuan.cn/article/201611/322111.htm
IIC_Stop();
return 1;
}
//##############################################################################
unsigned char twi_read(unsigned char addr)
{
unsigned char Receive_Byte ;
TWBR = 2;
IIC_Start();
IIC_Wait();
if ((TWSR & 0xF8) != 0x08) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量,如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWDR = EEPROM_BUS_ADDRESS;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x18) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x28) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
IIC_Start();
if ((TWSR & 0xF8) != 0x10) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWDR = 0xA1;
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x40) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
TWCR = (1 << TWINT) | (1 << TWEN);
IIC_Wait();
if ((TWSR & 0xF8) != 0x58) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
Receive_Byte = TWDR;
IIC_Stop();
}
//##############################################################################
void main(void)
{
uchar c,d;
Uart_Init();
delay_us(20);
Uart_Transmit(0x55);
c = twi_write(0x51,0xf8);
Uart_Transmit(c);
delay_ms(2);
d = twi_read(0x51);
Uart_Transmit(d);
while(1);
}
評(píng)論