一样的代码,用来控制带 i2c 的风扇板及读写 e2prom 都没问题,但是用来进行两个 AVR 单片机之间的通
信时,有时会出现数据发送和接收错误(单片机 AT1281的 TWI 引脚连接到 i2c 缓冲器 PCA9513上,通信
是在 ATCA 六槽机箱中进行,但是只用了两个槽位,其他的悬空)
主机不采用中断发送和接收,部分代码如下:
void I2cStart(void)
{
TWCR = (TWCR &TWCR_MASK) | (1<<TWINT) | (1<<TWSTA);
}
void I2cStop(void)
{
TWCR = (TWCR & TWCR_MASK) | (1<<TWINT) | (1<<TWSTO) | (1<<TWEA);
}
/********************************************************************
** 名 称:I2cWaitForComplete()
** 功 能:等待 I2C 总线操作完成
** 入口参数:无
** 出口参数:无
*********************************************************************/
void I2cWaitForComplete(void)
{
uint i = 0;
do
i++;
while((!(TWCR & (1<<TWINT))) && (i < 10000));
if(i >= 10000)
{
TWCR &= ~(1 << TWEN);
PORTD = (1 << PD0) | (1 << PD1);