关于IIC的通信协议程序

发布 2019-07-24 07:45:55 阅读 4615

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

if(((twsr&0xf8)!=0x08)&(twsr&0xf8)!=0x10))/检查twi状态寄存器,如果状态字不是start或restart,重新发送开始信号。

goto begin;

/--发送器件地址。

twdr=0xa0;//发器件写地址,twint位清零,启动发送。

twcr=(1

if((twsr&0xf8)!=0x18)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。

goto begin;

/--发送寄存器地址。

twdr=address_reg1;//写寄存器地址,twint位清零,启动发送。

twcr=(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;

/--发送起始信号。

twcr=(1

if(((twsr&0xf8)!=0x08)&(twsr&0xf8)!=0x10))/检查twi状态寄存器,如果状态字不是start或restart,重新发送开始信号。

goto begin;

/--发送读命令。

twdr=0xa0+1;//读器件地址写入到twdr寄存器,twint位清零,启动发送。

twcr=(1

if((twsr&0xf8)!=0x40)//检查twi状态寄存器,如果状态字不是地址ack,重新发送开始信号。

goto begin;

twcr=(1

if((twsr&0xf8)!=0x58)

goto begin;

twcr=(1

/delay_ms(2,8);

/delay_ms(2,8);

/delay_ms(2,8);

return result1;

void setpa(uchar b,uchar v)

if(v==0) porta&=~1< else if(v==1) porta|=(1<}

void setpb(uchar b,uchar v)

if(v==0) portb&=~1< else if(v==1) portb|=(1<}

void setpc(uchar b,uchar v)

if(v==0) portc&=~1< else if(v==1) portc|=(1<}

void setpd(uchar b,uchar v)

if(v==0) portd&=~1< else if(v==1) portd|=(1<}

void setpe(uchar b,uchar v)

if(v==0) porte&=~1< else if(v==1) porte|=(1<}

void setpf(uchar b,uchar v)

if(v==0) portf&=~1< else if(v==1) portf|=(1<}

void setpg(uchar b,uchar v)

if(v==0) portg&=~1< else if(v==1) portg|=(1<}