新闻中心

EEPW首页>嵌入式系统>设计应用> avr单片机的TWI两线串行接口

avr单片机的TWI两线串行接口

作者: 时间:2016-11-27 来源:网络 收藏


unsigned char twi_write(unsigned char addr, unsigned char dd)
{
TWBR = 10;//设定波特率


IIC_Start();//硬件发送START信号,并且清零TWINT位,使能硬件TWI,使TWI开始工作
IIC_Wait();//等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != 0x08) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0


TWDR = EEPROM_BUS_ADDRESS ;//芯片地址 0xA0 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x18) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


TWDR = addr;//将写入数据的绝对地址 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


TWDR = dd;//将要写入的数据 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0

本文引用地址://m.amcfsurvey.com/article/201611/322111.htm


IIC_Stop();//数据传输完成,发送STOP信号,释放对总线的控制
return 1;//写入数据成功 ,返回1 ,用来判断是否成功写入数据

}
//##############################################################################

unsigned char twi_read(unsigned char addr)
{

unsigned char Receive_Byte ;
TWBR = 2;//设定波特率


IIC_Start();//硬件发送START信号,并且清零TWINT位,使能硬件TWI,使TWI开始工作
IIC_Wait();//等待 发送START完成 TWINT位置位
if ((TWSR & 0xF8) != 0x08) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量,如果正确则向下进行数据传输,错误返回 0


TWDR = EEPROM_BUS_ADDRESS;//芯片地址 0xA0 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x18) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


TWDR = addr;//将写入数据的绝对地址 ,赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x28) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


IIC_Start();//硬件发送 RESTART 信号,并且清零TWINT位,使能硬件TWI,使TWI开始工作
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x10) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


TWDR = 0xA1;//芯片地址 0xA0 并注明是读取操作(最后一位为 1 ),赋值给数据寄存器 TWDR ,等待发送
TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x40) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0


TWCR = (1 << TWINT) | (1 << TWEN);//对控制寄存器TWCR的 TWINT 位软件写1进行清零,然后 使能TWI硬件接口 ,让TWI进行工作,发送 TWDR寄存器 中的数据
IIC_Wait();//等待数据发送完毕 TWINT重新置位
if ((TWSR & 0xF8) != 0x58) return 0;//检测到TWINT位置位,比对TWSR寄存器内的状态量 , 如果正确则向下进行数据传输,错误返回 0
Receive_Byte = TWDR;//读取到的数据放到局部变量里


IIC_Stop();//数据传输完成,发送STOP信号,释放对总线的控制

return Receive_Byte;//将读取到的数据作为函数的输出


}
//##############################################################################

void main(void)
{
uchar c,d;
Uart_Init();//串口初始化
delay_us(20);
Uart_Transmit(0x55);//测试串口

c = twi_write(0x51,0xf8);//在地址0x51里写入数据0x22
Uart_Transmit(c);//将返回值发送到串口测试是否写入成功

delay_ms(2);

d = twi_read(0x51);//将地址0x51里的数据读出来
Uart_Transmit(d);//将读取到的数据发送串口
while(1);
}


上一页 1 2 下一页

评论


技术专区

关闭