搜索
bottom↓
回复: 10

AT24C01模拟IIC口,自己写的可以直接移植

[复制链接]

出0入53汤圆

发表于 2014-2-21 16:16:59 | 显示全部楼层 |阅读模式
本帖最后由 zhcj66 于 2014-2-21 16:18 编辑

AT24C01模拟IIC口,自己写的可以直接移植,
看了网上很多发的模拟IIC写的AT24C01有的修改一下就可以,但是有些还是无法运行,今天正好有时间,我也写了一个,不过是AVR的,修改一点点就可以直接用了。
看到stm32/8这个地方比较活跃,所以就发到这里了。希望斑竹不要介意(目的为了让大家共同学习),同时也感谢阿莫论坛,在这里学到了很多。
废话少说上代码
  1. /**
  2.   ******************************************************************************
  3.   * @File                       :I2C.c
  4.   * @Author                     :Flame
  5.   * @Email                      :
  6.   * @Version                    :V1.0.0
  7.   * @FileNewDate                :2014-02-21
  8.   * @FileChangeDate             :2014-02-21
  9.   * @Brief                      :AT24C01读写程序,包含全部填充,测试成功。mcu采用的AVR-8MHZ
  10.   ******************************************************************************
  11.   */
  12. #include "includes.h"

  13. #define IIC_SDA_PIN     BIT(2)
  14. #define IIC_SDA_PORTx   PORTB
  15. #define IIC_SDA_DDRx    DDRB
  16. #define IIC_SDA_PINx    PINB

  17. #define IIC_SCL_PIN     BIT(3)
  18. #define IIC_SCL_PORTx   PORTB
  19. #define IIC_SCL_DDRx    DDRB
  20. #define IIC_SCL_PINx    PINB


  21. #define IIC_SDA_SET            IIC_SDA_PORTx |= IIC_SDA_PIN
  22. #define IIC_SDA_CLR            IIC_SDA_PORTx &=~IIC_SDA_PIN
  23. #define IIC_SDA_Get     IIC_SDA_PINx  &  IIC_SDA_PIN

  24. #define IIC_SCL_SET            IIC_SCL_PORTx |= IIC_SCL_PIN
  25. #define IIC_SCL_CLR            IIC_SCL_PORTx &=~IIC_SCL_PIN
  26. #define IIC_SCL_Get     IIC_SCL_PINx  &  IIC_SCL_PIN

  27. #define        IIC_ReadAddr         0xA1                //器件地址以及读取操作
  28. #define        IIC_WriteAddr    0xA0                //器件地址以及写入操作
  29. #define        IIC_MaxAddr      0xFF                //AT24C02最大地址

  30. void IIC_Delays(unsigned char ms)       
  31. {
  32. static unsigned char i;
  33.         while(ms--)
  34.         {
  35.                 for(i = 0; i < 120; i++);
  36.         }
  37. }

  38. //把SDA管脚设置为输入
  39. void IIC_SDA_IN(void)
  40. {
  41.         IIC_SDA_DDRx &= ~IIC_SDA_PIN;
  42. }

  43. //把SDA管脚设置为输出
  44. void IIC_SDA_OUT(void)
  45. {
  46.         IIC_SDA_DDRx |= IIC_SDA_PIN;
  47. }

  48. void IIC_Start(void)
  49. {
  50.         IIC_SDA_OUT();

  51.         IIC_SDA_SET;
  52.         IIC_SCL_SET;
  53.         NOP();
  54.         NOP();
  55.         IIC_SDA_CLR;
  56.         NOP();
  57.         NOP();
  58.         NOP();
  59.         NOP();
  60.         IIC_SCL_CLR;
  61. }

  62. void IIC_Stop(void)
  63. {
  64.         IIC_SDA_OUT();

  65.         IIC_SDA_CLR;
  66.         NOP();
  67.         NOP();
  68.         IIC_SCL_SET;
  69.         NOP();
  70.         NOP();
  71.         NOP();
  72.         NOP();
  73.         IIC_SDA_SET;
  74. }

  75. void IIC_Send(unsigned char Byte)
  76. {
  77. static unsigned char i;

  78.         IIC_SDA_OUT();

  79.         for (i = 0; i < 8; i++)
  80.         {
  81.                 if((Byte & 0x80) == 0x80)
  82.                 {
  83.                         IIC_SDA_SET;
  84.                 }
  85.                 else
  86.                 {
  87.                         IIC_SDA_CLR;
  88.                 }
  89.                 NOP();
  90.                 IIC_SCL_SET;
  91.                 NOP();
  92.                 NOP();
  93.                 IIC_SCL_CLR;
  94.                 Byte = Byte << 1;
  95.         }
  96.         IIC_SDA_SET;
  97.         NOP();
  98.         NOP();
  99.         IIC_SCL_SET;
  100.         NOP();
  101.         NOP();
  102.         NOP();
  103.         NOP();
  104.         IIC_SCL_CLR;
  105. }

  106. unsigned char IIC_Read(void)
  107. {       
  108. static unsigned char i,read_data;

  109.         IIC_SDA_IN();

  110.         for (i = 0; i < 8; i++)
  111.         {
  112.                 IIC_SCL_SET;
  113.                 read_data <<= 1;
  114.                 if(IIC_SDA_Get)
  115.                 {
  116.                         read_data = read_data | 0x01;
  117.                 }
  118.                 IIC_SCL_CLR;
  119.         }
  120.         return read_data;
  121. }

  122. void IIC_WriteByte(unsigned char Addr,unsigned char Data)
  123. {
  124.         IIC_Start();
  125.         IIC_Send(IIC_WriteAddr);
  126.         IIC_Send(Addr);
  127.         IIC_Send(Data);
  128.         IIC_Stop();
  129.         IIC_Delays(15);//如果填写偶数失败时,可以增加延时时间               
  130. }

  131. void IIC_FillByte(unsigned char Data)//填充数据Data到整个EEPROM内
  132. {
  133. static unsigned char i;
  134.         for(i = 0; i < IIC_MaxAddr; i++)
  135.         {
  136.                 IIC_WriteByte(i, Data);
  137.                 WDR();//喂狗
  138.         }
  139. }

  140. unsigned char IIC_ReadByte(unsigned int ReadAddr)
  141. {
  142. static unsigned char read_data;
  143.        
  144.         IIC_Start();
  145.         IIC_Send(IIC_WriteAddr);
  146.         IIC_Send(ReadAddr);
  147.         IIC_Start();
  148.         IIC_Send(IIC_ReadAddr);
  149.         read_data = IIC_Read();
  150.         IIC_Stop();
  151.         return read_data;
  152. }

  153. void IIC_Init(void)
  154. {
  155. unsigned char temp,i;
  156.         IIC_SCL_SET;
  157.         IIC_SDA_SET;
  158.        
  159.         IIC_SDA_DDRx |= IIC_SDA_PIN;
  160.         IIC_SCL_DDRx |= IIC_SCL_PIN;
  161.        

  162.         IIC_FillByte(0x68);
  163.         for(i = 0 ; i < 255; i++)
  164.         {
  165.                 temp = IIC_ReadByte(i);
  166.                 USART1_tx(temp);
  167.                 delay_nms(20);
  168.                 WDR();
  169.         }
  170.         for(i = 0 ; i < 255; i++)
  171.         {
  172.             IIC_WriteByte(i,i);
  173.                 delay_nms(20);
  174.                 if(i = IIC_ReadByte(i))
  175.                 {
  176.                         USART1_tx(i);
  177.                         delay_nms(20);
  178.                         WDR();
  179.                 }
  180.         }
  181.         while(1)WDR();
  182. }
复制代码


有不恰当的地方希望给予支出,谢谢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-2-21 16:33:40 | 显示全部楼层
简单明了,帮顶

出0入53汤圆

 楼主| 发表于 2014-2-21 16:57:04 | 显示全部楼层
Let 发表于 2014-2-21 16:33
简单明了,帮顶

谢谢

出0入0汤圆

发表于 2014-2-21 18:20:36 | 显示全部楼层
暂时用不到,顶一下

出0入0汤圆

发表于 2014-2-21 18:22:03 | 显示全部楼层
暂时不用到,先顶

出0入30汤圆

发表于 2014-2-21 21:37:13 | 显示全部楼层
简单明了,帮顶

出0入0汤圆

发表于 2014-2-21 21:49:37 | 显示全部楼层
你这设置通信速度在哪?

出0入76汤圆

发表于 2014-2-21 21:53:14 | 显示全部楼层
呵呵 ,AVR,可以放心的用中断去完成,

出0入0汤圆

发表于 2014-2-21 22:43:27 | 显示全部楼层
谢谢楼主,帮顶了。

出0入53汤圆

 楼主| 发表于 2014-3-3 13:41:40 | 显示全部楼层
foxpro2005 发表于 2014-2-21 21:53
呵呵 ,AVR,可以放心的用中断去完成,

为了通用 不要求速度的 模拟的比较好

出0入0汤圆

发表于 2017-2-17 10:59:26 | 显示全部楼层
参考一下,谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 02:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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