×
单片机 > 单片机程序设计 > 详情

基于AVR单片机的SPI接口的25C256

发布时间:2020-08-25 发布时间:
|
基于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);                                     
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
采用AT89C2051的数字可调稳压电源单片机源程序