📄 i2c.c
字号:
#include "i2c.h"
/**********************************************************************************
(1) void StartIIC(void)
(2) 函数功能:启动IIC总线
(3) 入口参数:void
(4) 出口参数:void
(5) 修改的外部变量(全局变量) 说明
(6) 修改人 修改日期
(7) 修改内容
*********************************************************************************/
void StartIIC(void)
{
SCL = 1;//将时钟线置高
_nop_();
_nop_();//稳定时间2uS
SDA = 1;//将数据线置高
_nop_();
_nop_();//稳定时间2uS
SDA = 0;//将数据线置低
_nop_();
_nop_();
_nop_();
_nop_();//启动时间4uS
SCL = 0;//将时钟线置低
_nop_();
_nop_();//稳定时间2uS
}
/**********************************************************************************
(1) void StopIIC(void)
(2) 函数功能:停止IIC总线
(3) 入口参数:void
(4) 出口参数:void
(5) 修改的外部变量(全局变量) 说明
(6) 修改人 修改日期
(7) 修改内容
*********************************************************************************/
void StopIIC(void)
{
SDA=0; /*发送结束条件的数据信号*/
_nop_(); /*发送结束条件的时钟信号*/
SCL=1; /*结束条件建立时间大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1; /*发送I2C总线结束信号*/
_nop_();
_nop_();
_nop_();
_nop_();
}
/**********************************************************************************
(1) void AckIIC(bit bAckFlag)
(2) 函数功能:主控器应答信号
(3) 入口参数:bAckFlag=0-ACK,bAckFlag=1-NACK.
(4) 出口参数:void
(5) 修改的外部变量(全局变量) 说明
(6) 修改人 修改日期
(7) 修改内容
*********************************************************************************/
void AckIIC(bit bAckFlag)
{
SDA = bAckFlag;
_nop_();//稳定时间1uS
SCL =1;//时钟置高
_nop_();
_nop_();
_nop_();//稳定时间3uS
SCL =0;//时钟置低
_nop_();//稳定时间1uS
SDA = 1;//将数据线置高
}
/**********************************************************************************
(1) unsigned char SendOneByte(unsinged char ucByte)
(2) 函数功能:IIC总线发送一个字节
(3) 入口参数:要写的字节ucByte.
(4) 出口参数:ACK-return 0,NACK-return 1.
(5) 修改的外部变量(全局变量) 说明
(6) 修改人 修改日期
(7) 修改内容
*********************************************************************************/
unsigned char SendOneByte(unsigned char ucSendByte)
{
unsigned char ucBitCount;
unsigned char ucReturnByte;
for(ucBitCount=0; ucBitCount<8; ucBitCount++)
{
if(ucSendByte&0x80) SDA = 1;//数据位为高
else SDA = 0;//数据位为低
do
{
_nop_();//稳定时间1uS
SCL = 1;//时钟置高
_nop_();//稳定时间1uS
}
while(!SCL);//时钟信号被钳位
//_nop_();_nop_();//稳定时间2uS
SCL = 0;//时钟置低
//_nop_();//稳定时间1uS
ucSendByte <<= 1;//发送字节左移一位
}
SDA = 1;//数据线置高,准备检测应答信号
_nop_();//稳定时间1uS
SCL = 1;//时钟置高
_nop_();_nop_();//稳定时间2uS
if(SDA) ucReturnByte = 0x01;
else ucReturnByte = 0x00;
SCL = 0;//时钟置低
_nop_();_nop_();//稳定时间2uS
return (ucReturnByte);
}
/**********************************************************************************
(1) unsigned char ReceiveOneByte(void)
(2) 函数功能:IIC总线接收一个字节
(3) 入口参数:void
(4) 出口参数:接收到的字节
(5) 修改的外部变量(全局变量) 说明
(6) 修改人 修改日期
(7) 修改内容
*********************************************************************************/
unsigned char ReceiveOneByte(void)
{
unsigned char ucBitCount;
unsigned char ucReceiveByte;
SDA = 1;//置数据线为输入方式
for(ucBitCount=0; ucBitCount<8; ucBitCount++)
{
SCL = 0;//时钟置低
_nop_();//稳定时间1uS
SCL = 1;//时钟置高
_nop_();//稳定时间1uS
ucReceiveByte <<= 1;//左移一位,LSB=0.
if(SDA) ucReceiveByte += 1;//如果SDA=1,LSB=1.
}
SCL = 0;//时钟置低
return(ucReceiveByte);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -