找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5038|回復(fù): 4
收起左側(cè)

51單片機(jī)利用SPI讀寫25xx320 EEPROM實例程序

[復(fù)制鏈接]
ID:369278 發(fā)表于 2018-7-11 10:26 | 顯示全部樓層 |閱讀模式
51單片機(jī)利用SPI讀寫25xx320實例
0.png

單片機(jī)源碼:
  1. /********51單片機(jī)以SPI總線讀寫MicroChip的25xx320EEPROM程序,2013年11月25日****************/
  2. # include <reg51.h>    //包含單片機(jī)寄存器的頭文件
  3. # include <intrins.h>   //包含_nop_()函數(shù)定義的頭文件
  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. /**************寫允許函數(shù)**************/
  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. /****************寫禁止函數(shù)***************/
  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. /****************寫指令函數(shù)***************/
  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. /****************寫地址函數(shù)***************/
  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. /****************寫數(shù)據(jù)函數(shù)***************/
  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. /****************讀命令函數(shù)***************/
  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. /****************讀數(shù)據(jù)函數(shù)***************/
  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. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
51單片機(jī)利用SPI讀寫25xx320實例.rar (8.36 KB, 下載次數(shù): 73)


回復(fù)

使用道具 舉報

ID:510044 發(fā)表于 2019-7-28 01:01 | 顯示全部樓層
最近剛好用到SPI,參考下,謝謝。
回復(fù)

使用道具 舉報

ID:475247 發(fā)表于 2020-3-21 16:49 | 顯示全部樓層
大家不要下,這個不行的,25xx320在Proteus中就沒有,下到也不能仿真
回復(fù)

使用道具 舉報

ID:849913 發(fā)表于 2021-11-4 12:57 | 顯示全部樓層
寫地址函數(shù)只有兩個字節(jié)最多能到512K 要是遇到大于512K 的 怎么辦呢?是在寫地址函數(shù)里面再加一個字節(jié)碼?
回復(fù)

使用道具 舉報

ID:289218 發(fā)表于 2022-4-14 21:27 | 顯示全部樓層
還有誰? 發(fā)表于 2020-3-21 16:49
大家不要下,這個不行的,25xx320在Proteus中就沒有,下到也不能仿真

25LC320
32K
SPI
有這個芯片
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表