新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > avr單片機(jī)的TWI兩線串行接口

avr單片機(jī)的TWI兩線串行接口

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏


unsigned char twi_write(unsigned char addr, unsigned char dd)
{
TWBR = 10;//設(shè)定波特率


IIC_Start();//硬件發(fā)送START信號(hào),并且清零TWINT位,使能硬件TWI,使TWI開(kāi)始工作
IIC_Wait();//等待 發(fā)送START完成 TWINT位置位
if ((TWSR & 0xF8) != 0x08) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量,如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


TWDR = EEPROM_BUS_ADDRESS ;//芯片地址 0xA0 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
TWCR = (1 << TWINT) | (1 << TWEN);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x18) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


TWDR = addr;//將寫入數(shù)據(jù)的絕對(duì)地址 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
TWCR = (1 << TWINT) | (1 << TWEN);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


TWDR = dd;//將要寫入的數(shù)據(jù) ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
TWCR = (1 << TWINT) | (1 << TWEN);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0

本文引用地址:http://butianyuan.cn/article/201611/322111.htm


IIC_Stop();//數(shù)據(jù)傳輸完成,發(fā)送STOP信號(hào),釋放對(duì)總線的控制
return 1;//寫入數(shù)據(jù)成功 ,返回1 ,用來(lái)判斷是否成功寫入數(shù)據(jù)

}
//##############################################################################

unsigned char twi_read(unsigned char addr)
{

unsigned char Receive_Byte ;
TWBR = 2;//設(shè)定波特率


IIC_Start();//硬件發(fā)送START信號(hào),并且清零TWINT位,使能硬件TWI,使TWI開(kāi)始工作
IIC_Wait();//等待 發(fā)送START完成 TWINT位置位
if ((TWSR & 0xF8) != 0x08) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量,如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


TWDR = EEPROM_BUS_ADDRESS;//芯片地址 0xA0 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
TWCR = (1 << TWINT) | (1 << TWEN);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x18) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


TWDR = addr;//將寫入數(shù)據(jù)的絕對(duì)地址 ,賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
TWCR = (1 << TWINT) | (1 << TWEN);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


IIC_Start();//硬件發(fā)送 RESTART 信號(hào),并且清零TWINT位,使能硬件TWI,使TWI開(kāi)始工作
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x10) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0


TWDR = 0xA1;//芯片地址 0xA0 并注明是讀取操作(最后一位為 1 ),賦值給數(shù)據(jù)寄存器 TWDR ,等待發(fā)送
TWCR = (1 << TWINT) | (1 << TWEN);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
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);//對(duì)控制寄存器TWCR的 TWINT 位軟件寫1進(jìn)行清零,然后 使能TWI硬件接口 ,讓TWI進(jìn)行工作,發(fā)送 TWDR寄存器 中的數(shù)據(jù)
IIC_Wait();//等待數(shù)據(jù)發(fā)送完畢 TWINT重新置位
if ((TWSR & 0xF8) != 0x58) return 0;//檢測(cè)到TWINT位置位,比對(duì)TWSR寄存器內(nèi)的狀態(tài)量 , 如果正確則向下進(jìn)行數(shù)據(jù)傳輸,錯(cuò)誤返回 0
Receive_Byte = TWDR;//讀取到的數(shù)據(jù)放到局部變量里


IIC_Stop();//數(shù)據(jù)傳輸完成,發(fā)送STOP信號(hào),釋放對(duì)總線的控制

return Receive_Byte;//將讀取到的數(shù)據(jù)作為函數(shù)的輸出


}
//##############################################################################

void main(void)
{
uchar c,d;
Uart_Init();//串口初始化
delay_us(20);
Uart_Transmit(0x55);//測(cè)試串口

c = twi_write(0x51,0xf8);//在地址0x51里寫入數(shù)據(jù)0x22
Uart_Transmit(c);//將返回值發(fā)送到串口測(cè)試是否寫入成功

delay_ms(2);

d = twi_read(0x51);//將地址0x51里的數(shù)據(jù)讀出來(lái)
Uart_Transmit(d);//將讀取到的數(shù)據(jù)發(fā)送串口
while(1);
}


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專區(qū)

關(guān)閉