首页 > 技术 > AVR单片机驱动I2C(TWI)器件

AVR单片机驱动I2C(TWI)器件

2007年2月19日

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; //读出数据

Jacob 技术

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

*

Anti-spam image