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

📄 93c46.c

📁 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 + -