当前位置:文档之家› 关于IIC的通信协议程序

关于IIC的通信协议程序

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

#define _BV(bit) (1 << (bit))

#ifndef cbi

#define cbi(reg,bit) reg &= ~_BV(bit)

#endif

#ifndef sbi

#define sbi(reg,bit) reg |= _BV(bit)

#endif

extern uchar dog;

/*

void delay_1ms(uchar xtal)

{

uchar i;

for(i=0;i<(uint)(143*xtal-2);i++)

{;}

}

//2 延时nms

void delay_ms(uchar m, uchar fosc)

{

uchar i;

i=0;

while(i

{

delay_1ms(fosc);

i++;

}

}*/

//-----------------------------IIC操作子程序-------------------------------

//IIC写操作

//address_device为器件地址,0xa0为24C64

//address_reg1为寄存器地址1,address_reg2为寄存器地址2

//data_package为写的数据

void twi_write(uchar address_reg1,uchar address_reg2, uchar data_package) {

//TWI预分频为4分频

//CLI();

sbi(TWSR,TWPS0);

cbi(TWSR,TWPS1);

TWBR=0x20;//SCL频率0x20=29khz ,

begin:

dog=1;

TWCR=_BV(TWEN)|_BV(TWSTA)|_BV(TWINT);

while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示开始信号发送完毕dog=1;

if(((TWSR&0xF8)!=0x08)&((TWSR&0xF8)!=0x10))//检查状态寄存器,如果状态字不是START或RESTART,重新发送开始信号

goto begin;

TWDR=0xa0;//将器件地址写入到TWDR寄存器,TWINT位清零,启动发送地址

// TWDR="0xa0";//%%%%%%%%%%%%%%%

TWCR=_BV(TWEN)|_BV(TWINT);

while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACK

dog=1;

if((TWSR&0xF8)!=0x18)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号

goto begin;

//---发送寄存器地址

TWDR=address_reg1;//写寄存器地址

//TWDR=address_reg1;//%%%%%%%%%%%%%%%

TWCR=_BV(TWEN)|_BV(TWINT);

while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACK

dog=1;

if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号

goto begin;

//---发送EEPROM的第二个地址

TWDR=address_reg2;//写寄存器地址

//TWDR=address_reg2;//%%%%%%%%%%%%%%%

TWCR=_BV(TWEN)|_BV(TWINT);

while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线命令SLA+W已发出,及收到应答信号ACK/NACK

dog=1;

if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是地址ACK,重新发送开始信号

goto begin;

//---写入数据

TWDR=data_package;//将数据载入到TWDR寄存器,TWINT位清零,启动发送地址

//TWDR=data_package;//%%%%%%%%%%%%%%%

TWCR=_BV(TWINT)|_BV(TWEN);

while(!(TWCR&_BV(TWINT)))//等待TWINT置位,TWINT置位表示总线数据已发出,及收到应答信号ACK/NACK

dog=1;

if((TWSR&0xF8)!=0x28)//检查TWI状态寄存器,如果状态字不是数据ACK,重新发送开始信号

goto begin;

TWCR=_BV(TWINT)|_BV(TWSTO)|_BV(TWEN);//发送STOP信号

//delay_ms(2,8);

//delay_ms(2,8);

//SEI();

//delay_ms(2,8);

//PORTC&=~(1<<6);

}

//-------------------------------------------

//IIC读操作

//address_reg1为寄存器地址,address_reg2为寄存器地址2/////////////////////////////////

uchar twi_read(uchar address_reg1,uchar address_reg2)

{

uchar result1=0;

sbi(TWSR,TWPS0);//TWI预分频为4分频

cbi(TWSR,TWPS1);

TWBR=0x20;//SCL频率92160HZ

begin:

//delay_ms(2,8);

dog=1;

TWCR=(1<

while(!(TWCR&(1<

dog=1;

if(((TWSR&0xF8)!=0x08)&((TWSR&0xF8)!=0x10))//检查TWI状态寄存器,如果状态字不是START或RESTART,重新发送开始信号

goto begin;

//---发送器件地址

TWDR=0xa0;//发器件写地址,TWINT位清零,启动发送%%%%%%%%%%%%%% TWCR=(1<

while(!(TWCR&(1<

相关主题