打印
[AVR单片机]

关于M16的TWI的问题

[复制链接]
2299|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lichuanfa|  楼主 | 2007-4-11 15:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用简易的JTAG仿真器,焊接7.3728M的晶振,但是为什么程序在仿真的时候为什么没有ACK响应。希望高手们指点指点。另外还有就是JTAG仿真时,单片机的内部时钟和晶振的频率有什么关系。
程序如下:
  #include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <setjmp.h>
#include <avr/interrupt.h>

#define nop asm ("nop");


void delay ( void ) 
 {
   unsigned int i;
    for ( i=0x0000; i<60000; i++ )
     asm ("nop");
 
 }
 

/*  TWI初始化程序  */
void TWI_INIT( void )
   { 
    TWCR= 0X00; //disable twi 
    TWBR= 0x20; //set bit rate 
    TWSR= 0x00; //set prescale 
    TWCR= 0x04; //enable twi 
    nop;
    }

/* TWI开始信号 */
void TWI_START ( void )
 {
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  while ( !( TWCR & ( 1<<TWINT ) ) )
  nop; 
   
 }

/*  发送  */
void TWI_SAL_W ( unsigned char address1,unsigned char address2 ,unsigned char write_data)
  { 
    TWDR = address1;
    TWCR = (1<<TWINT) | (1<<TWEN);  

    while (!(TWCR & (1<<TWINT)))
    nop;
    nop;
   
    TWDR = address2;
    TWCR = (1<<TWINT) | (1<<TWEN);  

    while (!(TWCR & (1<<TWINT)));
    nop;

    TWDR = 0x00;
    TWCR = (1<<TWINT) | (1<<TWEN);  

    while (!(TWCR & (1<<TWINT)));
    nop;
  
  }

void TWI_STOP ( void )
 {
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

 
 }

int main ( void )
 {
  unsigned char i;
  /* 等待外围器件可靠复位 */ 
  delay();
  delay();
  DDRB=0xFF;
  PORTB=0xFF;


   TWI_INIT(  );



  
  for ( i=0x00; i<0x1; i++ )
   {
   TWI_START (  );   
   TWI_SAL_W (0xa2,i,i);
   TWI_STOP (  );
   delay();  
  
 }


   nop;

   for ( ; ; );

 
  return 0;
 }

相关帖子

沙发
lichuanfa|  楼主 | 2007-4-12 10:41 | 只看该作者

自己顶

高手哪去了,还是我的问题太低级

使用特权

评论回复
板凳
chenlung| | 2007-4-12 11:12 | 只看该作者

re

TWEA没开

使用特权

评论回复
地板
lichuanfa|  楼主 | 2007-4-12 14:30 | 只看该作者

求助

#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <avr/eeprom.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <setjmp.h>
#include <avr/interrupt.h>

#define nop asm ("nop");


void delay ( void ) 
 {
   unsigned int i;
    for ( i=0x0000; i<500; i++ )
     asm ("nop");
 
 }
 

/*  TWI初始化程序  */
void TWI_INIT( void )
   { 
    TWCR= 0X00; //disable twi 
    TWBR= 0x2a; //set bit rate 
    TWSR= 0x00; //set prescale 
    TWCR= 0x04; //enable twi 
    nop;
    }

/* TWI开始信号 */
void TWI_START ( void )
 {
  TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  while ( !( TWCR & ( 1<<TWINT ) ) )
  nop; 
   
 }

/*  发送  */
void TWI_SAL_W (  unsigned char write_data)
  { 
    TWDR =  write_data ;
    TWCR = (1<<TWEN) | (1<<TWINT) |( 1<<TWEA );
    while (!(TWCR & (1<<TWINT)));
  
  }

void TWI_STOP ( void )
 {
   TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
  

 
 }

int main ( void )
 {
 
  unsigned char Reg_Data;
  unsigned char i;

  /* 等待外围器件可靠复位 */ 
  delay();
  delay();
  DDRB=0xFF;
  PORTB=0xFF;
 
 

    

   TWI_INIT(  );

  /*  write */
  do
 
   {
     delay(); 
    TWI_START (  );   
     
    TWI_SAL_W ( 0xa2);
 
    TWI_SAL_W ( 0x11+i);

     TWI_SAL_W ( 0x20+i);

  TWI_STOP (  );
 
  delay(); 
  
  i++; 
  }while ( i<10);
 

 
 i=0x00;


 /* read  */
 do
  {
   delay(); 
   TWI_START (  ); 

   TWI_SAL_W ( 0xa2);   

   TWI_SAL_W ( 0x11+i);
   
   TWI_START (  ); 
   
   TWI_SAL_W ( 0xa3); 
  
   /* 怎样读取 */
    TWCR = (1<<TWINT)|(1<<TWEN) ;                        
    while(!(TWCR&(1<<TWINT))) ;                            
    Reg_Data = TWDR ;
   
  TWI_STOP (  );
  delay(); 
  i++;
  }while (i<10);


 

   nop;

   for ( ; ; );

 
  return 0;
 }

protues仿真正常,但是用AVR JTAG(简易)的,依然不能发现ACK
高手们指点指点

使用特权

评论回复
5
lichuanfa|  楼主 | 2007-4-16 09:18 | 只看该作者

迷茫

高手门呢?

使用特权

评论回复
6
joylinmei| | 2007-5-23 16:12 | 只看该作者

看看

同意三楼chen lung的说法。
TWI初始化程序中TWI根本未开,SREG的全局中断也要开。
仅供参考。
SREG&=0x80;   
这句有误:TWCR= 0X00; //disable twi 
例如改为; TWCR &=0x45;

   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

275

帖子

1

粉丝