📄 iic程序.c
字号:
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(c); /*发送数据*/
if(ack==0)return(0);
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向无子地址器件发送多字节数据函数
函数原型: bit ISendStr(uchar sla,ucahr *s,uchar no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,发送内容是s指向的内容,发送no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit ISendStrExt(uchar sla,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向无子地址器件读字节数据函数
函数原型: bit IRcvByte(uchar sla,ucahr *c);
功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
址sla,返回值在c.
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*启动总线*/
SendByte(sla+1); /*发送器件地址*/
if(ack==0)return(0);
*c=RcvByte(); /*读取数据*/
Ack_I2c(1); /*发送非就答位*/
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向有子地址器件读取多字节数据函数
函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
SendByte(sla); /*发送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c(); /*重新启动总线*/
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
/*******************************************************************
向无子地址器件读取多字节数据函数
函数原型: bit ISendStrExt(uchar sla,ucahr *s,uchar no);
功能: 从启动总线到发送地址,读数据,结束总线的全过程.
从器件地址sla,读出的内容放入s指向的存储区,
读no个字节。如果返回1表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bit IRcvStrExt(uchar sla,uchar *s,uchar no)
{
uchar i;
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=RcvByte();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}
/**********************************************
模拟I2C程序 winavr20050214
***********************************************/
# define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/delay.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define bit_is_set(sfr, bit) (_SFR_BYTE(sfr) & _BV(bit))
//DDR PORT
//0 0 in,high
//0 1 in,r
//1 0 out=0
//1 1 out=1
#define sda 0
#define scl 1
#define I2C DDRB
#define I2C_read PINB
#define I2C_set PORTB
#define Set_SDA cbi(I2C,sda)
#define Cls_SDA sbi(I2C,sda)
#define Set_SCL cbi(I2C,scl)
#define Cls_SCL sbi(I2C,scl)
#define SDA_High bit_is_set(I2C_read,sda)
//function declaration
void I2C_Delay(void);
void I2C_Start(void);
void I2C_Stop(void);
unsigned char I2C_Write(unsigned char wb);
unsigned char I2C_Read(unsigned char bEnd);
//*****************************************************
//delay 100us
//*****************************************************
void I2C_Delay(void)
{
_delay_us(100);
}
//*****************************************************
//i2c init
//*****************************************************
void I2C_init(void)
{
//DDR PORT
//0 0 in,high
//0 1 in,r
//1 0 out=0
//1 1 out=1
cbi(I2C_set,sda); //sda=1
cbi(I2C,sda); //sda in
cbi(I2C_set,scl); //scl=1;
cbi(I2C,scl); //scl in
}
//*****************************************************
//i2c start
//*****************************************************
void I2C_Start(void)
{
Cls_SCL;
I2C_Delay();
Set_SDA;
I2C_Delay();
Set_SCL;
I2C_Delay();
Cls_SDA;
I2C_Delay();
Cls_SCL;
I2C_Delay();
}
//*****************************************************
//i2c stop
//*****************************************************
void I2C_Stop(void)
{
Cls_SDA;
I2C_Delay();
Set_SCL;
I2C_Delay();
Set_SDA;
I2C_Delay();
Set_SCL;
I2C_Delay();
}
//*****************************************************
//I2C_Write
//*****************************************************
unsigned char I2C_Write(unsigned char wb)
{
unsigned char i,ack=0;
for(i=0;i<8;i++)
{
if( wb&0x80 ) Set_SDA;
else Cls_SDA;
wb=wb<<1;
I2C_Delay();
Set_SCL;
I2C_Delay();
Cls_SCL;
if(i!=7) I2C_Delay();
}
Set_SDA; //release sda line
I2C_Delay();
Set_SCL;
I2C_Delay();
if( SDA_High ) ack=1; //ack error
Cls_SCL;
I2C_Delay();
return ack;
}
//*****************************************************
//I2C_Read
//*****************************************************
unsigned char I2C_Read(unsigned char bEnd)
{
unsigned char i,mb;
Set_SDA; //release sda line
mb=0;
for(i=0;i<8;i++)
{
mb=mb<<1;
I2C_Delay();
Set_SCL;
I2C_Delay();
if( SDA_High ) mb++;
I2C_Delay();
Cls_SCL;
if(i!=7) I2C_Delay();
}
if( bEnd ) Set_SDA; //end read
else Cls_SDA; //ack
I2C_Delay();
Set_SCL;
I2C_Delay();
Cls_SCL;
I2C_Delay();
Set_SDA;
return mb;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -