基于AVR单片机的SPI接口的25C256(EEPROM)的驱动程序
/**********************************硬件宏定义***********************************/
#define SelectMemory1() (PORTA&=~0X01)
#define DeselectMemory1() (PORTA|=0X01)
#define ClrHoldMemory1() (PORTA&=~(0X01<<2))
#define SetHoldMemory1() (PORTA|=(0X01<<2))
/***********************************初始化SPI***********************************/
void SPI_Masterinit(void)
{
PORTB&=~(0x01<<6); //set bit MISO
PORTB&=~0xa0; // clear bits MOSI, & SCK
DDRA=0xff;
DDRB|=0xa0; // Set SCK, MOSI & SS as outputs
//SPCR=BIT(MSTR)|BIT(SPR1)|BIT(CPOL)|BIT(CPHA);
SPSR=0x01;
}
/*****************************SPI数据传递函数***********************************/
void SPI_WriteByte(unsigned char data)
{
SPDR = data; // 启动数据传输
while(!(SPSR & (1<
}
unsigned char SPI_ReadByte(void)
{
SPDR = 0x00;
while(!(SPSR & (1<
return SPDR; //返回数据
}
/******************************25C256初始化*************************************/
void eeprom_Init(void)
{
SetHoldMemory1();
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x06);
DeselectMemory1(); //取消片选eeprom
}
/*******************************读字节函数**************************************/
unsigned char ReadData(unsigned int address)
{
unsigned char buffer;
unsigned char addressH;
unsigned char addressL;
addressH =((unsigned char *)&address)[1]; //取出双字节的高8位
addressL =((unsigned char *)&address)[0]; //取出双字节的低8位
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x03); //发送读eeprom指令
SPI_WriteByte(addressH); //发送地址高8位
SPI_WriteByte(addressL); //发送地址低8位
buffer=SPI_ReadByte(); //接受8位的数据
DeselectMemory1(); //取消片选eeprom
return buffer;
}
/*****************************写字节函数****************************************/
void WritEDAta(unsigned int address,unsigned char data)
{
unsigned char addressH;
unsigned char addressL;
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x06); //写使能
DeselectMemory1(); //取消片选eeprom
addressH =((unsigned char *)&address)[1]; //取出双字节的高8位
addressL =((unsigned char *)&address)[0]; //取出双字节的低8位
SelectMemory1(); //片选eeprom
SPI_WriteByte(0x02); //发送写eeprom指令
SPI_WriteByte(addressH); //发送地址高8位
SPI_WriteByte(addressL); //发送地址低8位
SPI_WriteByte(data); //发送8位的数据
DeselectMemory1(); //取消片选eeprom
delay_ms(5);
}