/************************************************************************************/
// 引用外部头文件
#include <SST89x5x4.H>
#include <INTRINS.H>
#include "i2c_driver.h"
/************************************************************************************/
void I2c_Start(void)
{
SDA=1; /*发送起始条件的数据信号*/
_nop_();
SCL=1;
DELAY5US(); /*起始条件建立时间大于4.7us,延时*/
SDA=0; /*发送起始信号*/
DELAY5US(); /* 起始条件锁定时间大于4μs*/
SCL=0; /*钳住I2C总线,准备发送或接收数据 */
_nop_();
_nop_();
}
/************************************************************************************/
void I2c_Stop(void)
{
SCL=0;
SDA=0; /*发送结束条件的数据信号*/
_nop_(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
DELAY5US();
SDA=1; /*发送I2C总线结束信号*/
DELAY5US();
}
/************************************************************************************/
bool WaitAck(void)
{
uchar errtime=255;//因故障接收方无ACK,超时值为255。
SDA=1;DELAY5US();
SCL=1;DELAY5US();
while(SDA)
{ errtime--;
if (!errtime)
{ I2c_Stop();
return false;
}
}
SCL=0;
return true;
}
/************************************************************************************/
void SendAck(void)
{
SDA=0; DELAY5US();
SCL=1; DELAY5US();
SCL=0;_nop_();_nop_();
}
/************************************************************************************/
void SendNotAck(void)
{
SDA=1; DELAY5US();
SCL=1; DELAY5US();
SCL=0;_nop_();_nop_();
}
/*******************************************************************
字节数据发送函数
函数原型: void I2c_SendByte(uchar c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答
********************************************************************/
void I2c_SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
{
SCL=0;_nop_();
if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*////////////////////////////////////////////
else SDA=0;
_nop_();
SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
DELAY5US(); /*保证时钟高电平周期大于4μs*/
}
SCL=0;
_nop_();
_nop_();
}
/*******************************************************************
字节数据接收函数
函数原型: uchar I2c_RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
********************************************************************/
uchar I2c_RcvByte(void)
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; /*置数据线为输入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
_nop_();
SCL=0; /*置时钟线为低,准备接收数据位*/
DELAY5US(); /*时钟低电平周期大于4.7μs*/
SCL=1; /*置时钟线为高使数据线上数据有效*/
_nop_();
_nop_();
retc=retc<<1;
retc|=SDA; /*读数据位,接收的数据位放入retc中 */
_nop_();
_nop_();
}
SCL=0;
_nop_();
_nop_();
return retc;
}
/*******************************************************************
向有子地址器件发送多字节数据函数
函数原型: bit I2c_SendStr(uchar sla,uchar suba,uchar *s,uchar no);
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
如果返回true表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bool I2c_SendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
I2c_Start(); /*启动总线*/
I2c_SendByte(sla); /*发送器件地址*/
if(!WaitAck())return false;
I2c_SendByte(suba); /*发送器件子地址*/
if(!WaitAck())return false;
for(i=0;i<no;i++)
{
I2c_SendByte(*s); /*发送数据*/
if(!WaitAck())return false;
s++;
}
I2c_Stop(); /*结束总线*/
return true;
}
/*******************************************************************
向有子地址器件读取多字节数据函数
函数原型: bit I2c_SendStr(uchar sla,uchar suba,uchar *s,uchar no);
功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
如果返回true表示操作成功,否则操作有误。
注意: 使用前必须已结束总线。
********************************************************************/
bool IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
I2c_Start(); /*启动总线*/
I2c_SendByte(sla); /*发送器件地址*/
if(!WaitAck())return false;
I2c_SendByte(suba); /*发送器件子地址*/
if(!WaitAck())return false;
I2c_Start();
I2c_SendByte(sla+1);
if(!WaitAck())return false;
for(i=0;i<no-1;i++)
{
*s=I2c_RcvByte(); /*发送数据*/
SendAck(); /*发送应 答位*/
s++;
}
*s=I2c_RcvByte();
SendNotAck(); /*发送非应位*/
I2c_Stop(); /*结束总线*/
return true;
}
pcf.rar_pcf
版权申诉
54 浏览量
2022-09-21
07:21:37
上传
评论
收藏 102KB RAR 举报
weixin_42653672
- 粉丝: 93
- 资源: 1万+
最新资源
- Code for the complete guide to tkinter tutorial
- 关于百货中心供应链管理系统.zip
- SimpleFolderIcon-master 修改Unity的Project下的文件夹图标
- A python Tkinter widget to display tile based maps
- A pure Python library for adding tables to a Tkinter application
- Vector资源文件.zip
- MobaXterm-Installer
- MicroMsg.xlsx
- 88-520告白(520气球).zip
- HTML+CSS+JS精品网页模板H126.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈