[AVR单片机] 请教TWI主模式下查询方法 出现0X38状态错误的处理方法

[复制链接]
3154|2
 楼主| tslids 发表于 2007-11-1 10:46 | 显示全部楼层 |阅读模式
主机采用查询方式,若状态寄存器TWSR & 0XF8 = 0X38错误应如何处理,若不采取相应处理方**有哪些影响,能造成死机吗,或以后的通讯数均无法正确发送或接收?下面是部分程序
//*******************************************************
// 函数名称: I2C_Start()
// 函数功能: I2C 启动
// 入口参数: 无
// 出口参数: 无
//*******************************************************
void I2C_Start(void)
{
     TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
     while(!(TWCR & (1<<TWINT)));
}
//*******************************************************
// 函数名称: I2C_Stop()
// 函数功能: I2C 停止
// 入口参数: 无
// 出口参数: 无
//*******************************************************
void I2C_Stop(void)
{
     TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}

//*******************************************************
// 函数名称: I2C_Write_Byte()
// 函数功能: 主器件向总线上写一个字节 
// 入口参数: i2c_data  数据
// 出口参数: 无
//*******************************************************
void I2C_Write_Byte(unsigned char i2c_data)
{
    TWDR = i2c_data;
    TWCR = (1<<TWINT) | (1<<TWEN);     
    while ((TWCR & (1<<TWINT)) == 0);
}
//*******************************************************
// 函数名称: I2C_Read_Byte()
// 函数功能: 主器件向总线上写一个字节 
// 入口参数: ack  是否应答  =1为应答
// 出口参数: i2c_data   接收数据
//*******************************************************
unsigned char I2C_Read_Byte(unsigned char ack)
{
     unsigned char i2c_data;
        
     if(ack)
     TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
     else     
     TWCR = (1<<TWINT) | (1<<TWEN);
     while ((TWCR & (1<<TWINT)) == 0);

     i2c_data = TWDR;     
     
     return i2c_data;
}
hotpower 发表于 2007-11-1 22:07 | 显示全部楼层
 楼主| tslids 发表于 2007-11-2 14:01 | 显示全部楼层

谢谢,是不是可以这样认为

不做I2C_Stop()处理,只影响本次I2C通讯(通讯完成后会调用I2C_Stop()),下一次I2C通讯仍可正常工作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部