AVR单片机驱动I2C(TWI)器件
AVR系列单片机内置有TWI控制器,与标准I2C总线兼容。24C256是256K位串行EEPROM芯片,含有32768个字节。
今天调试通了M16的TWI接口,成功从AT24C256器件中写入和读出一个字节内容。程序省略了检验及错误处理部分,为了增强程序健壮性,实际应用中应加入。
主要程序清单及注释:
(程序仅从发送和接收一个字节为例,连续读写应该也差不多吧)
//发送模式
TWCR=0xa4; //发出START信号
while(!(TWCR & 0×80)); //等待TWINT置位,TWINT置位表示START信号已发出
TWDR=0xa0; //表示将要向从机发送数据,以及从机的地址
TWCR=0×84; //TWINT清零,启动发送地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWDR=0×01; //写入高字节储存器地址
TWCR=0×84; //TWINT清零,启动发送储存器地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWDR=0×01; //写入低字节储存器地址
TWCR=0×84; //TWINT清零,启动发送储存器地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWDR=0×55; //写入要储存的数据
TWCR=0×84; //TWINT清零,启动发送数据
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWCR=0×94; //发出STOP信号,数据开始写入储存器
//接受模式
TWCR=0xa4; //发出START信号
while(!(TWCR & 0×80)); //等待TWINT置位,TWINT置位表示START信号已发出
TWDR=0xa0; //发出伪写操作,及从机地址
TWCR=0×84; //TWINT清零,启动发送地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWDR=0×01; //写入要读取的高字节储存器地址
TWCR=0×84; //TWINT清零,启动发送储存器地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWDR=0×01; //写入要读取的低字节储存器地址
TWCR=0×84; //TWINT清零,启动发送储存器地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWCR=0xa4; //再次发出START信号
while(!(TWCR & 0×80)); //等待TWINT置位,TWINT置位表示START信号已发出
TWDR=0xa1; //发出读操作,及从机地址
TWCR=0×84; //TWINT清零,启动发送地址
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
TWCR=0×84; //要求从机发送数据
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示从机已发出数据
RECEIVE=TWDR; //读出数据
TWCR=0×94; //发出STOP信号,数据开始写入储存器
注:
连续写的时候只要多次循环下面三句即可:
TWDR=0×55; //写入要储存的数据
TWCR=0×84; //TWINT清零,启动发送数据
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示命令已发出
连续读的时候要多次循环这个:
TWCR=0xc4; //要求从机发送数据
while(!(TWCR&0×80)); //等待TWINT置位,TWINT置位表示从机已发出数据
RECEIVE=TWDR; //读出数据