⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24cxx.c

📁 可用于任何单片机平台的I2C总线读写程序
💻 C
字号:
#include <REG51.H>                /* special function register declarations   */
#include <stdio.h>                                  /* for the intended 8051 derivative         */
#include <absacc.h>
#include <INTRINS.H>
#include "g_data.h"
#include "24cxx.h"


/***************************************************************************
*名称:e24_start
*功能:24C32的起始位
***************************************************************************/
void e24_start(void)
{
    NOP;
    SDA_H;  
    NOP;
    SCL_H;
    NOP;
    SDA_L;
    NOP;
    SCL_L;
    NOP;
}

/***************************************************************************
*名称:e24_stop
*功能:24C32的终止位
**********************************************************/
void e24_stop(void)
{
    NOP;
    SDA_L;
    NOP;
    SCL_H;
    NOP;
    SDA_H;
    NOP;
    SCL_L;
    NOP;
}

/***************************************************************************
*名称:e24_clock
*功能:24C32的一个时钟
**************************************************************/
void e24_clock(void)
{
    NOP;
    SCL_H;
    NOP;
    NOP;
    SCL_L;
    NOP;
}

/***************************************************************************
*名称:e24_start
*功能:24C32的每个操作阶段后的应答信号
*输出:result-是否成功标志0为成功

***************************************************************************/
uint8 e24_ack(void)
{
    uint8 data result;
    NOP;
    SCL_H;
    SDA_I;
    NOP;
    result = SDA;
    SCL_L;
    NOP;
    return (result);
}

/***************************************************************************
*名称:e24_send
*功能:24C32的发送数据函数
*输入:sen_data,本此需要发送的字节数据
*输出:若操作成功返回1,失败0
***************************************************************************/
uint8 e24_send(uint8 send_data)
{
    uint8 data i;
    for (i = 0; i < 8; i++)
    {
        if ((send_data & 0x80) != 0)
		{
            SDA_H;
		}
        else
		{
            SDA_L;
	    }
        e24_clock();
        send_data <<= 1;
    }
    SDA_H;
    //i = e24_ack();
    if (e24_ack() !=0)
	{
        return(0);
	}
    else
	{
        return(1);
	}
}

/***************************************************************************
*名称:e24_readclock
*功能:24C32的读操作中的位操作
*输入:无
*输出:所读到的SDA上的每一位的数据
***************************************************************************/
uint8 e24_readclock(void)
{
    uint8 data ch;
    NOP;
    SCL_H;
    NOP;
    ch = SDA;
    NOP;
    SCL_L;
    NOP;
    return (ch);
}

/***************************************************************************
*名称:e24_receive
*功能:24C32的读操作的接收部分函数
*输入:无
*输出:read_data-所读到的SDA上的一个字节的数据
***************************************************************************/
uint8 e24_receive(void)
{
    uint8 data read_data,i;
    SDA_I;
    read_data = 0;
    for (i = 0; i < 8; i++)
    {
        read_data*=2;
        if(e24_readclock() != 0)
        read_data++;
    }
    return(read_data);
}

/***************************************************************************
*名称:e24_write
*功能:24C32的写操作
*输入:addr-所写数据的地址,write_data-所要写入的数据
*输出:1-写操作成功,0-写操作失败
*说明:结束前后要分别开WP和关WP
***************************************************************************/
uint8 e24_write(uint16 addr, uint8 write_data)
{
    WP_L;
    e24_start();
    if (e24_send(0xA0))
    {
        if (e24_send(addr/0x100))
        {
		    if (e24_send(addr%0x100))
			{
                if (e24_send(write_data))
                {
                    e24_stop();
                    NOP;
                    return(1);
                }
                else
			    {
                    return(0);
		        }
			}
			else
			{
                return(0);
			}
        }
        else
		{
            return(0);
	    }
    }
    else
	{
        return(0);
    }
	WP_H;
}

/***************************************************************************
*名称:e24_pagewrite
*功能:24C32的按页写操作
*输入:pro_num-所写入的协议对应的序号,data_array-写入数据的指针。
*输出:1-操作成功,0-操作失败
*说明:同单个字节写。
***************************************************************************/
uint8 e24_pagewrite(uint8 pro_num, uint8 * data_array)
{
    uint8 data i, addr_H, addr_L;  //--地址分高低字节存放--
    WP_L;
	//----确定相应的协议对应的存放地址-----
    addr_H = pro_num/8 + 1;
	addr_L = pro_num * 0x20;
    e24_start();
    if (e24_send(0xA0))
    {
        if (e24_send(addr_H))
        {
		    if (e24_send(addr_L))
			{
			    for (i = 0; i < 32; i++)
				{
                    if (e24_send(*(data_array+i)) == 0)
                    {
                        return(0);
                    }
				}
				e24_stop();
                NOP;
                return(1);
			}
			else
			{
                return(0);
			}
        }
        else
		{
            return(0);
	    }
    }
    else
	{
        return(0);
    }
	WP_H;
}

/***************************************************************************
*名称:e24_read
*功能:24C32的读操作
*输入:addr-所读数据的地址
*输出:read_data,读失败,一律为0xff
***************************************************************************/
uint8 e24_read(uint16 addr)
{
    uint8 read_data;
	WP_H;
    e24_start();
    if (e24_send(0xA0))
    {
        if (e24_send(addr/0x100))
        {
		    if (e24_send(addr%0x100))
			{
                e24_start();
                if (e24_send(0xA1))   //--读操作的控制码--
                {
                    read_data = e24_receive();
                    e24_clock();
                    e24_stop();
                    return(read_data);
                }
                else
			    {
                    e24_stop();
			    }
			}
			else
			{
                e24_stop();
			}
        }
        else
		{
            e24_stop();
	    }
    }
    else
	{
        e24_stop();
	}
    return(0xff);
}

/***************************************************************************
*名称:check_flash
*功能:检查并载入flash对于的数据是否有效
***************************************************************************/
void check_flash(void)
{
    uint8 data i, j, k, temp, add_bit, check_sum;
	uint16 data addr;
	for (i = 0; i < 4; i++)
	{
	    ptl_status[i] = 0;
		add_bit = 1;
		for (j = 0; j < 8; j++)
		{
		    addr = 0x100 + 0x100 * i + 0x20 * j;
	        temp = e24_read(addr);
            if ((temp > 0) && (temp <= 16))
		    {
			    check_sum = temp;
			    for (k = 2; k < temp + 2; k++)
				{
                    check_sum += e24_read(addr + k);
				}
				if (check_sum == e24_read(addr + 1))
				{
			        ptl_status[i] += add_bit; 
					//find_buf[i*8 + j] = e24_read(addr + 2);
				}
		    }
			add_bit *= 2;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -