SPI总线驱动的C语言源代码详细概述

电子说

1.3w人已加入

描述

  SPI总线驱动源程序 默认11.0592Mhz的晶振。

  /*通用93c06-93c86系列使用说明

  93c06=93c4693c56=93c6693c76=93c86*/

  //dipx 可以自行定义

  #i nclude 《AT89X52.H》

  #i nclude “intrins.h”

  /*-----------------------------------------------------

  SPI93cXX系列时序函数调用(普通封装)

  调用方式:自行定义﹫2001/05/12

  函数说明:私有函数,封装各接口定义

  -----------------------------------------------------*/

  /*#define di_93 dip3

  #define sk_93 dip2

  #define cs_93 dip1

  #define do_93 dip4

  #define gnd_93 dip5

  #define org_93 dip6*/

  sbit cs_93=0xA3;

  sbit sk_93=0xA4;

  sbit di_93=0xA5;

  sbit do_93=0xA6;

  sbit org_93=0xA7;

  /*

  sbit spi_cs = 0xA3;

  sbit spi_sk = 0xA4;

  sbit spi_di = 0xA5;

  sbit spi_do = 0xA6;

  sbit spi_org = 0xA7;*/

  /*-----------------------------------------------------

  SPI93cXX系列时序函数调用(普通封装)

  调用方式:void high46(void) ---高8位函数调用

  void low46(void) ---低8位函数调用﹫2001/05/12

  函数说明:私有函数,SPI专用93c46普通封装驱动程序

  -----------------------------------------------------*/

  void high46(void)

  {

  di_93=1;

  sk_93=1;

  _nop_();

  sk_93=0;

  _nop_();

  }

  void low46(void)

  {

  di_93=0;

  sk_93=1;

  _nop_();

  sk_93=0;

  _nop_();

  }

  void wd46(unsigned char dd)

  {

  unsigned char i;

  for (i=0;i《8;i++)

  {

  if (dd》=0x80)

  high46();

  else

  low46();

  dd=dd《《1;

  }

  }

  unsigned char rd46(void)

  {

  unsigned char i,dd;

  do_93=1;

  for (i=0;i《8;i++)

  {

  dd《《=1;

  sk_93=1;

  _nop_();

  sk_93=0;

  _nop_();

  if (do_93)

  dd|=1;

  }

  return(dd);

  }

  /*-----------------------------------------------------

  SPI93cXX系列时序函数调用(特殊封装)

  调用方式:自行定义﹫2001/05/12

  函数说明:私有函数,特殊封装各接口定义

  -----------------------------------------------------

  #define di_93a dip5

  #define sk_93a dip4

  #define cs_93a dip3

  #define do_93a dip6

  #define gnd_93a dip7

  #define vcc_93a out_vcc(2)

  sbit cs_93a=P1^0;

  sbit sk_93a=P1^1;

  sbit di_93a=P1^2;

  sbit do_93a=P1^3;

  /*-----------------------------------------------------

  SPI93cXX系列时序函数调用(特殊封装)

  调用方式:void high46a(void) ---高8位函数调用

  void low46a(void) ---低8位函数调用﹫2001/05/12

  函数说明:私有函数,SPI专用93c46特殊封装驱动程序

  -----------------------------------------------------

  void high46a(void)

  {

  di_93a=1;

  sk_93a=1;_nop_();

  sk_93a=0;_nop_();

  }

  void low46a(void)

  {

  di_93a=0;

  sk_93a=1;_nop_();

  sk_93a=0;

  _nop_();

  }

  void wd46a(unsigned char dd)

  {

  unsigned char i;

  for (i=0;i《8;i++)

  {

  if (dd》=0x80) high46a();

  else low46a();

  dd=dd《《1;

  }

  }

  unsigned char rd46a(void)

  {

  unsigned char i,dd;

  do_93a=1;

  for (i=0;i《8;i++)

  {

  dd《《=1;

  sk_93a=1;_nop_();

  sk_93a=0;_nop_();

  if (do_93a) dd|=1;

  }

  return(dd);

  }

  /*-----------------------------------------------------

  SPI93c46系列函数调用(举例)

  调用方式:bit write93c56_word(unsigned int address,unsigned int dat) ﹫2001/05/12

  函数说明:私有函数,SPI专用

  -----------------------------------------------------*/

  void ewen46(void)

  {

  _nop_();

  cs_93=1;

  high46();

  wd46(0x30);

  cs_93=0;

  }

  unsigned char eral_46()

  {

  data unsigned char temp1;

  data unsigned int temp2;

  cs_93=0;

  sk_93=0;

  //spi_org=1;

  cs_93=1;

  ewen46();

  _nop_();

  cs_93=1;

  _nop_();

  high46();

  wd46(0x20);

  wd46(0x20);

  cs_93=0;

  _nop_();

  cs_93=1;

  temp1=1;

  temp2=50000;

  while(!do_93)

  {

  temp2=temp2-1;

  if(temp2==0)

  {

  temp1=0;

  break;

  }

  }

  cs_93=0;

  return temp1;

  }

  unsigned int read93c46_word(unsigned char address)

  {

  unsigned int dat;

  unsigned char dat0,dat1;

  //gnd_93a=0;

  //gnd_93=0;

  cs_93=sk_93=0;

  //org_93=1;

  cs_93=1;_nop_();

  //address=address《《1;

  //address=address》》1;

  address=address|0x80;

  address=address|0x80;

  high46();

  wd46(address);

  dat1=rd46();

  dat0=rd46();

  cs_93=0;

  dat=dat1*256+dat0;

  return(dat);

  }

  bit write93c46_word(unsigned char address,unsigned int dat)

  {

  unsigned char e,time,temp=address;

  e=0;

  while (e《3)

  {

  //gnd_93a=0;

  //gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  ewen46();

  _nop_();

  cs_93=1;

  _nop_();

  high46();

  address《《=1;//??

  address|=0x80;

  address》》=1;//??

  address|=0x40;

  wd46(address);

  wd46(dat/256);

  wd46(dat%256);

  cs_93=0;

  _nop_();

  cs_93=1;

  time=0;

  do_93=1;

  while (1)

  {

  if (do_93==1)

  break;

  if (time》20)

  break;

  time++;

  }

  cs_93=0;

  if (read93c46_word(temp)==dat)

  {

  return(0);

  }

  e++;

  }

  return(1);

  }

  /*-----------------------------------------------------

  SPI93c57系列函数调用(举例)

  调用方式:bit write93c57_word(unsigned int address,unsigned int dat) ﹫2001/05/12

  函数说明:私有函数,SPI专用

  -----------------------------------------------------

  void ewen57(void)

  {

  _nop_();

  cs_93=1;

  dip7=0;

  high46();

  low46();

  wd46(0x60);

  cs_93=0;

  }

  unsigned int read93c57_word(unsigned int address)

  {

  unsigned int dat;

  unsigned char dat0,dat1;

  gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  address=address》》1;

  high46();

  high46();

  wd46(address);

  dat1=rd46();

  dat0=rd46();

  cs_93=0;

  dat=dat1*256+dat0;

  return(dat);

  }

  bit write93c57_word(unsigned int address,unsigned int dat)

  {

  unsigned char e;

  unsigned int temp=address;

  e=0;

  while (e《3)

  {

  gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  ewen57();

  cs_93=1;

  _nop_();

  high46();

  low46();

  address》》=1;

  address|=0x80;

  wd46(address);

  wd46(dat/256);

  wd46(dat%256);

  cs_93=0;

  _nop_();

  cs_93=1;

  time=0;

  do_93=1;

  while (1)

  {

  if (do_93==1) break;

  if (time》20) break;

  }

  cs_93=0;

  if (read93c57_word(temp)==dat)

  {

  return(0);

  }

  e++;

  }

  return(1);

  }

  /*-----------------------------------------------------

  SPI93c56系列函数调用(举例)

  调用方式:bit write93c56_word(unsigned int address,unsigned int dat) ﹫2001/05/12

  函数说明:私有函数,SPI专用

  -----------------------------------------------------

  void ewen56(void)

  {

  _nop_();

  cs_93=1;

  high46();

  low46();

  low46();

  wd46(0xc0);

  cs_93=0;

  }

  unsigned int read93c56_word(unsigned char address)

  {

  unsigned int dat;

  unsigned char dat0,dat1;

  gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  address=address》》1;

  high46();

  high46();

  low46();

  wd46(address);

  dat1=rd46();

  dat0=rd46();

  cs_93=0;

  dat=dat1*256+dat0;

  return(dat);

  }

  bit write93c56_word(unsigned char address,unsigned int dat)

  {

  unsigned char e;

  unsigned int temp=address;

  e=0;

  while (e《3)

  {

  gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  ewen56();

  _nop_();

  cs_93=1;

  _nop_();

  high46();

  low46();

  high46();

  address》》=1;

  wd46(address);

  wd46(dat/256);

  wd46(dat%256);

  cs_93=0;

  _nop_();

  cs_93=1;

  TH0=0;

  time=0;

  do_93=1;

  while (1)

  {

  if (do_93==1) break;

  if (time) break;

  }

  cs_93=0;

  if (read93c56_word(temp)==dat)

  {

  return(0);

  }

  e++;

  }

  return(1);

  }

  /*-----------------------------------------------------

  SPI93c76与SPI93c86系列函数调用(举例)

  调用方式:bit write93c76_word(unsigned int address,unsigned int dat) ﹫2001/05/12

  函数说明:私有函数,SPI专用

  -----------------------------------------------------

  void ewen76(void)

  {

  _nop_();

  cs_93=1;

  dip7=1;

  high46();

  low46();

  low46();

  high46();

  high46();

  wd46(0xff);

  cs_93=0;

  }

  unsigned int read93c76_word(unsigned int address)

  {

  unsigned char dat0,dat1;

  gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  address》》=1;

  high46();

  high46();

  low46();

  if((address&0x200)==0x200) high46();

  else low46();

  if ((address&0x100)==0x100) high46();

  else low46();

  wd46(address);

  dat1=rd46();

  dat0=rd46();

  cs_93=0;

  return(dat1*256|dat0);

  }

  bit write93c76_word(unsigned int address,unsigned int dat)

  {

  unsigned char e;

  unsigned int temp=address;

  e=0;

  address》》=1;

  while (e《3)

  {

  gnd_93=0;

  cs_93=sk_93=0;

  org_93=1;

  cs_93=1;

  ewen76();

  _nop_();

  cs_93=1;

  high46();

  low46();

  high46();

  if((address&0x200)==0x200) high46();

  else low46();

  if ((address&0x100)==0x100) high46();

  else low46();

  wd46(address);

  wd46(dat/256);

  wd46(dat%256);

  cs_93=0;_nop_();cs_93=1;

  time=0;do_93=1;

  while (1)

  {

  if (do_93==1) break;

  if (time》10) break;

  }

  cs_93=0;

  e++;

  }

  return(1);

  }

  /*-----------------------------------------------------

  主函数调用(举例)

  调用方式:main() ﹫2001/05/12

  函数说明:私有函数,SPI专用

  -----------------------------------------------------*/

  main()

  {

  bit b;

  unsigned int i;

  unsigned int j[32];

  eral_46();

  for(i=0;i《32;i++)

  j[i]=read93c46_word(i);

  for(i=0;i《32;i++)

  write93c46_word(i,0x0910);

  i=0;

  b=write93c46_word(i,0x1213);

  j[i]=read93c46_word(i);

  i=1;

  b=write93c46_word(i,0x1122);

  j[i]=read93c46_word(i);

  i=2;

  b=write93c46_word(i,0x1344);

  j[i]=read93c46_word(i);

  i=3;

  b=write93c46_word(i,0x1526);

  j[i]=read93c46_word(i);

  i=4;

  b=write93c46_word(i,0xccde);

  j[i]=read93c46_word(i);

  P2_7=0;

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分