⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twi.c

📁 利用mega128控制由L298和L297构成的驱动板
💻 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 + -