📄 93lc46.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 + -