📄 93c46.c
字号:
#include "os_cpu.h"
#include "cdef.h"
#include "dos.h"
INT8U Read93c46(INT8U addr);
void Ewen93c46(void);
void Write93c46(INT8U addr, INT8U data);
void Ewds93c46(void);
void Erase93c46(INT8U addr);
void Wral93c46(INT8U data);
void Teral93c46(void);
void pullup_cs(void);
void pulldown_cs(void);
void pulse_sk(void);
void pullup_sk(void);
void pulldown_sk(void);
void pullup_sk(void);
void pullup_di(void);
void pullup_di(void);
void pulldown_di(void);
void startbit(void);
void opcode(INT8U op_code);
void outaddrdata(INT8U mask, INT8U addr);
INT8U readdata(void);
INT8U readfrom93c46(INT8U addr);
void writeto93c46(INT8U addr, INT8U data);
void writestr_93c46(INT8U addr, INT8U *s, INT8U n);
void waitready(void);
//-----------------------------------------------------------------------------------------------------------------
// 93c46读写程序
/*
* Reads data stored in memory, at specified address
* 1. pullup cs to high
* 2. pullup SK to high
* 3. pullup SK to Low
* 4. cpu output 110b and An~A0 , output data changes synchronized
* with the falling edges of serial clock SK
* 5. 93c46 output data on DO, output data changes syschronized
* with rising edges of serial clock SK
*/
INT8U Read93c46(INT8U addr)
{
pullup_cs(); // pullup cs
pullup_sk(); // pullup SK
startbit(); // output a start bit "1"
opcode(2);
outaddrdata(0x40, addr);
return readdata();
}
/*
* Write Enable must precede all programing modes
*/
void Ewen93c46(void)
{
pullup_cs();
pullup_sk();
startbit(); // 开始位 1B
opcode(0); // 操作码 00B
outaddrdata(0x40, 0x60); // 地址 11XXXXXB
pulldown_sk();
pulldown_cs();
}
/*
* Writes memory location An~A0
*/
void Write93c46(INT8U addr, INT8U data)
{
pullup_cs();
pullup_sk();
startbit();
opcode(1);
outaddrdata(0x40, addr);
outaddrdata(0x80, data);
pulldown_cs();
pullup_cs();
waitready(); //while((inport(PDATA0)&DO_93C46_H)!=DO_93C46_H);
pulldown_cs();
}
/*
* Disables all programming instructions
*/
void Ewds93c46(void)
{
pullup_cs();
pullup_sk();
startbit();
opcode(0);
outaddrdata(0x40, 0x00);
pulldown_sk();
pulldown_cs();
}
/*
* Erase memory location An~A0
*/
void Erase93c46(INT8U addr)
{
Ewen93c46();
pullup_cs();
pullup_sk();
startbit();
opcode(3);
outaddrdata(0x40, addr<<1);
pulldown_cs();
pullup_cs();
waitready(); //while((inport(PDATA0)&DO_93C46_H)!=DO_93C46_H);
pulldown_cs();
Ewds93c46();
}
/*
* Write all memory locations
*/
void Wral93c46(INT8U data)
{
Ewen93c46();
pullup_cs();
pullup_sk();
startbit();
opcode(0x00);
outaddrdata(0x40, 0x20);
outaddrdata(0x80, data);
pulldown_cs();
pullup_cs();
waitready(); //while((inport(PDATA0)&DO_93C46_H)!=DO_93C46_H);
pulldown_cs();
Ewds93c46();
}
/*
* Erase all memory locations
*/
void Teral93c46(void)
{
Ewen93c46();
pullup_cs();
pullup_sk();
startbit();
opcode(00);
outaddrdata(0x40, 0x40);
pulldown_cs();
pullup_cs();
waitready(); //while((inport(PDATA0)&DO_93C46_H)!=DO_93C46_H);
pulldown_cs();
Ewds93c46();
}
// pullup 93c46 cs
void pullup_cs(void)
{
outport(OUTPORT, inport(OUTPORT)|CS_93C46_H);
}
// pulldown 93c46 cs
void pulldown_cs(void)
{
outport(OUTPORT, inport(OUTPORT)&CS_93C46_L);
}
// output a pulse at SK pin
void pulse_sk(void)
{
outport(OUTPORT, inport(OUTPORT)&SK_93C46_L);
outport(OUTPORT, inport(OUTPORT)|SK_93C46_H);
outport(OUTPORT, inport(OUTPORT)&SK_93C46_L);
}
// 将SK脚拉高
void pullup_sk(void)
{
outport(OUTPORT, inport(OUTPORT)|SK_93C46_H);
}
// 将SK脚拉低
void pulldown_sk(void)
{
outport(OUTPORT, inport(OUTPORT)&SK_93C46_L);
}
// 将DI脚拉高
void pullup_di(void)
{
outport(OUTPORT, inport(OUTPORT)|DI_93C46_H);
}
// 将DI脚拉低
void pulldown_di(void)
{
outport(OUTPORT, inport(OUTPORT)&DI_93C46_L);
}
// output start bit "1"
void startbit(void)
{
pullup_di(); // output "1"
pulldown_sk();
pullup_sk();
}
// 输出操作码
void opcode(INT8U op_code)
{
pulldown_sk();
if(op_code&2)
pullup_di();
else
pulldown_di();
pullup_sk();
pulldown_sk();
if(op_code&1)
pullup_di();
else
pulldown_di();
pullup_sk();
}
// 输出地址或数据到93C46的DI脚
void outaddrdata(INT8U mask, INT8U addr)
{
while(mask)
{
pulldown_sk();
if(addr&mask)
pullup_di();
else
pulldown_di();
pullup_sk();
mask >>= 1;
}
}
// 从93C46的DO脚读入数据,装配成一个字节
INT8U readdata(void)
{
INT8U retval;
int i;
retval = 0;
for(i=0;i<=8;i++)
{
retval <<= 1;
pullup_sk(); // drive data to DO
pulldown_sk();
if(inport(INPORT)&DO_93C46_H)
retval |= 1;
}
pulldown_cs();
return retval;
}
// 从93C46中读一个字节(8位方式)
INT8U readfrom93c46(INT8U addr)
{
addr<<=1;
Read93c46(addr); // 丢掉高8位
return Read93c46(addr);
}
// 向93C46中写一个字节(8位方式)
void writeto93c46(INT8U addr, INT8U data)
{
addr <<= 1;
Ewen93c46();
Write93c46(addr, data);
Ewds93c46();
}
// 向93C46中写一串数据
void writestr_93c46(INT8U addr, INT8U *s, INT8U n)
{
int i;
Ewen93c46();
for(i=0;i<n;i++)
{
Write93c46((addr<<1), *s++);
addr++;
}
Ewds93c46();
}
// 查询93C46是否READY
void waitready(void)
{
int i;
for(i=0;i<32767;i++)
{
if(inport(INPORT)&DO_93C46_H)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -