网站导航: 首页 > 设计参考 > 正文 文章搜索
93C46/93c06/93c56/93c66/93c86的驱动程序(C51)
 
文章编号:
090106154844
文章分类: EDA技术 Keil C
点 击:
...
关 键 词: 93C46,93c06,93c56,93c66,93c86
文章来源:
网络
摘 要:

 
  1. /*————————————————————  
  2. 〖说明〗SPI总线驱动程序 包括的普通封装标准模式,特殊封装标准模式   
  3. 默认11.0592Mhz的晶振。  
  4. 〖文件〗93CXX.C ﹫2003/5/12  
  5. —————————————————————*/    
  6. /*通用93c06-93c86系列使用说明  
  7. 93c06=93c4693c56=93c6693c76=93c86  
  8. dipx 可以自行定义*/  
  9. #include "reg51.h"   
  10. #include "intrins.h"   
  11. /*-----------------------------------------------------  
  12. SPI 93cXX系列时序函数调用(普通封装)  
  13. 调用方式:自行定义﹫2001/05/12   
  14. 函数说明:私有函数,封装各接口定义  
  15. -----------------------------------------------------*/    
  16. #define di_93 dip3   
  17. #define sk_93 dip2   
  18. #define cs_93 dip1   
  19. #define do_93 dip4   
  20. #define gnd_93 dip5   
  21. #define org_93 dip6   
  22. sbit cs_93=P1^0;   
  23. sbit sk_93=P1^1;   
  24. sbit di_93=P1^2;   
  25. sbit do_93=P1^3;   
  26. sbit org_93=P0^4;   
  27. /*-----------------------------------------------------  
  28. SPI93cXX系列时序函数调用(普通封装)  
  29. 调用方式:void high46(void) ---高8位函数调用   
  30. void low46(void) ---低8位函数调用﹫2001/05/12   
  31. 函数说明:私有函数,SPI专用93c46普通封装驱动程序  
  32. -----------------------------------------------------*/    
  33. void high46(void)   
  34. {    
  35.     di_93=1;    
  36.     sk_93=1; _nop_();    
  37.     sk_93=0;_nop_();   
  38. }   
  39. void low46(void)   
  40. {    
  41.     di_93=0;    
  42.     sk_93=1;_nop_();   
  43.     sk_93=0;_nop_();   
  44. }   
  45. void wd46(unsigned char dd)   
  46. {    
  47.     unsigned char i;    
  48.     for (i=0;i<8;i++)    
  49.     {    
  50.         if (dd>=0x80) high46();    
  51.         else low46();    
  52.         dd=dd<<1;    
  53.     }   
  54. }   
  55. unsigned char rd46(void)   
  56. {    
  57.     unsigned char i,dd;    
  58.     do_93=1;    
  59.     for (i=0;i<8;i++)    
  60.     {    
  61.         dd<<=1;    
  62.         sk_93=1;_nop_();   
  63.         sk_93=0;_nop_();    
  64.         if (do_93) dd|=1;    
  65.     }    
  66.     return(dd);   
  67. }   
  68. /*-----------------------------------------------------  
  69. SPI93cXX系列时序函数调用(特殊封装)  
  70. 调用方式:自行定义﹫2001/05/12   
  71. 函数说明:私有函数,特殊封装各接口定义  
  72. -----------------------------------------------------*/    
  73. #define di_93a dip5   
  74. #define sk_93a dip4   
  75. #define cs_93a dip3   
  76. #define do_93a dip6   
  77. #define gnd_93a dip7   
  78. #define vcc_93a out_vcc(2)   
  79. sbit cs_93a=P1^0;   
  80. sbit sk_93a=P1^1;   
  81. sbit di_93a=P1^2;   
  82. sbit do_93a=P1^3;   
  83. /*-----------------------------------------------------  
  84. SPI93cXX系列时序函数调用(特殊封装)  
  85. 调用方式:void high46a(void) ---高8位函数调用   
  86. void low46a(void) ---低8位函数调用﹫2001/05/12   
  87. 函数说明:私有函数,SPI专用93c46特殊封装驱动程序  
  88. -----------------------------------------------------*/  
  89. void high46a(void)   
  90. {    
  91.     di_93a=1;    
  92.     sk_93a=1;_nop_();   
  93.     sk_93a=0;_nop_();   
  94. }   
  95. void low46a(void)   
  96. {    
  97.     di_93a=0;    
  98.     sk_93a=1;_nop_();   
  99.     sk_93a=0;   
  100.     _nop_();   
  101. }   
  102. void wd46a(unsigned char dd)   
  103. {    
  104.     unsigned char i;    
  105.     for (i=0;i<8;i++)    
  106.     {    
  107.         if (dd>=0x80) high46a();    
  108.         else low46a();   
  109.         dd=dd<<1;    
  110.     }   
  111. }   
  112. unsigned char rd46a(void)   
  113. {    
  114.     unsigned char i,dd;    
  115.     do_93a=1;    
  116.     for (i=0;i<8;i++)    
  117.     {    
  118.         dd<<=1;    
  119.         sk_93a=1;_nop_();   
  120.         sk_93a=0;_nop_();    
  121.         if (do_93a) dd|=1;   
  122.     }    
  123.     return(dd);   
  124. }   
  125. /*-----------------------------------------------------  
  126. SPI93c46系列函数调用(举例)  
  127. 调用方式:bit write93c56_word(unsigned int address,unsigned int dat) ﹫2001/05/12  
  128. 函数说明:私有函数,SPI专用  
  129. -----------------------------------------------------*/    
  130. void ewen46(void)   
  131. {    
  132.     _nop_();    
  133.     cs_93=1;    
  134.     high46();    
  135.     wd46(0x30);    
  136.     cs_93=0;   
  137. }   
  138. unsigned int read93c46_word(unsigned char address)   
  139. {    
  140.     unsigned int dat;    
  141.     unsigned char dat0,dat1;    
  142.     gnd_93a=0;    
  143.     gnd_93=0;    
  144.     cs_93=sk_93=0;   
  145.     org_93=1;   
  146.     cs_93=1;_nop_();    
  147.     address=address>>1;   
  148.     address=address|0x80;   
  149.     address=address|0x80;    
  150.     high46();   
  151.     wd46(address);   
  152.     dat1=rd46();   
  153.     dat0=rd46();    
  154.     cs_93=0;   
  155.     dat=dat1*256+dat0;    
  156.     return(dat);   
  157. }   
  158. bit write93c46_word(unsigned char address,unsigned int dat)   
  159. {   
  160.     unsigned char e,temp=address;    
  161.     e=0;    
  162.     while (e<3)    
  163.     {   
  164.         gnd_93a=0;    
  165.         gnd_93=0;    
  166.         cs_93=sk_93=0;    
  167.         org_93=1;    
  168.         cs_93=1;   
  169.         ewen46();   
  170.         _nop_();   
  171.         cs_93=1;   
  172.         _nop_();   
  173.         high46();   
  174.         address|=0x80;   
  175.         address>>=1;//??   
  176.         address|=0x40;   
  177.         wd46(address);    
  178.         wd46(dat/256);    
  179.         wd46(dat%256);   
  180.         cs_93=0;   
  181.         _nop_();   
  182.         cs_93=1;   
  183.         time=0;do_93=1;   
  184.         while (1)    
  185.         {   
  186.             if (do_93==1) break;   
  187.             if (time>20) break;   
  188.         }    
  189.         cs_93=0;    
  190.         if (read93c46_word(temp)==dat)    
  191.         {   
  192.             return(0);   
  193.         }   
  194.         e++;   
  195.     }    
  196.     return(1);   
  197. }   
  198. /*-----------------------------------------------------  
  199. SPI93c57系列函数调用(举例)  
  200. 调用方式:bit write93c57_word(unsigned int address,unsigned int dat) ﹫2001/05/12  
  201. 函数说明:私有函数,SPI专用  
  202. -----------------------------------------------------*/    
  203. void ewen57(void)   
  204. {   
  205.     _nop_();    
  206.     cs_93=1;   
  207.     dip7=0;   
  208.     high46();   
  209.     low46();   
  210.     wd46(0x60);   
  211.     cs_93=0;   
  212. }   
  213. unsigned int read93c57_word(unsigned int address)   
  214. {    
  215.     unsigned int dat;    
  216.     unsigned char dat0,dat1;    
  217.     gnd_93=0;    
  218.     cs_93=sk_93=0;    
  219.     org_93=1;    
  220.     cs_93=1;    
  221.     address=address>>1;    
  222.     high46();    
  223.     high46();    
  224.     wd46(address);   
  225.     dat1=rd46();   
  226.     dat0=rd46();    
  227.     cs_93=0;   
  228.     dat=dat1*256+dat0;    
  229.     return(dat);   
  230. }   
  231. bit write93c57_word(unsigned int address,unsigned int dat)   
  232. {    
  233.     unsigned char e;    
  234.     unsigned int temp=address;    
  235.     e=0;    
  236.     while (e<3)    
  237.     {   
  238.         gnd_93=0;   
  239.         cs_93=sk_93=0;   
  240.         org_93=1;   
  241.         cs_93=1;   
  242.         ewen57();   
  243.         cs_93=1;   
  244.         _nop_();   
  245.         high46();   
  246.         low46();   
  247.         address>>=1;   
  248.         address|=0x80;   
  249.         wd46(address);   
  250.         wd46(dat/256);   
  251.         wd46(dat%256);   
  252.         cs_93=0;   
  253.         _nop_();   
  254.         cs_93=1;   
  255.         time=0;   
  256.         do_93=1;   
  257.         while (1)    
  258.         {   
  259.             if (do_93==1) break;   
  260.             if (time>20) break;   
  261.         }   
  262.         cs_93=0;   
  263.         if (read93c57_word(temp)==dat)    
  264.         {   
  265.             return(0);   
  266.         }   
  267.         e++;   
  268.     }   
  269.     return(1);   
  270. }   
  271. /*-----------------------------------------------------  
  272. SPI93c56系列函数调用(举例)  
  273. 调用方式:bit write93c56_word(unsigned int address,unsigned int dat) ﹫2001/05/12  
  274. 函数说明:私有函数,SPI专用  
  275. -----------------------------------------------------*/    
  276. void ewen56(void)   
  277. {    
  278.     _nop_();   
  279.     cs_93=1;   
  280.     high46();   
  281.     low46();   
  282.     low46();   
  283.     wd46(0xc0);   
  284.     cs_93=0;   
  285. }   
  286. unsigned int read93c56_word(unsigned char address)    
  287. {   
  288.     unsigned int dat;   
  289.     unsigned char dat0,dat1;   
  290.     gnd_93=0;   
  291.     cs_93=sk_93=0;   
  292.     org_93=1;   
  293.     cs_93=1;   
  294.     address=address>>1;   
  295.     high46();   
  296.     high46();   
  297.     low46();   
  298.     wd46(address);   
  299.     dat1=rd46();   
  300.     dat0=rd46();   
  301.     cs_93=0;   
  302.     dat=dat1*256+dat0;   
  303.     return(dat);   
  304. }   
  305. bit write93c56_word(unsigned char address,unsigned int dat)   
  306. {   
  307.     unsigned char e;   
  308.     unsigned int temp=address;   
  309.     e=0;    
  310.     while (e<3)    
  311.     {   
  312.         gnd_93=0;   
  313.         cs_93=sk_93=0;   
  314.         org_93=1;   
  315.         cs_93=1;   
  316.         ewen56();   
  317.         _nop_();   
  318.         cs_93=1;   
  319.         _nop_();   
  320.         high46();   
  321.         low46();   
  322.         high46();   
  323.         address>>=1;   
  324.         wd46(address);   
  325.         wd46(dat/256);   
  326.         wd46(dat%256);   
  327.         cs_93=0;   
  328.         _nop_();   
  329.         cs_93=1;   
  330.         TH0=0;   
  331.         time=0;   
  332.         do_93=1;   
  333.         while (1)    
  334.         {   
  335.             if (do_93==1) break;   
  336.             if (time) break;   
  337.         }   
  338.         cs_93=0;   
  339.         if (read93c56_word(temp)==dat)    
  340.         {   
  341.             return(0);   
  342.         }   
  343.         e++;   
  344.     }   
  345.     return(1);   
  346. }   
  347. /*-----------------------------------------------------  
  348. SPI93c76与SPI93c86系列函数调用(举例)  
  349. 调用方式:bit write93c76_word(unsigned int address,unsigned int dat) ﹫2001/05/12  
  350. 函数说明:私有函数,SPI专用  
  351. -----------------------------------------------------*/  
  352. void ewen76(void)   
  353. {   
  354.     _nop_();   
  355.     cs_93=1;   
  356.     dip7=1;   
  357.     high46();   
  358.     low46();   
  359.     low46();   
  360.     high46();   
  361.     high46();   
  362.     wd46(0xff);   
  363.     cs_93=0;   
  364. }   
  365. unsigned int read93c76_word(unsigned int address)   
  366. {   
  367.     unsigned char dat0,dat1;   
  368.     gnd_93=0;   
  369.     cs_93=sk_93=0;   
  370.     org_93=1;   
  371.     cs_93=1;   
  372.     address>>=1;   
  373.     high46();   
  374.     high46();   
  375.     low46();   
  376.     if((address&0x200)==0x200) high46();    
  377.     else low46();    
  378.     if ((address&0x100)==0x100) high46();    
  379.     else low46();   
  380.     wd46(address);   
  381.     dat1=rd46();   
  382.     dat0=rd46();   
  383.     cs_93=0;   
  384.     return(dat1*256|dat0);   
  385. }   
  386. bit write93c76_word(unsigned int address,unsigned int dat)   
  387. {   
  388.     unsigned char e;   
  389.     unsigned int temp=address;   
  390.     e=0;   
  391.     address>>=1;   
  392.     while (e<3)    
  393.     {   
  394.         gnd_93=0;   
  395.         cs_93=sk_93=0;   
  396.         org_93=1;   
  397.         cs_93=1;   
  398.         ewen76();   
  399.         _nop_();   
  400.         cs_93=1;   
  401.         high46();   
  402.         low46();   
  403.         high46();   
  404.         if((address&0x200)==0x200) high46();    
  405.         else low46();   
  406.         if ((address&0x100)==0x100) high46();    
  407.         else low46();   
  408.         wd46(address);   
  409.         wd46(dat/256);   
  410.         wd46(dat%256);   
  411.         cs_93=0;_nop_();cs_93=1;   
  412.         time=0;do_93=1;    
  413.         while (1)    
  414.         {   
  415.             if (do_93==1) break;   
  416.             if (time>10) break;   
  417.         }   
  418.         cs_93=0;   
  419.         e++;   
  420.     }   
  421.     return(1);   
  422. }   
  423. /*-----------------------------------------------------  
  424. 主函数调用(举例)  
  425. 调用方式:main() ﹫2001/05/12  
  426. 函数说明:私有函数,SPI专用  
  427. -----------------------------------------------------*/  
  428. void main()   
  429. {    
  430.     bit b;   
  431.     unsigned int i;   
  432.     unsigned int j[32],k;   
  433.     for(i=0;i<32;i++)   
  434.         j[i]=read93c56_word(i);   
  435.     for(i=0;i<32;i++)   
  436.         write93c56_word(i,0x0909);   
  437.     i=0;    
  438.     b=write93c56_word(i,0x0909);   
  439.     j[i]=read93c56_word(i);   
  440.     i=1;    
  441.     b=write93c56_word(i,0x1111);   
  442.     j[i]=read93c56_word(i);   
  443.     i=2;   
  444.     b=write93c56_word(i,0x2222);   
  445.     j[i]=read93c56_word(i);   
  446. }   
  447.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 



 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4