×
单片机 > 单片机程序设计 > 详情

关于ATMEGA32的TWI使用

发布时间:2020-05-25 发布时间:
|

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

unsigned char  WriteRtc( unsigned char SlaAddr, unsigned char RegAddr, unsigned char *SlaData, unsigned char Length )
{
 unsigned char i; 
 TWCR = ( 1< while( !( TWCR & ( 1<

 TWDR = SlaAddr;          //TWDR must be written when TWINT set                 
 TWCR =  ( 1< while( !( TWCR & ( 1<
 TWDR = RegAddr;          //write register address
 TWCR =  ( 1< while( !( TWCR & ( 1< 
 for( i = 0; i < Length; i++ )
 {
  TWDR = *( SlaData+i );
  TWCR =  ( 1<  while( !( TWCR & ( 1< }

 TWCR = ( 1<   
 return(1);
}


//read RTC

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


 unsigned char i;

 TWCR = ( 1< while( !( TWCR & ( 1<   
                                 
 TWDR = SlaAddr-1;       //send slave address
 TWCR =  ( 1< while( !( TWCR & ( 1< 
  
 TWDR = RegAddr;         //send register of device
 TWCR =  ( 1< while( !( TWCR & ( 1< 
 TWCR = ( 1<

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

 TWCR = ( 1< while( !( TWCR & ( 1<  
 
 TWDR = SlaAddr;
 TWCR =  ( 1< while( !( TWCR & ( 1< 
 for( i = 0; i < Length - 1; i++ )
 {
  TWCR = ( 1<  while( !( TWCR & ( 1<  *( pRead+i ) = TWDR;
 }
 
 TWCR = ( 1< while( !( TWCR & ( 1< *( pRead+i ) = TWDR;

 TWCR = ( 1< 
 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  TWI使用  容错机制 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式