📄 rw24cxx.c
字号:
/*
读/写24CXX(xx=01,02,04,08,16...)函数,
CPU:H8/300,晶振:16MHz/2分频,读写速率:150KHz
2000.05.05 韦忠于
BP:(0755)3322666-3080
*/
#include "3334f.h"
#include "840def.h"
#include "840ext.h"
#define INTEST P4.DR.BIT.B6 /* 写保护脚 */
#define INSCL P2.DR.BIT.B7
#define INSDA P4.DR.BIT.B7
#define INSDADDR P4.DDR.BIT.B7 /* SDA的输入/输出控制位 */
#define RD24COMM 0xA1
#define WR24COMM 0xA0
#define AT24C08 /* 写入的芯片为24C08或24C16 */
/*
#define UINT unsigned int
#define UCHAR unsigned char
*/
void rd_24c(UINT addr,UCHAR len,UCHAR *buffer);
void wr_24c(UINT addr,UCHAR len,UCHAR *buffer);
UCHAR byte_read(UINT addr);
void byte_write(UCHAR data,UINT addr);
void delay_2us(void)
{
UCHAR i;
for(i=0;i<2;i++);
}
void begin24(void)
{
INSDADDR=1;
INSCL=0; /* 设置起始位 */
delay_2us();
INSDA=1;
delay_2us();
INSCL=1;
delay_2us();
INSDA=0;
delay_2us();
INSCL=0;
}
void stop24(void)
{
INSDADDR=1;
INSCL=0;
delay_2us();
INSDA=0;
delay_2us();
INSCL=1;
delay_2us();
INSDA=1;
delay_2us();
INSCL=0;
}
void bwr_24c(UCHAR data)
/* 将 data写入 EEPROM */
{
UCHAR i;
INSDADDR=1;
for(i=0;i<8;i++) {
delay_2us();
if(data&0x80) INSDA=1;
else INSDA=0;
data<<=1;
delay_2us();
INSCL=1;
delay_2us();
INSCL=0;
}
}
void romack(void)
{
INSDADDR=0; /* 置输入状态 */
INSCL=0;
delay_2us();
INSCL=1;
delay_2us();
/* if(INSDA) */ /* 检测回应,由此可判断器件是否正确 */
INSCL=0;
delay_2us();
INSDADDR=0; /* SETB INSDA ,SDA这时为输入脚,此句实际上无效 */
}
UCHAR brd_24c(void)
/* 从 EEPROM 中读取一个字节的数据 */
{
UCHAR i;
UCHAR temp=0;
INSDADDR=0; /* put PIN INSDA into input status */
for(i=0;i<8;i++) {
temp<<=1;
delay_2us();
INSCL=1;
delay_2us();
temp|=INSDA;
INSCL=0;
}
return temp;
}
void devack(void)
{
INSDADDR=1;
INSCL=0; /* acknowledge to EEPROM */
delay_2us();
INSDA=0;
delay_2us();
INSCL=1;
delay_2us();
INSCL=0;
delay_2us();
INSDADDR=0; /* SETB INSDA */
}
void devacke(void)
{
INSCL=0; /* acknowledge read end to EEPROM */
delay_2us();
INSDADDR=0; /* SETB INSDA */
delay_2us();
INSCL=1;
delay_2us();
INSCL=0;
delay_2us();
INSDADDR=0; /* SETB INSDA */
}
void delay_5ms(void)
{
UINT i;
for(i=0;i<10000;i++);
}
void wr_addr(UINT addr)
{
UCHAR lo_addr,hi_addr; /* 地址的低、高字节 */
lo_addr=addr;
hi_addr=addr>>8;
begin24();
hi_addr<<=1;
hi_addr&=0x0e; /* 1110 */
hi_addr|=WR24COMM;
bwr_24c(hi_addr);
romack();
bwr_24c(lo_addr);
romack();
}
void rd_24c(UINT addr,UCHAR len,UCHAR *buffer)
/*
读24CXX
addr:起始地址,len:读取长度,buffer:存放字符串的起始地址
*/
{
UCHAR hi_addr; /* 读取地址的低、高字节 */
UCHAR temp,rd_len;
if(!len) return;
hi_addr=addr>>8;
wr_addr(addr);
begin24();
temp=hi_addr;
temp<<=1;
temp&=0x0e;
temp|=RD24COMM;
bwr_24c(temp);
romack();
for(rd_len=0;rd_len<(len-1);rd_len++) {
buffer[rd_len]=brd_24c(); /* read a byte */
devack();
}
buffer[rd_len]=brd_24c();
devacke();
stop24();
}
void wr_24c(UINT addr,UCHAR len,UCHAR *buffer)
/*
写24CXX
addr:起始写入地址
len:写入长度
buffer:需写入的数据
*/
{
UCHAR wr_len;
if(!len) return;
INTEST=0; /* 去掉写保护 */
wr_addr(addr);
for(wr_len=0;wr_len<len;wr_len++) {
bwr_24c(buffer[wr_len]);
romack();
if(wr_len==(len-1)) { /* 写入结束 */
stop24();
delay_5ms();
delay_5ms();
break;
}
addr++;
#ifdef AT24C08 /* 24C08/24C16 */
if((addr & 0x0f) == 0) { /* 另一页开始 */
#else /* 24C01A/24C02/24C04 */
if((addr & 0x07) == 0) { /* 另一页开始 */
#endif
stop24();
delay_5ms();
wr_addr(addr);
}
}
INTEST=1;
}
UCHAR byte_read(UINT addr)
/*
从24CXX中读取一个字符
addr:读取地址
*/
{
UCHAR temp[2];
rd_24c(addr,1,temp);
return temp[0];
}
void byte_write(UCHAR data,UINT addr)
/*
写24CXX
data:需写入的数据
addr:起始写入地址
*/
{
UCHAR temp[2];
temp[0]=data;
wr_24c(addr,1,temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -