关于ATMEGA32的TWI使用

标签:ATMEGA32TWI
分享到:

前段时间使用ATMEGA32的TWI,总结如下:

unsigned char  WriteRtc( unsigned char SlaAddr, unsigned char RegAddr, unsigned char *SlaData, unsigned char Length )
{
 unsigned char i; 
 TWCR = ( 1<<TWINT ) | ( 1<<TWSTA ) | ( 1<<TWEN );
 while( !( TWCR & ( 1<<TWINT ) ) );      //wait for TWINT set , caused by start signal


 TWDR = SlaAddr;          //TWDR must be written when TWINT set                 
 TWCR =  ( 1<<TWINT ) | ( 1<<TWEN );
 while( !( TWCR & ( 1<<TWINT ) ) );      //wait for TWINT set , caused by transmit  SlaAddr signal

 TWDR = RegAddr;          //write register address
 TWCR =  ( 1<<TWINT ) | ( 1<<TWEN );    //clear TWINT         
 while( !( TWCR & ( 1<<TWINT ) ) );      //wait for TWINT set , caused by RegAddr signal
 
 for( i = 0; i < Length; i++ )
 {
  TWDR = *( SlaData+i );
  TWCR =  ( 1<<TWINT ) | ( 1<<TWEN );              
  while( !( TWCR & ( 1<<TWINT ) ) );
 }

 TWCR = ( 1<<TWINT ) | ( 1<<TWEN ) | ( 1<<TWSTO ); // I2c stop
   
 return(1);
}


//read RTC

unsigned char ReadRtc( unsigned char SlaAddr, unsigned char RegAddr, unsigned char *pRead, unsigned char Length )


 unsigned char i;

 TWCR = ( 1<<TWINT ) | ( 1<<TWSTA ) | ( 1<<TWEN ); //I2c start
 while( !( TWCR & ( 1<<TWINT ) ) );     //wait  TWINT
   
                                 
 TWDR = SlaAddr-1;       //send slave address
 TWCR =  ( 1<<TWINT ) | ( 1<<TWEN );              
 while( !( TWCR & ( 1<<TWINT ) ) );          
 
  
 TWDR = RegAddr;         //send register of device
 TWCR =  ( 1<<TWINT ) | ( 1<<TWEN );              
 while( !( TWCR & ( 1<<TWINT ) ) );          
 
 TWCR = ( 1<<TWINT ) | ( 1<<TWEN ) | ( 1<<TWSTO );  //I2c stop 


 DDRC &= 0XFD;  //set SDA  as input
 PORTC |= 0X02;  //set pull-up resistor

 TWCR = ( 1<<TWINT ) | ( 1<<TWSTA ) | ( 1<<TWEN );   //start I2c
 while( !( TWCR & ( 1<<TWINT ) ) ) ;
  
 
 TWDR = SlaAddr;
 TWCR =  ( 1<<TWINT ) | ( 1<<TWEN )  ;
 while( !( TWCR & ( 1<<TWINT ) ) );
 
 for( i = 0; i < Length - 1; i++ )
 {
  TWCR = ( 1<<TWINT ) | ( 1<<TWEN ) | ( 1<<TWEA ); //send ack
  while( !( TWCR & ( 1<<TWINT ) ) );
  *( pRead+i ) = TWDR;
 }
 
 TWCR = ( 1<<TWINT ) | ( 1<<TWEN );   //send nack
 while( !( TWCR & ( 1<<TWINT ) ) );
 *( pRead+i ) = TWDR;

 TWCR = ( 1<<TWINT ) | ( 1<<TWEN ) | ( 1<<TWSTO ); //I2c stop
 
 DDRC |= 0X03;
 return(1);
}

刚开始用的时候,老是读出错误的数据,最后用Beagle-GUI.抓取I2C,结果发现读I2C时,送出丛机地址和寄存器地址后就退出,原来是从机未发出ACK响应主机,因此关于ATMEGA32的TWI有几点要注意:

1.   首先,关于TWI写顺序是:  I2cStart ---->  WriteSlaAddr -----> WriteRegAddr ----> WriteData ----> I2cStop;

2.  其次, 关于TWI读N字节的顺序是:I2cStart ----> WriteSlaAddr ----> WriteRegAddr ----> I2cStop ----> I2cStart  ---> WriteSlaAddr ----> sendAck----> receive data( (N-1) bytes ) ----->SendNACK ---->receive data ( the last    byte) -----> I2cStop;

3. 最后提醒:读TWI的时候,读时的ACK是不一样的,前(N-1)个字节应该发出ACK信号响应,但是最后一个字节应该发送ACK信号。       

以上的代码未加入容错机制,需要改善

继续阅读
基于ATmega32单片机的灭火机器人设计与实现

机器人竞赛是近年来迅速开展起来的一种对抗活动,它涉及人工智能、机械、电子、传感器、精密机械等诸多领域。通过竞赛可以培养学生的创新意识、动手能力、团队写作能力等。其中灭火比赛是开展范围最广、影响最大的机器人竞赛项目之一。

使用Saleae逻辑分析仪检测您的密码芯片

Saleae逻辑分析仪完全可以与速如此快的速度保持一致。ATSHA204设备支持单线接口(SWI),也支持双线接口(TWI),这取决于部件数量。

基于ATmega32的漏电保护器智能化测试仪的设计

本测试仪操作简单,解决了手动测试方法存在的测量不准确的问题,达到了自动测量的目的,可检测在线与非在线运行的漏电保护器,提高了检测漏电保护器性能的水平,为进行漏电保护器工作性能的研究、品质检验及生产调试提供了技术手段。仪器设计充分利用了ATmega 32内置的各种功能,使硬件电路结构简单,有效提高了仪器的性价比,已在多家企业和科研单位使用,使用结果表明,仪器工作可靠,达到预期的技术指标。

基于AVR单片机的LED显示屏的灰度设计与实现

LED点阵块具有亮度高、发光均匀、可靠性好、拼装方便等优点,能构成各种尺寸的显示屏。目前,LED显示屏已被广泛应用于文字显示并取得了很好的效果,但是大部分仅能显示滚动的文字信息而不能显示图像,并且还

基于ATmega32的遥控采摘机器人设计

针对机器视觉采摘机器存在的技术不成熟,成本过高等不足,提出采用人工操控的半自动采摘技术,并进行了探索研究。设计了一款模拟采摘机器人,机器人以履带底盘为基座,三自由度机械臂,红外遥控操作。硬件电路以ATmega32为系统控制核心,采摘机器人的动作采用BL35P12为核心红外遥控控制。系统软件基于AVR Studio4开发环境,实现对机械臂运动的全方位精确控制。采摘机器人采用模块化设计,抓取速度快,成本低,易于实现,可扩展性强。

©2018 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss