📄 twi.c
字号:
#include <iom128v.h>
#include <iom128.h>
#include <macros.h>
#include "TWI.h"
#define uchar unsigned char
#define uint unsigned int
#define Page_size 8
#define Page_mask Page_size-1
//#pragma data:code
//const
char table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char table1[8]={0,0,0,0,0,0,0,0};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1100;y>0;y--);
}
/*
函数:TWI_init()
功能:I2C总线初始化,使总线处于空闲状态
说明:在main()函数的开始处,通常应当要执行一次本函数
*/
void TWI_init()
{
TWBR=0X22;
TWSR=0;
TWCR=0X44;
}
/*
函数:TWI_start()
功能:产生I2C总线的起始状态
说明:
本函数也可以用来产生重复起始状态
本函数执行后,I2C总线处于忙状态
*/
uchar TWI_start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
return 1;
}
void TWI_stop(void)
{
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
/*
函数:TWI_writeB()
功能:向I2C总线写1个字节的数据
返回:
0: 从机无应答
1:从机应答
参数:
c:要写到总线上的数据
*/
uchar TWI_writeB(uchar c)
{
uchar ack=1;
TWDR=c;
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if((TWSR&0xF8)!=SLA_W_ACK)
ack=0;
return ack;
}
/*
函数:TWI_readB()
功能:从从机读取1个字节的数据
返回:读取的一个字节数据
说明:ack=0; 不应答
ack=1; 应答
*/
uchar TWI_readB(uchar ack)
{
if(ack)
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
else
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
return(TWDR);
}
/*
函数:TWI_page_write()
功能:I2C总线综合发送函数,向从机发送多个字节的数据,整页发送
参数:
SlaveAddr:从机地址(7位纯地址,不含读写位)
addr:从机的子地址
*arr:要发送的数据
n:数据的字节数
返回:
1:发送成功
0:在发送过程中出现异常
说明:
本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
当从机没有子地址时,参数addr任意
*/
uchar TWI_page_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
{
uchar i;
TWI_start();
TWI_writeB(devadd);
TWI_writeB(addr);
for(i=1;i<=n;i++)
{
//TWI_writeB(i);
//table[i]=i;
TWI_writeB(*arr);
arr++;
}
TWI_stop();
delay(80);
}
/*
函数:TWI_page_write()
功能:I2C总线综合发送函数,向从机发送多个字节的数据
参数:
SlaveAddr:从机地址(7位纯地址,不含读写位)
addr:从机的子地址
*arr:要发送的数据
n:数据的字节数
返回:
1:发送成功
0:在发送过程中出现异常
说明:
本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
当从机没有子地址时,参数addr任意
*/
uchar TWI_write(uchar devadd,uchar addr,uchar n,uchar *arr)//
{
uchar n_tmp;
n_tmp=Page_size-(uchar)(addr&Page_mask);
if((n>n_tmp)&&(n_tmp!=0))
{
TWI_page_write(devadd,addr,n_tmp,arr);//
addr+=n_tmp;
n-=n_tmp;
arr+=n_tmp;
}
while(n>=Page_size)
{
TWI_page_write(devadd,addr,Page_size,arr);//
addr+=Page_size;
n-=Page_size;
arr+=Page_size;
}
if(n!=0)
TWI_page_write(devadd,addr,n,arr);//
}
/*
函数:TWI_read()
功能:I2C总线综合接收函数,从从机接收多个字节的数据
参数:
SlaveAddr:从机地址(7位纯地址,不含读写位)
addr:从机的子地址
*arr:要发送的数据
n:数据的字节数
返回:
1:接收成功
0:在接收过程中出现异常
说明:
本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
当从机没有子地址时,参数addr任意
*/
uchar TWI_read(uchar devadd,uchar addr,uchar n,uchar *arr)
{
uchar i;
TWI_start();
TWI_writeB(devadd);
TWI_writeB(addr);
TWI_start();
TWI_writeB(devadd|1);
for(i=1;i<=n-1;i++)
{
*arr= TWI_readB(1);
arr++;
}
*arr= TWI_readB(0);
TWI_stop();
}
/*void main()
{
uchar i;
DDRA=0xff;
TWI_init();
// PORTD|=0XFF;
// TWI_write(0xa0,1,8,table);//
// TWI_write(0x38,1,1,table);
// delay(50);
// TWI_read(0xa0,1,8,table1);
// TWI_read(0x38,1,1,table1);
while(1)
{
TWI_read(0x70,0x00,2,table1);
if(table1[1] == 2)
PORTA=0X55;
else
PORTA=0X01;
//for(i=0;i<8;i++)
// {
// PORTA=table1[i];
// delay(500);
// }
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -