关于IIC的通信协议程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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<