TWI作为从机发模式单片机复位
TWI双机通讯,主收从发,多个字节,两个M16没有问题,一个M16作主机,一个M88(或M8)作从机时,通讯没有问题.可是FREESCAL单片机模拟主机接收时,数据也能正常接收到,但主机会不定时复位,两机共电源,但从机不复位.
急切请求各位大侠帮助?分析原因 复位时,复位脚与电源电平都没有任何变化,硬件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)
;
} 问题找到了,原来是主机进行除法运算没有做好才导致复位的 :-)记号在这里
页:
[1]