打印
[AVR单片机]

请教TWI主模式下查询方法 出现0X38状态错误的处理方法

[复制链接]
2206|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 | 只看该作者

出错做I2C_Stop()处理即可

使用特权

评论回复
板凳
tslids|  楼主 | 2007-11-2 14:01 | 只看该作者

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

不做I2C_Stop()处理,只影响本次I2C通讯(通讯完成后会调用I2C_Stop()),下一次I2C通讯仍可正常工作。

使用特权

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

本版积分规则

1

主题

13

帖子

0

粉丝