📄 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 + -