theodorechao 发表于 2007-10-19 20:30:24

TWI作为从机发模式单片机复位

TWI双机通讯,主收从发,多个字节,两个M16没有问题,一个M16作主机,一个M88(或M8)作从机时,通讯没有问题.
可是FREESCAL单片机模拟主机接收时,数据也能正常接收到,但主机会不定时复位,两机共电源,但从机不复位.
急切请求各位大侠帮助?分析原因

theodorechao 发表于 2007-10-19 21:16:56

复位时,复位脚与电源电平都没有任何变化,硬件EFT通过4500
下面是从机源程序
//TWI slave initialize
// bit rate:100
void twi_slave_init(uint8 add)
{
TWCR= 0x00; //disable twi
TWBR= 0x64; //set bit rate
TWSR= 0x00; //set prescale
TWAR= add; //set slave address 从机地址为 0x01
TWCR= (1<<TWEN)|(1<<TWEA)|(1<<TWIE); //enable twi
//TWEN必须置位以使能TWI接口。TWEA也要置位以使主机寻址到自己(从机地址或广播) 时返回确认信息ACK
}
#pragma interrupt_handler twi_isr:18
void twi_isr(void)
{
//twi event
switch (TWSR&0xF8)
{
//从发送*****************************

   case TW_ST_SLA_ACK:               // 0xA8: 自己的SLA+R 已经被接收,ACK 已返回
   case TW_ST_ARB_LOST_SLA_ACK:// 0xB0: SLA+R/W 作为主机的仲裁失败;自己的SLA+R 已经被接收,ACK 已返回
      // 被选中为从读出 (数据将从传回主机)
          TWDR=main_tmp;//发送全局变量中值
          Twi_Ack();                
          break;   
case TW_ST_DATA_ACK:            // 0xB8: TWDR 里数据已经发送,接收到ACK
      //发送数据位
       TWDR=main_tmp;
   break;   
   case TW_ST_DATA_NACK:            // 0xC0: TWDR 里数据已经发送接收到NOT ACK
   case TW_ST_LAST_DATA:            // 0xC8: TWDR 的一字节数据已经发送(TWAE = “0”);接收到ACK
      // 全部完成
      // 从方式开放
      Twi_NoAcK();
          twi_slave_init(0xa6);      //重新回到初始化状态,等待接收模式的到来
      break;
   case TW_NO_INFO:               // 0xF8: 没有相关的状态信息;TWINT = “0”
      // 无操作
          break;
   case TW_BUS_ERROR:               // 0x00: 由于非法的START 或STOP 引起的总线错误
      // 内部硬件复位,释放总线
      TWCR=TWCR&TWCR_CMD_MASK|(1<<TWINT)|(1<<TWSTO)|(1<<TWEA);
   break;
       default:
       break;
}
}
void main(void)
{
DDRC=0X00;
PORTC=0x03; //使能内部上拉电阻
DDRA=0xff;
twi_slave_init(0xa6); //初始化为从机,地址0xa6。
SEI();
while(1)
;
}

theodorechao 发表于 2008-2-17 22:17:10

问题找到了,原来是主机进行除法运算没有做好才导致复位的

enci 发表于 2008-5-30 15:25:50

:-)记号在这里
页: [1]
查看完整版本: TWI作为从机发模式单片机复位