找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4101|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机利用SPI读写25xx320 EEPROM实例程序

[复制链接]
跳转到指定楼层
楼主
51单片机利用SPI读写25xx320实例


单片机源码:
  1. /********51单片机以SPI总线读写MicroChip的25xx320EEPROM程序,2013年11月25日****************/
  2. # include <reg51.h>    //包含单片机寄存器的头文件
  3. # include <intrins.h>   //包含_nop_()函数定义的头文件
  4. sbit CS=P1^3;
  5. sbit SO=P1^2;
  6. sbit SI=P1^1;
  7. sbit SCK=P1^0;
  8. //SCK=0;
  9. //CS=1;
  10. /**************延时n微秒***************/
  11. void delaynus(unsigned char n,unsigned char i)
  12. {
  13.         for(i=0;i<n;i++);
  14. }
  15. /**************写允许函数**************/
  16. void wren(unsigned char enable,unsigned char i)
  17. {
  18.         CS=0;
  19.         enable=0x06;
  20.         SCK=0;
  21.         delaynus(1,2);
  22.         for(i=0;i<8;i++)
  23.         {
  24.         SI=enable&0x80;
  25.         delaynus(1,2);
  26.         SCK=1;
  27.         enable<<=1;
  28.         delaynus(1,2);
  29.         SCK=0;
  30.         }
  31.         CS=1;
  32.         delaynus(1,5);
  33. }
  34. /****************写禁止函数***************/
  35. /**void wrds(unsigned char dis,unsigned char i)
  36. {
  37.         CS=0;
  38.         dis=0x04;
  39.         SCK=0;
  40.         delaynus(1,2);
  41.         for(i=0;i<8;i++)
  42.         {
  43.         SI=dis&0x80;
  44.         delaynus(1,2);
  45.         SCK=1;
  46.         dis<<=1;
  47.         delaynus(1,2);
  48.         SCK=0;
  49.         }
  50.         CS=1;
  51. }
  52. /****************写指令函数***************/
  53. void wrin(unsigned char write,unsigned char i)
  54. {
  55.         CS=0;
  56.         write=0x02;
  57.         SCK=0;
  58.         delaynus(1,2);
  59.         for(i=0;i<8;i++)
  60.         {
  61.         SI=write&0x80;
  62.         delaynus(1,2);
  63.         SCK=1;
  64.         write<<=1;
  65.         delaynus(1,2);
  66.         SCK=0;
  67.         }
  68. }
  69. /****************写地址函数***************/
  70. void wrad(unsigned char adh,unsigned char adl,unsigned char i)
  71. {
  72.         CS=0;
  73.         SCK=0;
  74.         delaynus(1,2);
  75.         for(i=0;i<8;i++)
  76.         {
  77.         SI=adh&0x80;
  78.         delaynus(1,2);
  79.         SCK=1;
  80.         adh<<=1;
  81.         delaynus(1,2);
  82.         SCK=0;
  83.         }
  84.         for(i=0;i<8;i++)
  85.         {
  86.         SI=adl&0x80;
  87.         delaynus(1,2);
  88.         SCK=1;
  89.         adl<<=1;
  90.         delaynus(1,2);
  91.         SCK=0;
  92.         }       
  93. }
  94. /****************写数据函数***************/
  95. void wrda(unsigned char i,unsigned char dataa)
  96. {
  97.         CS=0;
  98.         SCK=0;
  99.         delaynus(1,2);
  100.         for(i=0;i<8;i++)
  101.         {
  102.         SI=(dataa&0x80);
  103.         delaynus(1,2);
  104.         SCK=1;
  105.         dataa=(dataa<<1);
  106.         delaynus(1,2);
  107.         SCK=0;
  108.         }
  109. }
  110. /****************读命令函数***************/
  111. void rdin(unsigned char read,unsigned char i)
  112. {
  113.         CS=0;
  114.         SCK=0;
  115.         delaynus(1,2);
  116.         read=0x03;
  117.         for(i=0;i<8;i++)
  118.         {
  119.         SI=read&0x80;
  120.         delaynus(1,2);
  121.         SCK=1;
  122.         read=(read<<=1);
  123.         delaynus(1,2);
  124.         SCK=0;
  125.         }
  126. }
  127. /****************读数据函数***************/
  128. unsigned char rdda()
  129. {
  130.         unsigned char i;
  131.         unsigned char dat=0;
  132.         delaynus(1,2);
  133.         SCK=0;
  134.         CS=0;
  135.         for(i=0;i<8;i++)
  136.         {
  137.         SCK=1;
  138.         dat<<=1;
  139.         if (SO==1)
  140.         dat|=0x01;
  141.         delaynus(1,2);
  142.         SCK=0;
  143.         delaynus(1,2);
  144.         }
  145.         CS=1;
  146.         return dat;
  147. }
  148. main()
  149. {
  150.         CS=0;
  151.         wren(0x06,0x00);
  152.         wrin(0x02,0);
  153.         wrad(0x00,0x00,0);
  154.         wrda(0,0x80);
  155.         CS=1;
  156.         delaynus(1,20);
  157.         CS=0;
  158.         rdin(0x03,0);
  159.         wrad(0x00,0x00,0);
  160.         delaynus(1,2);
  161.         ACC=rdda();
  162.         P3=ACC;
  163.         CS=1;
  164. }
复制代码

完整的Word格式文档51黑下载地址:
51单片机利用SPI读写25xx320实例.rar (8.36 KB, 下载次数: 72)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:510044 发表于 2019-7-28 01:01 | 只看该作者
最近刚好用到SPI,参考下,谢谢。
回复

使用道具 举报

板凳
ID:475247 发表于 2020-3-21 16:49 | 只看该作者
大家不要下,这个不行的,25xx320在Proteus中就没有,下到也不能仿真
回复

使用道具 举报

地板
ID:849913 发表于 2021-11-4 12:57 | 只看该作者
写地址函数只有两个字节最多能到512K 要是遇到大于512K 的 怎么办呢?是在写地址函数里面再加一个字节码?
回复

使用道具 举报

5#
ID:289218 发表于 2022-4-14 21:27 | 只看该作者
还有谁? 发表于 2020-3-21 16:49
大家不要下,这个不行的,25xx320在Proteus中就没有,下到也不能仿真

25LC320
32K
SPI
有这个芯片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表