📄 24cxx.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 + -