主机采用查询方式,若状态寄存器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; } |