新闻  |   论坛  |   博客  |   在线研讨会
freescale s08 SPI读写at93c46的程序
0750long | 2009-05-13 15:37:42    阅读:2273   发布文章

freescale s08 SPI读写at93c46的程序

 

随便把刚调好的通过SPI接口读写93c46的程序贴出来。我看网上,包括freetech的人也没把这个东西搞完全正确。

 


 

/*****************************
@ Nicrosystem Freescale S08 DevKit(NSS08Kit-R1)
@ author:bluehacker<
nicrosystem@gmail.com>
@ date:2009-04-08
******************************/

/*********************
@AT93C46的驱动
*********************/
#include "at93c46.h"
#include "derivative.h"

#define AT93C46_CS   PTED_PTED4

 

void init_spi()
{
  SPI1C1=0x5c;//CPOL=1,CPHA=1
  SPI1C2=0x00;
  SPI1BR=0x11;//0.5MHZ clock rate
  PTEDD_PTEDD4=1;//output
  AT93C46_CS=1;
}

unsigned char do_spi(unsigned char dat)  {
   
    while(!SPI1S_SPTEF);
    SPI1D=dat;
    while(!SPI1S_SPRF);
    return SPI1D;
}


//等待write或erase操作完成
void wait_finish()        
{
   while(PTED_PTED5==0){
      asm(NOP);
  }
}
//读保存在at93c46存储器中地址为addr处的数据
unsigned char at93c46_read(unsigned char addr)
{
  unsigned char cmd[2];
 
 
  AT93C46_CS=0;
   cmd[0]=0x06;
  cmd[1]=addr<<1;
  AT93C46_CS=1;
   do_spi(cmd[0]);
  do_spi(cmd[1]);
   cmd[0]=do_spi(0); ;
  AT93C46_CS=0;
  return cmd[0]; 
}
 
//使能写/删除操作
void enable_write(void)
{
    unsigned char cmd[2];
 
    AT93C46_CS=0;
    cmd[0]=0x02;
    cmd[1]=0x60;
    AT93C46_CS=1;
    do_spi(cmd[0]);
    do_spi(cmd[1]);
     AT93C46_CS=0;
}

//禁止写/删除操作
void disable_write(void)
{
   unsigned char cmd[2];
 
    AT93C46_CS=0;
    cmd[0]=0x02;
    cmd[1]=0x00;
    AT93C46_CS=1;
    do_spi(cmd[0]);
    do_spi(cmd[1]);
    AT93C46_CS=0;
}

//擦除地址为addr的存储单元
void at93c46_erase(unsigned char addr)
{
  unsigned char cmd[2];
 
  enable_write();
  AT93C46_CS=0;
  cmd[0]=0x03;
  cmd[1]=addr|0x80;
  AT93C46_CS=1;
  do_spi(cmd[0]);
  do_spi(cmd[1]);
  AT93C46_CS=0;
  asm(NOP);
  AT93C46_CS=1;
  wait_finish();
  AT93C46_CS=0;
  disable_write();
}


//往at93c46 addr地址写数据dat
void at93c46_write(unsigned char addr,unsigned char dat)
{
  unsigned char cmd[2];
  
  enable_write();
  AT93C46_CS=0;
  cmd[0]=0x02;
  cmd[1]=addr|0x80;
  AT93C46_CS=1;
  do_spi(cmd[0]);
  do_spi(cmd[1]);
  do_spi(dat);
 
  AT93C46_CS=0;
  asm(NOP);
  AT93C46_CS=1;
  wait_finish();
  AT93C46_CS=0;
  disable_write();
}

//往at93c46所有存储单元写入dat
void at93c46_writeall(unsigned char dat)
{
  unsigned char cmd[2];
 
  enable_write();
  AT93C46_CS=0;
  cmd[0]=0x02;
  cmd[1]=0x20;
  AT93C46_CS=1;
  do_spi(cmd[0]);
  do_spi(cmd[1]);
  do_spi(dat);
 
  AT93C46_CS=0;
  asm(NOP);
  AT93C46_CS=1;
  wait_finish();
  AT93C46_CS=0;
  disable_write();
}

//擦除at93c46
//erase ALL chip
void at93c46_eraseall(void)
{
  unsigned char cmd[2];
 
  enable_write();
  AT93C46_CS=0;
  cmd[0]=0x02;
  cmd[1]=0x40;
  AT93C46_CS=1;
  do_spi(cmd[0]);
  do_spi(cmd[1]);
 
  AT93C46_CS=0;
 
  AT93C46_CS=1;
  wait_finish();
  AT93C46_CS=0;
  disable_write();
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客