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

📄 93lc46.c

📁 93c46 for msp430 mcu
💻 C
字号:
#include<msp430x14x.h>
#include"bm6500.h"
#include"variable.h"


#define    uchar    unsigned char
#define    uint     unsigned int
/********************************************操作命令配置****************************************/
#define				READ_OP			0XC0					//读操作命令码,命令码只有三位,为方面操作,将其置于高三位,以下命令相同
#define				ERASE_OP		0XE0					//擦除操作
#define				WRITE_OP		0XA0					//写操作
#define				EWEN_OP			0X80					//写使能
#define				EWDS_OP			0X80					//写禁止,操作码与使能相同,后续数据存在差异
#define				ERAL_OP			0X80					//擦除整个存储器,由后续数据区分功能
#define				WRAL_OP			0X80					//将数据写入到全部存储器中。

//操作码定义,各操作码只使用了最前的两位,但由于有些操作码长度超过一个字节,所以统一采用两字节方式表示
#define				EWEN_CODE		0XC000					//写使能操作码
#define				EWDS_CODE		0X0000					//禁止写入操作码
#define				ERAL_CODE		0X8000					//擦除整个芯片操作码
#define				WRAL_CODE		0X4000					//将数据写入到全部存储器操作码

#define				NOP()		   _NOP();//_NOP();_NOP();_NOP()//;_NOP();_NOP();_NOP()	

#define				SET_CS()	    P4OUT |= BIT3 	//置位CS脚。
#define				CLR_CS()	    P4OUT &= ~BIT3	//清零CS脚

#define				SET_DO()	     P4OUT |= BIT1     //置位DO脚
#define				CLR_DO()	     P4OUT &=~BIT1     //清零DO脚。

#define				SET_DI_IN()	     P4DIR &= ~BIT0
    						
#define				READ_DI()	     (P4IN & 0X01)  
		
#define				SET_CLK()	     P4OUT |= BIT2     //置位CLK脚
#define				CLR_CLK()	     P4OUT &= ~BIT2	//清除CLK脚
                              

static void WriteOpCode(uchar );
static void WriteAddrCode(uint );
static void ShiftIn(uchar *pData, uint uiLen);
static void ShiftOut(uchar *pData, uchar ucLen);
static void WaitForRdy(void);

unsigned char  ReadEEPROM(uint uiAddr, uint *pData, uint uiLen);
unsigned char  WriteEEPROM(uint uiAddr, uint *pData, uint uiLen);
void EraseEEPROM(void);

static void WriteOpCode(uchar ucComCode)
{
	uchar i;
	CLR_DO();														//操作起始时,必须确保DO为低,
	CLR_CLK();														//否则可能会引起一次芯片无法识别的误操作,引起操作失败。
	CLR_CS();
	NOP();	
	SET_CS();
	NOP();
	SET_CLK();
	NOP();
	for (i = 0; i < 3; i++)
	{
		CLR_CLK();
		NOP();
		if (ucComCode & 0x80)
		{
			SET_DO();	
		}
		else
		{
			CLR_DO();	
		}	
		ucComCode <<= 1;
		NOP();
		SET_CLK();
		NOP();
	}
}


static void WriteAddrCode(uint uiCode)
{
	uchar i;
	for (i = 0; i < 6; i++)
	{
		CLR_CLK();
		NOP();
		if (uiCode & 0x8000)
		{
			SET_DO();	
		}	
		else
		{
			CLR_DO();	
		}
		uiCode <<= 1;
		NOP();
		SET_CLK();
		NOP();
	} 	
}


/*
 *函数性质:私有
 *入口:待移入的数据缓冲pData, 待移入的数据长度uiLen
 *出口:无
 *功能:将数据缓冲中给定个数的数据移入到存储器中。
 */
static void ShiftIn(uchar *pData, uint uiLen)
{
	uchar i;
	uchar j;
	while(uiLen--)
	{	
		j = *pData;
		for (i = 0; i < 8; i++)
		{
			CLR_CLK();
			NOP();
			if (j & 0x80)
			{
				SET_DO();	
			}	
			else
			{
				CLR_DO();	
			}
			j <<= 1;
			NOP();
			SET_CLK();
			NOP();	
		}
		pData++;	
	}	
}


/*
 *函数性质:私有
 *入口:存放移出的数据缓冲pData, 需要读出的数据个数uiLen
 *出口:无
 *功能:从存储器中读出给定个数的数据到缓冲
 */
static void ShiftOut(uchar *pData, uchar ucLen)
{
	uchar i;
	uchar j;
	SET_DI_IN();
	while(ucLen--)
	{	
		j = 0;
		for (i = 0; i < 8; i++)
		{	
			j <<= 1;
			CLR_CLK();
			NOP();
			SET_CLK();
			NOP();
			if (READ_DI())
			{
				j |= 0x01;	
			}
		}
		*pData++ = j;	
	}	
}


/*
 *函数性质:私有
 *入口:无
 *出口:无
 *功能:等待忙信号结束。
 */
static void WaitForRdy(void)
{
	uint i = 0xffff;
  	NOP();
  	while(i--)
  	{
  		if (READ_DI())
    	{
      		break;
    	}
  	}
}



/*
 *函数性质:公共
 *入口:存储器地址uiAddr, 读得的数据存放缓冲pData, 需要读取的数据长度uiLen.
 *出口:读数据成功标志	true:成功	false:失败
 *功能:从EEPROM中读数据。
 */

unsigned char  ReadEEPROM(uint uiAddr, uint *pData, uint uiLen)
{
	if ( (uiAddr + uiLen) >= 64)
	{
		return 0;							//超出范围	
	} 
	while(uiLen--)
	{
		WriteOpCode(READ_OP);
		WriteAddrCode(uiAddr<<(16 - 6) );
		ShiftOut((uchar *)pData, 2);				//读数据
		CLR_DO();
		CLR_CS();
		CLR_CLK();
		pData++;
		uiAddr++;
	}	
	return 1;		
}




/*
 *函数性质:公共
 *入口:存储器地址uiAddr,待写入的数据缓冲pData, 待写入的数据长度uiLen
 *出口:写数据成功标志, true:写数据成功标志
 *功能:将数据写入到EEPROM中。
 */

unsigned char  WriteEEPROM(uint uiAddr, uint *pData, uint uiLen)
{
	if ( (uiAddr + uiLen) >= 64)
	{
		return 0;						//超出范围	
	}
	WriteOpCode(EWEN_OP);
	WriteAddrCode(EWEN_CODE); 
	CLR_CS();
	NOP();
	SET_CS();
	NOP();NOP();
	while(uiLen--)
	{
		WriteOpCode(WRITE_OP);
		WriteAddrCode(uiAddr<<(16 - 6) );
		ShiftIn((uchar *)pData, 2);
		CLR_CS();
		NOP();
		SET_CS();
		WaitForRdy();
		pData++;
		uiAddr++;
	}
	WriteOpCode(EWDS_OP);
	WriteAddrCode(EWDS_CODE); 
	CLR_CS();
	NOP();
	SET_CS();
	NOP();
	CLR_DO();
	CLR_CS();
	CLR_CLK();
	return 1;					
}

/*
 *函数性质:公共
 *入口:无
 *出口:无
 *功能:擦除整个EEPROM
 */
void EraseEEPROM(void)
{
	WriteOpCode(ERAL_OP);
	WriteAddrCode(ERAL_CODE); 
	CLR_CS();
	NOP();
	SET_CS();
	WaitForRdy();
	CLR_CS();	
	return;
}



void v93LC46RealProcess(void)
{
  
  ReadEEPROM(0x01, read93lc46, 6);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -