#include "head.h"
/*===============================================================================
函数名称:iic_start()
函数功能:启动I2C总线子程序
入口参数:
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void iic_start(void)
{
EA=0;
SDA=1; //时钟保持高电平,数据线从高电平到低电平一次跳变,I2C通信开始
delayNOP();
SCL=1;
delayNOP(); //延时5微秒
SDA=0;
delayNOP();
delayNOP();
SCL=0;
}
/*===============================================================================
函数名称:iic_stop()
函数功能:停止I2C总线数据传送子程序
入口参数:
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void iic_stop(void)
{
SDA=0; //时钟保持高电平,数据线从低电平到高电平一次跳变,I2C通信停止
delayNOP();
SCL=1;
delayNOP();
delayNOP();
SDA=1;
delayNOP();
// delayNop();
SCL=0;
EA=1;
}
/*===============================================================================
函数名称:slave_ACK
函数功能:从机发送应答位子程序
入口参数:
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void slave_ACK(void)
{
SDA=0;
delayNOP();
SCL=1;
delayNOP();
delayNOP();
SDA=1;
delayNOP();
SCL=0;
}
/*===============================================================================
函数名称:slave_NOACK
函数功能:从机发送非应答位子程序,迫使数据传输过程结束
入口参数:
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void slave_NOACK(void)
{
SDA=1;
delayNOP();
SCL=1;
delayNOP();
delayNOP();
SDA=0;
delayNOP();
SCL=0;
}
/*===============================================================================
函数名称:check_ACK
函数功能:主机应答位检查子程序
入口参数:
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void check_ACK(void)
{
SDA=1; //将P0.1设置成输入,必须先向端口写1
delayNOP();
SCL=1;
F0=0;
if(SDA==1) //若SDA=1表明非应答位,置位非应答表示F0
F0=1;
delayNOP();
SCL=0;
}
/*===============================================================================
函数名称:IICSendByte
函数功能:发送1B
入口参数:ch
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void IICSenfByte(uchar ch)
{
uchar idata n=8;
while(n--)
{
if((ch&0x80)==0x80) //若要发送的数据最高位为1则发送位1
{
SDA=1;
delayNOP(); //传送位1
SCL=1;
delayNOP();
delayNOP();
SDA=0;
delayNOP();
SCL=0;
}
else
{
SDA=0;
delayNOP(); //否则传送位0
SCL=1;
delayNOP();
delayNOP();
SCL=0;
}
ch=ch<<1;
}
}
/*===============================================================================
函数名称:IICReceiveByte
函数功能:接收1B子程序
入口参数:
出口参数:
返 回 值:接收的数据
注意事项:
==================================================================================*/
uchar IICReceive(void)
{
uchar idata n=8; //从SDA线上读取一个数据B,共8bit
uchar tdata;
while(n--)
{
SDA=1;
SCL=1;
tdata=tdata<<1; //左移一位,或_crol_(temp,1)
if(SDA==1)
tdata=tdata|0x01; //若接受到得位为1,则数据的最后一位置1
else
tdata=tdata&0xfe; //否则数据的最后一位置0
SCL=0;
}
return(tdata);
}
/*===============================================================================
函数名称:writeNByte
函数功能:发送n位数据子程序
入口参数:slave_add为从机地址,n为要发送的数据个数
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void writeNByte(uchar slave_add,uchar n)
{
uchar idata send_data,i=0;
iic_start(); //启动I2C
IICSendByte(slave_add); //发送地址位
check_ACK();
if(F0==1)
{
SystemError=1; //若非应答表明器件错误或已坏,置错误标志位SystemError
return;
}
while(n--)
{
send_data=sendbuf[i++];
IICSendByte(send_data);
check_ACK();
if(F0==1)
{
SystemError=1; //若非应答表明器件错误或已坏,置错误标志位SystemError
return;
}
}
iic_stop();
}
/*===============================================================================
函数名称:ReceiveNByte
函数功能:接收n位数据子程序
入口参数:slave_add为从机地址,n为要接受的数据个数
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void ReceiveNbyte(uchar idata slave_add,uchar n)
{
uchar idata receive_data,i=0;
iic_start();
IICSendByte(slave_add);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
while(n--)
{
receive_data=IICReceiveByte();
receivebuf[i++]=receive_data;
slave_ACK(); //收到1B后发送一个应答位
}
slave_NOACK(); //收到最后1B后发送一个非应答位
iic_stop();
}
//--------函数声明,变量定义------------
#define dev_adrs 0xa0 //1010 0000 定义设备地址
/*===============================================================================
函数名称:writeByte2dev
函数功能:发送1位数据到储存器指定地址
入口参数: address_H,address_L为储存器片内地址,wr_data为要写入该地址的数据
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void writeByte2dev(uchar address_H,uchar address_L,uchar wr_data)
{
iic_start(); //启动I2C
IICSendByte(dev_adrs); //设备地址
check_ACK(); //检查应答位
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(address_H); //片内高8bit地址
check_ACK(); //检查应答位
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(address_L); //片内低8bit地址
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(wr_data);//
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
iic_stop(); //全部发完停止
}
//--------函数声明,变量定义------------
#define dev_adrr 0xa1 //1010 0001 定义设备地址
/*===============================================================================
函数名称:receiveByte2dev
函数功能:接收1位数据从储存器制定地址
入口参数:address_H,address_L为储存器片内地址
出口参数:
返 回 值:
注意事项:
==================================================================================*/
void receiveByte2dev(uchar address_H,uchar address_L,uchar re_data)
{
iic_start(); //启动I2C
IICSendByte(dev_adrr); //设备地址
check_ACK(); //检查应答位
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(address_H); //片内高8bit地址
check_ACK(); //检查应答位
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(address_L); //片内低8bit地址
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
re_data=IICReceiveByte();
slave_NOACK();
iic_stop(); //全部接收完停止
}
/*===============================================================================
函数名称:writePage2dev
函数功能:把sendbuf中的128B,写到AT24C512中以address为起始地址页
入口参数:address_H,address_L为储存器片内地址
出口参数:
返 回 值:
注意事项:
==================================================================================
void writePage2dev(uchar address_H,uchar address_L,uchar wr_data,uchar n)
{
uchar idata send_data,i=0;
iic_start();
IICSendByte(dev_adr);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(address_H);
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(address_L);//
check_ACK();
if(F0==1)
{
SystemError=1;
return;
}
IICSendByte(wr_data);
check_ACK();
IIC.rar_8051_8051 IIC_IIC 封装_iic 多字节_iic多字节
版权申诉
133 浏览量
2022-09-22
20:57:23
上传
评论 1
收藏 24KB RAR 举报
![avatar](https://profile-avatar.csdnimg.cn/fca2fc36c4174e7caf12f1c9ba2c9265_weixin_42657024.jpg!1)
邓凌佳
- 粉丝: 66
- 资源: 1万+
最新资源
- 305建筑结构水电欧式6套(14.5x20.2)\施工图1-11卫生间大样031026.dwg
- 305建筑结构水电欧式6套(14.5x20.2)\施工图1-09楼梯大样031026.dwg
- 基于PCL、C++编写的格网边缘点检测程序与代码
- 苹果cms源码 cms视频源码下载v10影视模板 苹果cms官方采集资源站.zip
- 305建筑结构水电欧式6套(14.5x20.2)\施工图1-1-04C型平面031026.dwg
- 【C语言课设】活动管理系统讲解(完整代码)
- 305建筑结构水电欧式6套(14.5x20.2)\施工图1-1-03总平面031026.dwg
- 探索Linux操作系统:开源世界的核心
- 305建筑结构水电欧式6套(14.5x20.2)\施工图1-1-02构造做法031026.dwg
- 基于Python实现循环神经网络(RNN)的影评情感分类
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
评论0