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

📄 twi.c

📁 数字功放DDX8001控制程序,包含LCD12864驱动,TWI驱动,旋转偏码驱动
💻 C
字号:
/*****************************************************************************************
                                  硬件TWI驱动TWI.c
								  CPU     :M16								   
                                  晶振    :8M
                                  编译环境:AVRGCC20071221
                                  B Y     :PENG  2008-1-5  
******************************************************************************************/

#include <avr/io.h>
#include <avr/delay.h>
#include "TWI.h"

/*---------------------------------------------------
  name     :twi_init(void)
  Variables:
  task     :i2c通信初始化
  return   :NO
----------------------------------------------------*/
void twi_init(void)
{
 TWCR= 0x00; //disable twi
 TWBR= (1<<6) | (1<<5) | (1<<2); //set bit rate
 TWSR= 0x00; //set prescale
 TWAR= 0x00; //set slave address
 TWCR= (1<<TWEN); //enable twi
 DDRC=0xfc;
 PORTC|=0x03;
}
/*---------------------------------------------------
  name     :i2cstart(void)
  Variables:
  task     :i2c通信开始
  return   :NO
----------------------------------------------------*/
void i2cstart(void)
{ 
	TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); 
   	while (!(TWCR & (1<<TWINT)));
}
/*---------------------------------------------------
  name     :unsigned char i2cwt(unsigned char data)
  Variables:unsigned char data
  task     :i2c写数据,返回TWI状态
  return   :TWI状态
----------------------------------------------------*/
unsigned char i2cwt(unsigned char data)
{ 
	TWDR = data;
   	TWCR = (1<<TWINT) | (1<<TWEN);
   	while (!(TWCR & (1<<TWINT)));
   	return(TWSR&0b11111000);
}
/*---------------------------------------------------
  name     :unsigned char i2crd(void)
  Variables:
  task     :i2c读数据
  return   :读取的数据
----------------------------------------------------*/
unsigned char i2crd(void)
{
   	TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
   	while (!(TWCR & (1<<TWINT)));
   	return(TWDR);
}
/*---------------------------------------------------
  name     :i2cstop(void)
  Variables:
  task     :i2c停止
  return   :NO
----------------------------------------------------*/
void i2cstop(void)
{ 
   TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}
/*---------------------------------------------------
  name     :unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
  Variables:unsigned char *p, unsigned int ad, unsigned char n
  task     :向24Cxx写入数据wt24c_h()所要调用的函数
  return   :ERR_SLAW
----------------------------------------------------*/
unsigned char wtDDX_nbyte(unsigned char *p, unsigned char ad, unsigned char n)
{		
	i2cstart();					//发送起始信号
		
	if(i2cwt(W_ADD_COM)==SLAW)//发送SLA_W, 写字节命令及器件地址
	{	
		i2cwt(ad);				//ad_dst到器件
			
		for(;n>0;n--)			//发送要写入的数据
		{
		    i2cwt(*p);
			p++;
		}
		i2cstop();
		_delay_ms(5);
		return 0;
	}
	else return ERR_SLAW;		//写字节命令及器件地址错
		
}
/*---------------------------------------------------
  name     :rdDDX
  Variables:unsigned char *p_dst, unsigned char ad_rsci2c的地址, unsigned char num数据个数
  task     :从24cxx读出数据
  return   :ERR_SLAW
----------------------------------------------------*/
unsigned char rdDDX_nbyte(unsigned char *p_dst, unsigned char ad_rsc, unsigned char num)
{	
	i2cstart();					//发送起始信号
		
	if(i2cwt(W_ADD_COM)==SLAW)//发送SLA_W, 写字节命令及器件地址
	{	
		i2cwt(ad_rsc);			//ad_rsc
				
		i2cstart();				//再发送起始信号
		i2cwt(R_ADD_COM);		//发送SLA_R, 读命令字节及器件地址
				
		for(;num>0;num--)
		{
		    *p_dst=i2crd();		//从器件读出一个字节
			p_dst++;
		}
		i2cstop();
		return 0;
	}
	else return ERR_SLAW;		//写字节命令及器件地址错或对方无应答
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -