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

2019-12-31 19:17发布

本帖最后由 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. }
复制代码

有不恰当的地方希望给予支出,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。