?? sube2p.c
字號:
/************ **********************************/
/* E2_PROM娭楢張棟 */
/* 2003.04.20 */
/*************************************************/
#include "global.h"
#include "H8S2144.h"
#include "Extern.h"
#include "Data.h"
// PS.h偱愰尵偟傑偡 #define DELIM 13 // 僨儕儈僞僐乕僪偺愰尵
#define E2P_IO (*((volatile unsigned char *)0xffffbf)) //E2P24 Addr
#define E2P_CLK 0x04 /* EP_ROM CLK僐乕僪 */
#define E2P_IN 0x02 /* EP_ROM IN DATA僐乕僪 */
#define E2P_OUT 0x01 /* EP_ROM OUT DATA僐乕僪*/
#define MSK_CLKOFF 0xfb /* E2P_CLK reset */
#define MSK_INOFF 0xfd /* E2P_IN reset */
#define MSK_OUTOFF 0xfe /* E2P_OUT reset */
#define MSK_E2POFF 0xf8 /* E2P_ALL reset */
void e2prom_rd_pro();
void e2prom_wt_pro(); /* E2_PROM 彂崬傒 張棟 */
void e2p_bytout(unsigned char); /* 1 僶僀僩忋埵傾僪儗僗僨乕僞弌椡 */
void e2p_bytin(unsigned char *); /* 1 僶僀僩撉崬傒 */
void bit_in_e2p(unsigned char *) ; /* bit data in */
void bit_out_e2p(unsigned char); /* uchr 弌椡 */
void ack_chk() ; /* ack 懸偪 */
void mk_pls_wide(); /* 儗儀儖暆妋曐 */
void wait_e2p(); /* 5 mA wait */
/* E2_PROM 儕乕僪 張棟 */
void e2prom_rd_pro()
{
unsigned char ichr,jchr;
long iconv;
unsigned short *adrs_base;
unsigned char *const_adr1, *const_adr2;
short i,j,k,m,n;
adrs_base = &(const_start);
const_adr1 = (unsigned char *)adrs_base; /* 曗惓抣傾僪儗僗 */
adrs_base = &const_end;
const_adr2 = (unsigned char *)adrs_base; /*僄儕傾廔椆 */
iconv = const_adr2 - const_adr1; /* 僄儕傾廔椆 - 曗惓抣愭摢 */
k = (iconv / (long)16 ) + 1; /* 16僶僀僩扨埵屄悢 */
intmask(2); /* 俶俵俬埲奜妱傝崬傒嬛巭 */
n = 0; /* e2p_rom 奿擺愭摢傾僪儗僗 */
for ( i=0;i< k; i++ )
{
/* 奐巒忣曬弌椡 */
ichr = 0;
ichr |= E2P_CLK;
ichr |= E2P_OUT ; /* CLK,OUT H */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_OUTOFF; /* CLK H,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_E2POFF; /* CLK L,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
m = (n >> 7 ) & 0x0e; /* upper byte, 3bit */
jchr = 0xa0 | (unsigned char)m; /* id ,upper adrs */
e2p_bytout(jchr); /* 1 僶僀僩忋埵傾僪儗僗僨乕僞弌椡 */
jchr = (unsigned char)(n & 0x0ff); /* 壓埵傾僪儗僗僙僢僩 */
e2p_bytout(jchr); /* 1 僶僀僩壓埵傾僪儗僗僨乕僞弌椡 */
/* 奐巒忣曬弌椡 */
ichr = 0 ; /* CLK l ,OUT H */
ichr |= E2P_OUT ; /* CLK l ,OUT H */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr |= E2P_CLK; /* CLK ,OUT H */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_OUTOFF; /* CLK H,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr = 0x0; /* CLK,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
m = (n >> 7 ) & 0x07; /* upper byte, 3bit */
jchr = 0xa1 | (unsigned char)m; /* slave 憲怣巜掕僙僢僩 id ,upper adrs */
e2p_bytout(jchr); /* 1 僶僀僩忋埵傾僪儗僗僨乕僞弌椡 */
// const_adr1 += (long)n; /* 曗惓抣傾僪儗僗 峏怴 */
for (j=0; j<15;j++)
{
e2p_bytin(&jchr); /* 1 僶僀僩撉崬傒 */
*const_adr1++ = jchr; /* 曐懚 */
ichr = 0x0; /* CLK,OUT L */
bit_out_e2p(ichr); /* 1價僢僩弌椡 */
}
e2p_bytin(&jchr); /* 1 僶僀僩撉崬傒 */
*const_adr1++ = jchr; /* 16 僶僀僩栚 曐懚 */
ichr = E2P_OUT ; /* CLK l ,OUT H ack */
bit_out_e2p(ichr); /* 1價僢僩弌椡 */
ichr = 0x0; /* CLK L ,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr |= E2P_CLK; /* CLK H,OUT L ,STOP OUT */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr |= E2P_OUT; /* CLK ,OUT H , D/A load,strb on */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
wait_e2p(); /* 5 mA wait */
n += 16; /* 16 byte 傾僪儗僗峏怴 */
}
intmask(0); /* 慡妱崬傒嫋壜 */
}
void e2prom_wt_pro() /* E2_PROM 彂崬傒 張棟 */
{
unsigned char ichr,jchr;
long iconv;
unsigned short *adrs_base;
unsigned char *const_adr1, *const_adr2;
short i,j,k,m,n;
adrs_base = &(const_start);
const_adr1 = (unsigned char *)adrs_base; /* 曗惓抣傾僪儗僗 */
adrs_base = &const_end;
const_adr2 = (unsigned char *)adrs_base; /*僄儕傾廔椆 */
iconv = const_adr2 - const_adr1; /* 僄儕傾廔椆 - 曗惓抣愭摢 */
k = (iconv / (long)16 ) + 1; /* 16僶僀僩扨埵屄悢 */
intmask(2); /* 俶俵俬埲奜妱傝崬傒嬛巭 */
n = 0; /* e2p_rom 奿擺愭摢傾僪儗僗 */
for ( i=0; i< k; i++ )
{
/* 奐巒忣曬弌椡 */
ichr = 0;
ichr |= E2P_CLK ;
ichr |= E2P_OUT ; /* CLK,OUT H */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_OUTOFF; /* CLK H,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_E2POFF; /* CLK L,OUT L */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
m = (n >> 7 ) & 0x07; /* upper byte, 3bit */
jchr = 0xa0 | (unsigned char)m; /* id ,upper adrs */
e2p_bytout(jchr); /* 1 僶僀僩忋埵傾僪儗僗僨乕僞弌椡 */
jchr = (unsigned char)(n & 0x0ff); /* 壓埵傾僪儗僗僙僢僩 */
e2p_bytout(jchr); /* 1 僶僀僩壓埵傾僪儗僗僨乕僞弌椡 */
// const_adr1 += (long)n; /* 曗惓抣傾僪儗僗 峏怴 */
for (j=0; j<16;j++) {
jchr = *(const_adr1)++; /* 彂崬傒 僨乕僞庢弌偟 */
e2p_bytout(jchr); /* 1 僶僀僩彂崬傒 */
}
ichr = 0x0; /* CLK L ,OUT L ack弌椡 */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr |= E2P_CLK; /* CLK H,OUT L ,STOP OUT */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr |= E2P_OUT; /* CLK ,OUT H , D/A load,strb on */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
wait_e2p(); /* 1 mA wait */
n += 16; /* 16 byte 傾僪儗僗峏怴 */
}
intmask(0); /* 慡妱崬傒嫋壜 */
}
void e2p_bytin(unsigned char *uchr) /* 1 僶僀僩撉崬傒 */
{
unsigned char ichr,jchr, kchr;
short i;
jchr = 0x80;
ichr = 0;
for(i=0;i<8;i++)
{
bit_in_e2p(&kchr); /* bit data in */
if (kchr) {
ichr |= jchr;
}
jchr >>= 1;
}
while(1) {
kchr = E2P_RSIN;
// kchr = E2P_IO;
kchr &= E2P_IN;
if (kchr == 0) { //if(kchr!=0)
break;
}
}
*uchr = ichr; /* 侾僶僀僩僨乕僞僙僢僩 */
}
void bit_in_e2p(unsigned char *kr) /* bit data in */
{
unsigned char ichr,jchr;
short i,j;
ichr = 0;
ichr |= E2P_CLK ;
ichr |= E2P_OUT ;
E2P_IO = ichr;
for(i=0;i<5;i++) {j++;}
jchr = E2P_RSIN ;
// jchr = E2P_IO ;
jchr &= E2P_IN;
ichr &= MSK_CLKOFF;
E2P_IO = ichr;
*kr = jchr; /* 僨乕僞曐懚 */
mk_pls_wide(); /* 儗儀儖暆妋曐 */
}
void e2p_bytout(unsigned char uchr) /* 1 僶僀僩 僨乕僞弌椡 */
{
unsigned char ichr, jchr;
short i;
jchr = 0x80;
for(i=0; i<8; i++) {
ichr = 0x0; /* */
if (uchr & jchr) {
ichr |= E2P_OUT; /* E2P OUT 僨乕僞 俷俶僙僢僩 */
}
bit_out_e2p(ichr); /* ichr 弌椡 */
jchr >>= 1;
}
ack_chk(); /* ack 懸偪 */
}
void bit_out_e2p(unsigned char uchr) /* uchr 弌椡 */
{
unsigned char ichr;
ichr = uchr;
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr |= E2P_CLK; /* CLOCK H 弌椡 */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_CLKOFF; /* CLOCK L 弌椡 */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
}
void ack_chk() /* ack 懸偪 */
{
unsigned char ichr;
ichr = E2P_OUT; /*E2P OUT on */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
while(1)
{
if(( E2P_IO & E2P_IN) == 0) { /* ACK receiv */
// if(( E2P_RSIN & E2P_IN) == 0) { /* ACK receiv */
break;
}
}
// xu ????
ichr |= E2P_CLK; /*E2P CLOCK on, D/A load,strb on */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
ichr &= MSK_CLKOFF; /*E2P CLOCK off, D/A load,strb on */
E2P_IO = ichr;
mk_pls_wide(); /* 儗儀儖暆妋曐 */
}
void mk_pls_wide() /* 儗儀儖暆妋曐 */
{
short i;
long ilong;
for (ilong= 0; ilong < 20; ilong++)
{
i++;
}
}
void wait_e2p() /* 5 mA wait */
{
short i;
long ilong;
for (ilong= 0; ilong < 13000; ilong++)
{
i++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -