微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > avr单片机的TWI两线串行接口

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

时间:11-27 来源:互联网 点击:


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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top