📄 lly.c
字号:
/*
函数:TWI_Puts()
功能:I2C总线综合发送函数,向从机发送多个字节的数据
参数:
SlaveAddr:从机地址(7位纯地址,不含读写位)
SubAddr:从机的子地址
SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
*dat:要发送的数据
Size:数据的字节数
返回:
0:发送成功
1:在发送过程中出现异常
说明:
本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
*/
uchar TWI_Puts(unsigned char SlaveAddr,
unsigned int SubAddr,
unsigned char SubMod,
char *dat,
unsigned int Size
)
{
unsigned char i;
char a[3];
//检查长度
if ( Size == 0 ) return 0;
//准备从机地址
a[0] = (SlaveAddr << 1);
//检查子地址模式
if ( SubMod > 2 ) SubMod = 2;
//确定子地址
switch ( SubMod )
{
case 0:
break;
case 1:
a[1] = (char)(SubAddr);
break;
case 2:
a[1] = (char)(SubAddr >> 8);
a[2] = (char)(SubAddr);
break;
default:
break;
}
SubMod++;
Start();
Wait();
if(TestACK()!=START)
{
return 0;
}
for ( i=0; i<SubMod; i++ )
{
Writebyte(a[i]);
Wait();
if(TestACK()!=SLA_W_ACK)
{
return 0;
}
}
//发送数据
do
{
Writebyte(*dat++);
Wait();
if(TestACK()!=SLA_W_ACK)
{
return 0;
}
} while ( --Size != 0 );
//发送完毕,停止I2C总线,并返回结果
Stop();
delay(10);
if ( Size == 0 )
{
return 0;
}
else
{
return 1;
}
}
/*
函数: TWI_Gets()
功能:I2C总线综合接收函数,从从机接收多个字节的数据
参数:
SlaveAddr:从机地址(7位纯地址,不含读写位)
SubAddr:从机的子地址
SubMod:子地址模式,0-无子地址,1-单字节子地址,2-双字节子地址
*dat:保存接收到的数据
Size:数据的字节数
返回:
0:接收成功
1:在接收过程中出现异常
说明:
本函数能够很好地适应所有常见的I2C器件,不论其是否有子地址
当从机没有子地址时,参数SubAddr任意,而SubMod应当为0
*/
uchar TWI_Gets
(
unsigned char SlaveAddr,
unsigned int SubAddr,
unsigned char SubMod,
char *dat,
unsigned int Size
)
{
//定义临时变量
unsigned char i;
uchar a[3];
//检查长度
if ( Size == 0 ) return 0;
//准备从机地址
a[0] = (SlaveAddr << 1);
//检查子地址模式
if ( SubMod > 2 ) SubMod = 2;
//如果是有子地址的从机,则要先发送从机地址和子地址
if ( SubMod != 0 )
{
//确定子地址
if ( SubMod == 1 )
{
a[1] = (char)(SubAddr);
}
else
{
a[1] = (char)(SubAddr >> 8);
a[2] = (char)(SubAddr);
}
//发送从机地址,接着发送子地址
SubMod++;
Start();
Wait();
if(TestACK()!=START)
{
return 0;
}
for ( i=0; i<SubMod; i++ )
{
Writebyte(a[i]);
Wait();
if(TestACK()!=SLA_R_ACK)
{
return 0;
}
}
}
//这里的I2C_Start()对于有子地址的从机是重复起始状态
//对于无子地址的从机则是正常的起始状态
/*Start();
Wait();
if(TestACK()!=START)
{
return 0;
}
//发送从机地址
Writebyte(a[0]+1);
Wait();
if(TestACK()!=SLA_R_ACK)
{
return 0;
}
//接收数据*/
for (;;)
{
*dat++ = TWDR;
TWCR=(1<<TWINT)|(1<<TWEN);
Wait();
if(TestACK()!=DATA_R_ACK)
{
return 0;
}
if ( --Size == 0 )
{
break;
}
}
//接收完毕,停止I2C总线,并返回结果
Stop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -