|
- /******************************************************************************************
- 端口定义
- ****************************************************************************************/
- sbit SCL=P2^1; //将串行时钟总线SCL位定义在为P3.4引脚
- sbit SDA=P2^0; //将串行数据总线SDA位定义在为P3.5引脚
- #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B
- #define OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1即为1010 0000B
- /******************************************************************************************
- * 函数名称 :Start
- * 功能描述 : 启动I2C总线
- * 参数 : 无
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void Start()
- {
- SDA = 1; //SDA初始化为高电平“1”
- SCL = 1; //开始数据传送时,要求SCL为高电平“1”
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- SDA = 0; //SDA的下降沿被认为是开始信号
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
- }
- /******************************************************************************************
- * 函数名称 :Stop
- * 功能描述 : 结束I2C总线
- * 参数 : 无
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void Stop()// 停止位
- {
- SDA = 0; //SDA初始化为低电平“0” _n
- SCL = 1; //结束数据传送时,要求SCL为高电平“1”
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- SDA = 1; //SDA的上升沿被认为是结束信号
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- SDA=0;
- SCL=0;
- }
- /******************************************************************************************
- * 函数名称 :TeskAsk
- * 功能描述 : 检测应答位
- * 参数 : 无
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void TestAsk()
- {
- bit ack_bit; //储存应答位
- SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
- //以让SDA线转由接收设备(AT24Cxx)控制
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- SCL = 1; //根据上述规定,SCL应为高电平
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
- ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
- //若送高电平,表示没有接收到,传送异常 结束发送
- SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
- while(ack_bit!=0);
- }
- /******************************************************************************************
- * 函数名称 :SendAsk
- * 功能描述 :发送应答位
- * 参数 : 无
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void SendAsk()
- {
- SCL=0;
- _nop_();
- _nop_();
- SDA=0; //将SDA拉低并持续4.5us以上
- SCL=1;
-
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL=0;
- SDA=1;
- }
- /******************************************************************************************
- * 函数名称 :ReadData
- * 功能描述 :从24CXX里读一个字节
- * 参数 : 无
- * 返回值 : x
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- unsigned char ReadData()
- // 从AT24Cxx移入数据到MCU
- {
- unsigned char i;
- unsigned char x; //储存从AT24Cxx中读出的数据
- for(i = 0; i < 8; i++)
- {
- SCL = 1; //SCL置为高电平
- x<<=1; //将x中的各二进位向左移一位
- x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中
- SCL = 0; //在SCL的下降沿读出数据
- }
- return(x); //将读取的数据返回
- }
- /******************************************************************************************
- * 函数名称 :WriteCurrent
- * 功能描述 :向AT24Cxx的当前地址写入数据
- * 参数 : y (储存待写入的数据)
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
- void WriteCurrent(unsigned char y)
- {
- unsigned char i;
- for(i = 0; i < 8; i++) // 循环移入8个位
- {
- SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S
- //因为传送时高位在前,低位在后
- _nop_(); //等待一个机器周期
- SCL = 1; //在SCL的上升沿将数据写入AT24Cxx
- _nop_(); //等待一个机器周期
- _nop_(); //等待一个机器周期
-
- SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
- y <<= 1; //将y中的各二进位向左移一位
-
- }
- }
- /******************************************************************************************
- * 函数名称 :WriteSet
- * 功能描述 :向AT24Cxx中的指定地址写入数据
- * 参数 :add (储存指定的地址);dat(储存待写入的数据)
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void WriteSet(unsigned char add, unsigned char dat)
- // 在指定地址addr处写入数据WriteCurrent
- {
- Start(); //开始数据传递
- WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
- TestAsk();
- WriteCurrent(add); //写入指定地址
- TestAsk();
- WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据
- TestAsk();
- Stop(); //停止数据传递
- delay(4); //1个字节的写入周期为1ms, 最好延时1ms以上
- }
- /******************************************************************************************
- * 函数名称 :ReadCurrent
- * 功能描述 :从AT24Cxx中的当前地址读取数据
- * 参数 : 无
- * 返回值 : x (储存读出的数据)
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- unsigned char ReadCurrent()
- {
- unsigned char x;
- Start(); //开始数据传递
- WriteCurrent(OP_READ); //选择要操作的AT24Cxx芯片,并告知要读其数据
- TestAsk();
- x=ReadData(); //将读取的数据存入x
- Stop(); //停止数据传递
- return x; //返回读取的数据
- }
- /******************************************************************************************
- * 函数名称 :ReadSet
- * 功能描述 :从AT24Cxx中的指定地址读取数据
- * 参数 : set_addr
- * 返回值 : x
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- unsigned char ReadSet(unsigned char set_addr)
- // 在指定地址读取
- {
- Start(); //开始数据传递
- WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
- TestAsk();
- WriteCurrent(set_addr); //写入指定地址
- TestAsk();
- return(ReadCurrent()); //从指定地址读出数据并返回
- }
- /******************************************************************************************
- * 函数名称 :WritePage
- * 功能描述 :从AT24Cxx中的指定页地址写8字节数据
- * 参数 : address,*s(要写进去的数组首地址)
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void WritePage(unsigned char address,unsigned char *s) //按页写
- {
- unsigned char i;
- Start();
- WriteCurrent(OP_WRITE); //发送控制写字节
- TestAsk();
- WriteCurrent(address); //存储器地址;每次读完之后指针自动加1
- TestAsk();
- for(i=0;i<8;i++) //直接连续写8次,每页含有16个字节
- {
- WriteCurrent(*s);
- TestAsk();
- s++;
- }
- Stop();
- delay(4); //1个字节的写入周期为1ms, 最好延时1ms以上
- }
- /******************************************************************************************
- * 函数名称 :ReadPage
- * 功能描述 :从AT24Cxx中的指定页地址读取8字节数据
- * 参数 : address,tmp[](存放读出来的数据)
- * 返回值 : 无
- * 创建日期 :2010-11-25
- * 作者 :zzj
- * 全局变量 :
- * 全局静态变量:
- * 局部静态变量:
- *----------------------------------------修改历史------------------------------------------
- * 当前版本 : 修改人: 修改日期:
- * 修改说明 :
- ******************************************************************************************/
- void ReadPage(unsigned char address,unsigned char tmp[]) //按页读取、可以连续读,不需要按页读
- {
- unsigned char i;
- Start();
- WriteCurrent(OP_WRITE); //发送控制写字节
- TestAsk();
- WriteCurrent(address); //存储器地址;每次读完之后指针自动加1
- TestAsk();
- Start();
- WriteCurrent(OP_READ); //选择要操作的AT24Cxx芯片,并告知要读其数据
- TestAsk();
- tmp[0]=ReadData();
- for(i=1;i<8;i++)
- {
- SendAsk();
- tmp[i]=ReadData();
- } /**/
- Stop();
- }
复制代码
|
|