微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > IAR For AVR 两线串行接口 TWI 应用

IAR For AVR 两线串行接口 TWI 应用

时间:12-03 来源:互联网 点击:

############################################################
/*I2C总线单字节写入*/
unsigned char twi_write(unsigned char addr, unsigned char dd)
{
TWBR = 10; //设定波特率

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

/*SLA_W 芯片地址*/
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

/*addr 操作地址*/
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

/*dd 写入数据*/
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

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

}
//##############################################################################
/*I2C总线单字节读取*/
unsigned char twi_read(unsigned char addr)
{

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

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

/*SLA_W 芯片地址*/
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

/*addr 操作地址*/
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

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

/*SLA_R 芯片地址*/
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; //读取到的数据放到局部变量里

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

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

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

网站地图

Top