I2C操作序2-C程序(包含2 4C02和24C512)

更新时间:2023-05-23 10:47:31 阅读: 评论:0

#include "biangliang.h"
//状态标志位定义
uchar  Bus_Busy;    //总线繁忙
uchar  Abort;    //离开总线
uchar  Txmt_Progress; //发送进度
uchar  Rcv_Progress;  //接收进度
uchar  Txmt_Success;  //发送成功
uchar  Rcv_Success;  //接收成功
uchar  ACK_Error;  //应答错误
//控制标志位定义
uchar  SlaveActive;  //从机活动标志
/
/InitI2CBusMaster
//***************************
//void TxmtStartBit(void)
//函数功能:I2C总线START
//当SCL为高电平时,置SDA下降沿
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
void TxmtStartBit(void)
{
Bus_Busy=1;        //The Bus is busy
SDA=1;          //Set a falling edge in SDA when SCL is high
SCL=1;
nop();
SDA=0;
nop();
SCL=0;          //SCL need to hold on low
}
//***************************
//void TxmtStopBit(void)
//函数功能:I2C总线STOP
/
/当SCL为高电平时,置SDA上升沿
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
void TxmtStopBit(void)
{
SCL=0;         
SDA=0;          //Set a rising edge is SDA when SCL is high
SCL=1;
国防大学分数线nop();
SDA=1;
nop();
Bus_Busy=0;        //The Bus is busy
}
//***************************
//void AbortI2C(void)
//函数功能:空闲I2C总线
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
void AbortI2C(void)
{
TxmtStopBit();      //STOP
Abort=1;          //Set Abort bit
}
//***************************
//void SendData(uchar Data_s)
//函数功能:发送8bit数据
//入口参数:Data_s,所需发送的数据(8bit)
//出口参数:无
//返回值: 无
/
/***************************
void SendData(uchar Data_s)
暴露狂英文{
uchar I2CBitCount;
Txmt_Progress=1;      //in nding
Txmt_Success=0;      //no Success
//发送8个bit,高位在前
for(I2CBitCount=0;I2CBitCount<8;I2CBitCount++)
{
if(Data_s&0x80)      //if high then nd high
SDA=1;
el
SDA=0;        //if low then nd low
SCL=1;          //A falling edge to write the bit
nop();
SCL=0;
nop();
Data_s=Data_s<<1;
}
//收应答
SDA=1;          //A falling edge to receive the ACK
nop();
SCL=1;
nop();
if(SDA)          //if SDA=1 then ACK wrong
{
SDA=1;
SCL=1;
Txmt_Progress=0;   
ACK_Error=1;      //no success
}
el            //if SDA=0 the ACK right
{
SCL=0;
Txmt_Progress=0;
Txmt_Success=1;      //success
ACK_Error=0;
}
}
//***************************
//void TxmtSlaveAddr(uchar SlaveAddr)
//函数功能:发送期间地址
//入口参数:SlaveAddr(读为0xa1,写为0xa0)
//出口参数:无
/
/返回值: 无
//***************************
void TxmtSlaveAddr(uchar SlaveAddr)
{
ACK_Error=0;
Txmt_Success=0;
SendData(SlaveAddr);
if(!Txmt_Success&&ACK_Error) //if no success and ACK wrong
TxmtStopBit();      //如果
失败则发送STOP结束整个流程
}
/
/***************************
//uchar GetData(void)
//函数功能:读取数据
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
uchar GetData(void)
{
uchar I2CBitCount;
uchar Data_G;
Rcv_Progress=1;
Rcv_Success=0;
for(I2CBitCount=0;I2CBitCount<8;I2CBitCount++)
{
Data_G=Data_G<<1;    //shift letf first
SCL=1;          //A rising edge in SCL to read SDA
nop();
if(SDA)
Data_G=Data_G|0x01;
el
Data_G=Data_G&0xFE;
SCL=0;
}
return Data_G;      //return the result
}
//主机应答与不应答
//***************************
//void ACK(void)
//函数功能:主机应答
//入口参数:无
//出口参数:无
//返回值: 无
/
/***************************
void ACK(void)
{
SDA=0;        //A rising edge in SCL to nd a ACK/NACK
nop();        //if SDA=0,then nd ACK
SCL=1;
nop();
SCL=0;        //need to t low when ACK is ok
nop();
SDA=1;        //need to t high when ACK is ok
Rcv_Progress=0;
Rcv_Success=1;
ACK_Error=0;
}
//***************************
//void NACK(void)
//函数功能:主机不应答
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
void NACK(void)
{
SDA=1;        //if SDA=1,then nd NACK
nop();
SCL=1;
nop();
SCL=0;
nop();
SDA=1;
Rcv_Progress=0;
Rcv_Success=1;
ACK_Error=0;
}
//判断从机是否处于活动状态
//***************************
//void IsSlaveActive(void)
//函数功能:判断从机是否处于活动状态
//如果活动,则置位活动
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
void IsSlaveActive(void)
{
TxmtStartBit();
TxmtSlaveAddr(0xa0);  //Write mode
SlaveActive=1;
if(ACK_Error)
SlaveActive=0;    //no Active
TxmtStopBit();      //STOP
}
//***************************
//void IsActive(void)
//函数功能:判断从机是否处于活动状态
/
/如果活动,则跳出,否则循环等待
//入口参数:无
//出口参数:无
//返回值: 无
//***************************
void IsActive(void)
{
SlaveActive=0;
while(!SlaveActive)    //if not Active,check it again
nbstIsSlaveActive();
}
/
/************************************
//24C02/24c512读写子程序
//************************************
//***************************
//uchar Readone_24c02(uchar Addr_L)
//函数功能:从24C02中读取1个字节的数据
//入口参数:需读取数据的地址
//出口参数:读取的数据
//返回值: 读取的数据
//***************************
uchar Readone_24c02(uchar Addr_L)
{
uchar ReadData;
TxmtStartBit();    //START
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
SendData(Addr_L);    //发生需读取的地址
TxmtStartBit();    //START
TxmtSlaveAddr(0xa1);  //发送器件地址(读)
ReadData=GetData();  //读
取1个字节数据
NACK();        //不应答
AbortI2C();      //离开I2C总线
return ReadData;
}
//***************************
//uchar Readone_24c512(uchar Addr_L,uchar Addr_H)
//函数功能:从24C512中读取1个字节的数据
//入口参数:需读取数据的地址
//出口参数:读取的数据
//返回值: 读取的数据
//***************************
秦岭淮河一线是什么的分界线uchar Readone_24c512(uchar Addr_L,uchar Addr_H)
初一英语试题{
uchar ReadData;
TxmtStartBit();    //START
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
SendData(Addr_H);    //发生需读取的地址
SendData(Addr_L);   
TxmtStartBit();    //START
TxmtSlaveAddr(0xa1);  //发送器件地址(读)
ReadData=GetData();  //读取1个字节数据
NACK();        //不应答
AbortI2C();
return ReadData;
}
//***************************
//void Writeone_24c02(uchar Addr_L,uchar W_Data)
//函数功能:向24C02中写1个字节的数据
//入口参数:需写数据的地址
//出口参数:无
//返回值: 无
//***************************
void Writeone_24c02(uchar Addr_L,uchar W_Data)
{
TxmtStartBit();    //START
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
SendData(Addr_L);    //发生需读取的地址 
SendData(W_Data);    //写入数据
AbortI2C();
}
//***************************
//void Writeone_24c512(uchar Addr_L,uchar Addr_H,uchar W_Data)
//函数功能:向24C512中写1个字节的数据
//入口参数:需写数据的地址
//出口参数:无
//返回值: 无
/
/***************************
void Writeone_24c512(uchar Addr_L,uchar Addr_H,uchar W_Data)
phew{
TxmtStartBit();    //START
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
商务英语专业就业方向SendData(Addr_H);
SendData(Addr_L);    //发生需读取的地址 
SendData(W_Data);    //写入数据
AbortI2C();
}
//***************************
/
/void Read_more_24c02(uchar Addr_L,uchar *R_Data,uchar Num)
//函数功能:从24C02中读1串的数据
//入口参数:读取数据的首地址和读取数据的个数
//出口参数:无
//返回值: 无
//***************************
void Read_more_24c02(uchar Addr_L,uchar *R_Data,uchar Num)
{
uchar i_rm;
TxmtStartBit();
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
SendData(Addr_L);    //发生需读取的地址
TxmtStartBit();    //START
湖北大学自考
TxmtSlaveAddr(0xa1);  //发送器件地址(读)
for(i_rm=0;i_rm<Num-1;i_rm++)
{
*(R_Data+i_rm)=GetData;
中国mbaACK();
}
*(R_Data+Num-1)=GetData;
NACK();
AbortI2C();
}
//***************************
//void Read_more_24c512(uchar Addr_L,uchar Addr_H,uchar *R_Data,uchar Num)
//函数功能:从24C512中读1串的数据
//入口参数:读取数据的首地址和读取数据的个数
//出口参数:无
//返回值: 无
//***************************
void Read_more_24c512(uchar Addr_L,uchar Addr_H,uchar *R_Data,uchar Num)
{
uchar i_rm;
TxmtStartBit();
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
Se
ndData(Addr_H);    //发生需读取的地址
SendData(Addr_L);
TxmtStartBit();    //START
TxmtSlaveAddr(0xa1);  //发送器件地址(读)
for(i_rm=0;i_rm<Num-1;i_rm++)
{
*(R_Data+i_rm)=GetData;
ACK();
}
*(R_Data+Num-1)=GetData;
NACK();
AbortI2C();
}
//***************************
//void Write_page_24c02(uchar Addr_L,uchar *W_Data,uchar Num)
//函数功能:向24C02中写1串的数据,但不能超过1页(8个)
//入口参数:写数据的首地址和写数据的个数
//出口参数:无
//返回值: 无
/
/***************************
void Write_page_24c02(uchar Addr_L,uchar *W_Data,uchar Num)
{
uchar i_wp;
TxmtStartBit();
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
SendData(Addr_L);    //发生需读取的地址
for(i_wp=0;i_wp<Num;i_wp++)
{
SendData(*(W_Data+i_wp));
}
AbortI2C();
}
//***************************
//void Write_page_24c512(uchar Addr_L,uchar Addr_H,uchar *W_Data,uchar Num)
//函数功能:向24C02中写1串的数据,但不能超过1页(8个)
//入口参数:写数据的首地址和写数据的个数
//出口参数:无
//返回值: 无
//***************************
void Write_page_24c512(uchar Addr_L,uchar Addr_H,uchar *W_Data,uchar Num)
{
uchar i_wp;
TxmtStartBit();
TxmtSlaveAddr(0xa0);  //发送器件地址(写)
SendData(Addr_H);    //发生需读取的地址
SendData(Addr_L);
achieve的用法for(i_wp=0;i_wp<Num;i_wp++)
{
SendData(*(W_Data+i_wp));
}
AbortI2C();
}

本文发布于:2023-05-23 10:47:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/119474.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:地址   参数   数据   功能   发送   函数   读取   标志
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图