原创 freescale s08 SPI读写at93c46的程序

2010-7-15 15:21 5729 10 13 分类: MCU/ 嵌入式

随便把刚调好的通过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();
}


 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户829244 2010-7-12 22:17

//读保存在at93c46存储器中地址为addr处的数据 unsigned char at93c46_read(unsigned char addr) { unsigned char cmd[2]; AT93C46_CS=0; cmd[0]=0x06; cmd[1]=addr<<1; //--------------------------------------- 楼主,为什么不能这样呢?个人认为这样更合理点 cmd[0]=0x03; cmd[1]=addr; //--------------------------------------- AT93C46_CS=1; do_spi(cmd[0]); do_spi(cmd[1]); cmd[0]=do_spi(0); ; AT93C46_CS=0; return cmd[0]; }

用户1361860 2010-3-17 09:32

没有时钟,通常是你没配置对spi模块,比如fsl的spi模块很多是需要先对GPIO模块配置,选择对应的引脚给SPI使用(比如MISO,MOSI之类);一般复位后,默认这些引脚都是GPIO。接收数据出错,如果时钟有的话,那通常就是SPI模式设置不对,一共4种模式,真不行就挨个试

用户239839 2010-3-15 13:48

你好,我最近在用freescale的片子,可是在用SPI功能和其他片子通信的时候,发现接收不到数据,而且也没有时钟,能否指点下?

用户161636 2008-7-17 10:23

真不错 呵呵呵 喜欢你的文章 期待与你成为朋友QQ394506918
相关推荐阅读
用户1361860 2012-06-28 23:44
Nicrosystem Freescale Kinetis教程---SDHC
这是研究生翻译的SDHC的中文文档,里面很多句子不通,但我现在没时间去修改了。先放出来,应该还是会有一点作用  ...
用户1361860 2012-06-26 12:39
Nicrosystem Freescale Kinetis教程--低功耗定时器
Freescale Kinetis内部集成了一个独特的低功耗定时器,它可以在系统处于低功耗模式下,仍然以极低功耗运行,可以用于在适当时候唤醒系统进入正常工作模式  ...
用户1361860 2012-06-24 22:11
Nicrosystem Freescale Kinetis教程----RTC实时时钟
Nicrosystem的飞思卡尔kinetis教程之片上RTC  ...
用户1361860 2012-06-22 10:21
TI C2000微控制器指南
这是官方的C2000的介绍,C2000做电机控制那是业界最好的。  ...
用户1361860 2012-06-20 23:52
Nicrosystem Freescale Kinetis教程--PIT定时器教程
这是PIT定时器的教程,PIT是 Kinetis支持的另一种定时器,相对于上一讲的flextimer要简单。 今晚赶到北京,到宾馆发一篇博客  ...
用户1361860 2012-06-19 13:15
Nicrosystem Freescale Kinetis教程--Flextimer教程
Kinetis的Flextimer定时器教程 kinetis集成了众多功能各异的定时器,flextimer是其中最为复杂的一个  ...
我要评论
3
10
关闭 站长推荐上一条 /3 下一条