#include "iom16v.h"
#define uchar unsigned char
#define uint unsigned int
#define wr_device_add 0x64 //8025 器件地址,写命令
#define rd_device_add 0x65 //器件地址,读命令
#define START 0x08 //
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_DATA_ACK 0x28
#define MR_SLA_ACK 0x40
#define MR_DATA_ACK 0x50
#define MR_DATA_NAK 0x58
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xf8)
#define SetAck() (TWCR|=(1<<TWEA))
#define SetNoAck() (TWCR&=~(1<<TWEA))
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
uchar now_time[6];
//Twi 初始化
void Twi_init(void)
{
TWSR=00;
TWBR=0x16; //50K
}
/******************************************
Twi总线写一个字节
返回0:写成功
返回非0:写失败
*******************************************/
unsigned char i2c_Write(unsigned char Wdata,unsigned int RomAddress)
{
Start();//I2C启动
Wait();
if(TestAck()!=START) return 1;//ACK
Write8Bit(wr_device_add);//写I2C从器件地址和写方式
Wait();
if(TestAck()!=MT_SLA_ACK) return 1;//ACK
Write8Bit(RomAddress);//写地址
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
Write8Bit(Wdata);//写数据
Wait();
if(TestAck()!=MT_DATA_ACK) return 1;//ACK
Stop();//I2C停止
delay_ms(10);//延时
return 0;
}
/******************************************
Twi总线读一个字节
如果读失败也返回0
*******************************************/
unsigned char i2c_Read(unsigned int RomAddress)
{
unsigned char temp;
Start();//I2C启动
Wait();
if (TestAck()!=START) return 0;//ACK
Write8Bit(wr_device_add);//写I2C从器件地址和写方式
Wait();
if (TestAck()!=MT_SLA_ACK) return 0;//ACK
Write8Bit(RomAddress);//写地址
Wait();
if (TestAck()!=MT_DATA_ACK) return 0;
Start();//I2C重新启动
Wait();
if (TestAck()!=RE_START) return 0;
Write8Bit(rd_device_add);//写I2C从器件地址和读方式
Wait();
if(TestAck()!=MR_SLA_ACK)
return 0;//ACK
Twi();//启动主I2C读方式
Wait();
if(TestAck()!=MR_DATA_NAK) return 0;//ACK
temp=TWDR;//读取I2C接收数据
Stop();//I2C停止
return temp;
}
Void main(void)
{
uchar i, j,time_temp;
while(1)
{
//测试时钟
USART_Transmit('t');
USART_Transmit('i');
USART_Transmit('m');
USART_Transmit('e');
USART_Transmit('-');
USART_Transmit('t');
USART_Transmit('e');
USART_Transmit('s');
USART_Transmit('t');
USART_Transmit(':');
//写时钟
i2c_Write(now_time[0],0x60); //年
i2c_Write(now_time[1],0x50); //月
i2c_Write(now_time[2],0x40); //日
i2c_Write(now_time[3],0x20); //时
i2c_Write(now_time[4],0x10); //分
i2c_Write(now_time[5],0x00); //秒
//读时钟
delay_ms(500);
USART_Transmit(0x20);
time_temp=i2c_Read(0x60); //年
USART_Transmit(time_temp);
time_temp=i2c_Read(0x50); //月
USART_Transmit(time_temp);
time_temp=i2c_Read(0x40); //日
USART_Transmit(time_temp);
time_temp=i2c_Read(0x20); //时
USART_Transmit(time_temp);
time_temp=i2c_Read(0x10); //分
USART_Transmit(time_temp);
time_temp=i2c_Read(0x00); //秒
USART_Transmit(time_temp);
/*
等待接收数据(需要设置的),存入now_time[]中
*/
while(!(UCSRA & (1<<RXC))); //等待UART接收数据
i=UDR;
while(i!='y'); //如果接收到字符y则继续
}
}
TWI.rar_AVR IIC
版权申诉
11 浏览量
2022-09-22
20:21:49
上传
评论
收藏 1KB RAR 举报
APei
- 粉丝: 63
- 资源: 1万+
最新资源
- 基于matlab实现用有限元法计算电磁场的Matlab工具 .rar
- 基于matlab实现有限元算法 计算电磁场问题 边界条件包括第一类边界和第二类边界.rar
- 基于matlab实现用于计算不同车重下的电动汽车动力性和经济性.rar
- 基于matlab实现遗传算法求解多车场车辆路径问题 有多组算例可以用.rar
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈