智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5973|回复: 7
打印 上一主题 下一主题

[咨询] XS128的EEPROM

[复制链接]

4

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
威望
282
贡献
152
兑换币
0
注册时间
2010-1-16
在线时间
3 小时
跳转到指定楼层
1#
发表于 2010-7-11 21:11:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit scl=P2^1; //24c16 SCL
  5. sbit sda=P2^0; //24c16 SDA


  6. void x24c16_init() //24c16初始化子程序
  7. {
  8. scl=1;
  9. sda=1;
  10. }

  11. void start() //启动I2C总线
  12. {
  13. sda=1;
  14. scl=1;
  15. sda=0;
  16. scl=0;
  17. }

  18. void stop() //停止I2C总线
  19. {
  20. sda=0;
  21. scl=1;
  22. sda=1;
  23. scl=0;
  24. }

  25. void writex(uchar j) //写一个字节
  26. {
  27. uchar i,temp;
  28. temp=j;
  29. for (i=0;i<8;i++)
  30. {
  31. scl=0;
  32. sda=j&0x80;
  33. scl=1;
  34. j<<=1;
  35. }
  36. scl=0;
  37. }

  38. uchar readx() //读一个字节
  39. {
  40. uchar i,x=0;
  41. scl=0;
  42. sda=1; //释放sda总线
  43. for (i=0;i<8;i++)
  44. {
  45. scl=1;
  46. x=x<<1;
  47. if (sda==1) x=x|0x01;
  48. //while(1)
  49. scl=0;
  50. }
  51. return(x);
  52. }
  53. bit Check_ACK(void) //发送完一个字节后,检验设备的应答信号
  54. {
  55. sda=1;
  56. scl=1;
  57. if(sda==1){scl=0; return(1);}
  58. else {scl=0; return 0;}
  59. }

  60. void MasterAck() //主机发送应答信号
  61. {
  62. sda=1;
  63. scl=0;
  64. sda=0;
  65. scl=1;
  66. scl=0;
  67. sda=1;//ACK发送完毕,释放总线
  68. }



  69. void x24c16_write(uchar add,uchar x) //写单个字节
  70. {
  71. do{
  72. start();//重起IIC
  73. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  74. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  75. writex(add);//2408内部地址
  76. Check_ACK();
  77. writex(x);//向寻到的内部地址写数据
  78. Check_ACK();
  79. stop();//停止IIC
  80. }

  81. uchar x24c16_read(uchar add) //读单个字节
  82. {
  83. uchar i;
  84. do{
  85. start();//重起IIC
  86. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  87. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  88. writex(add);//设置内部地址
  89. Check_ACK();//检查应答
  90. do{
  91. start();//重起总线
  92. writex(0xa1);//器件寻址并设置为读
  93. }while(Check_ACK());//检查应答
  94. i=readx();//读数据
  95. Check_ACK();
  96. stop();//停止IIC
  97. return(i);
  98. }


  99. void x24c16_Nread(uchar add,uint n,uchar *buff) //读多个字节
  100. {
  101. uchar m;
  102. do{
  103. start();//重起IIC
  104. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  105. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  106. writex(add);//设置内部地址
  107. Check_ACK();//检查应答
  108. do{
  109. start();//重起总线
  110. writex(0xa1);//器件寻址并设置为读
  111. }while(Check_ACK());//检查应答
  112. for(m=0;m<n;m++)
  113. {
  114. buff[m]=readx();//读数据
  115. if(m!=n-1) MasterAck();//主机发送应答
  116. }
  117. stop();//停止IIC
  118. }

  119. void x24c16_Nwrite(uchar add,uint n,uchar *buff)//写多个字节
  120. {
  121. uint i;
  122. do{
  123. start();//重起IIC
  124. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  125. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  126. writex(add);//2408内部地址
  127. Check_ACK();
  128. for(i=0;i<n;i++)
  129. {
  130. writex(buff[i]);//向寻到的内部地址写数据
  131. Check_ACK();
  132. }
  133. stop();//停止IIC
  134. }

  135. ////////////////////////////////////////////////////
  136. void delay (uchar t)
  137. {
  138. uchar m;
  139. for(;t>0;t--)
  140. for(m=255;m>0;m--)
  141. ;
  142. }


  143. void main ()
  144. {
  145. uchar n;
  146. uchar shuju_in;
  147. // uchar shuju_out;
  148. uchar addr=0x00;

  149. uchar shu[]={1,2,4,8,16,32,64,128};
  150. uchar a[8];

  151. shuju_in=0x00;


  152. if((P3&0x04)==0)
  153. {
  154. while(1)
  155. {
  156. x24c16_Nread(addr,8,a);
  157. for(n=0;n<=7;n++)
  158. {
  159. P0=a[n];
  160. delay(255);
  161. delay(255);
  162. delay(255);
  163. delay(255);
  164. }
  165. }
  166. }
  167. else
  168. {
  169. while(1)
  170. {
  171. x24c16_Nwrite(addr,8,shu);
  172. P0=0xfe;
  173. delay(255);
  174. delay(255);
  175. delay(255);
  176. delay(255);
  177. }
  178. }
  179. }


  180. /*while(1) //单字节读写
  181. {
  182. x24c16_write(addr,shuju_in);
  183. ;;;
  184. shuju_out=x24c16_read(addr);
  185. P1=shuju_out;
  186. delay(255);

  187. shuju_in++;
  188. }*/
  189. /*while(1) //N字节读写
  190. {
  191. x24c16_Nwrite(addr,8,shu);
  192. ;;;
  193. x24c16_Nread(addr,8,a);

  194. for(n=0;n<=7;n++)
  195. {
  196. P0=a[n];
  197. delay(255);
  198. delay(255);
  199. }
  200. }*/
复制代码
有用eeprom的吗?我用51单片机的直接修改一下咋都不行。请高手指点指点。以上是我的51单片机程序。

2

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
QQ
威望
259
贡献
46
兑换币
0
注册时间
2010-4-11
在线时间
20 小时
2#
发表于 2010-7-15 13:45:17 | 只看该作者
用XS128片内的 DataFlash呗~8KB不用外接了...
具体看 DataSheet或者 用EP生成 bean
回复 支持 反对

使用道具 举报

0

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
威望
204
贡献
46
兑换币
0
注册时间
2010-10-16
在线时间
27 小时
3#
发表于 2010-11-6 22:12:05 | 只看该作者
好好看看资料了
回复 支持 反对

使用道具 举报

2

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
355
威望
271
贡献
64
兑换币
0
注册时间
2010-12-2
在线时间
10 小时
4#
发表于 2011-5-2 21:59:14 | 只看该作者
xs128中没有EEPROM的,是用D_FLASH 代替它,所以移植51的程序是不行的。我正在研究,可以讨论
回复 支持 反对

使用道具 举报

8

主题

66

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1129
威望
544
贡献
293
兑换币
4
注册时间
2011-4-9
在线时间
147 小时
5#
发表于 2011-7-25 00:14:07 | 只看该作者
回复 4# happygirl


    话说弄出来没???
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

注册会员

Rank: 2

积分
165
威望
81
贡献
46
兑换币
42
注册时间
2013-3-5
在线时间
19 小时
毕业学校
重庆交通大学
6#
发表于 2013-9-15 19:35:27 | 只看该作者
I2C端口一会输入一会而输出,谁能给个权威的??
回复 支持 反对

使用道具 举报

10

主题

58

帖子

0

精华

高级会员

Rank: 4

积分
753
威望
372
贡献
219
兑换币
236
注册时间
2013-5-11
在线时间
81 小时
7#
发表于 2013-12-23 21:06:25 | 只看该作者
GhostStalker 发表于 2010-7-15 13:45
用XS128片内的 DataFlash呗~8KB不用外接了...
具体看 DataSheet或者 用EP生成 bean

请教一下,为什么我的掉电不保存数据呢,能指教下吗
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-16 10:02 , Processed in 0.048414 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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