社区导航

 
查看: 643|回复: 3

[经验分享] 【GD32F350开发分享七】GPIO模拟I2C驱动

[复制链接]

109

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-10-9 19:58:48 | 显示全部楼层 |阅读模式
本帖最后由 Justice_Gao 于 2018-10-9 20:07 编辑

我的作品没有用到I2C,有空的时候改了一下,仅供大家才考一下

  1. #include "I2C.h"
  2. #define SCL_HIGH  gpio_bit_set(GPIOC, GPIO_PIN_10)  
  3. #define SCL_LOW  gpio_bit_reset(GPIOC, GPIO_PIN_10)  
  4. #define RESET_HIGH  gpio_bit_set(GPIOC, GPIO_PIN_11)  
  5. #define RESET_LOW  gpio_bit_reset(GPIOC, GPIO_PIN_11)  

  6. #define POWERDOWN_HIGH  gpio_bit_set(GPIOC, GPIO_PIN_12)  
  7. #define POWERDOWN_LOW  gpio_bit_reset(GPIOC, GPIO_PIN_12)



  8. #define SDA_HIGH  gpio_bit_set(GPIOC, GPIO_PIN_13)  
  9. #define SDA_LOW  gpio_bit_reset(GPIOC, GPIO_PIN_13)   




  10. #define  SDA_READ           gpio_input_bit_get(GPIOC, GPIO_PIN_13)


  11. void I2C_delay(void)                        
  12. {
  13.     uint32_t t=300*13.5;                     
  14.    
  15.          while(t--);
  16.         
  17. }

  18. void nops1ms(void) //1ms
  19. {
  20.     uint32_t t=8000*13.5;   
  21.           while(t--);
  22. }

  23. void delay_50ms(void) //50ms
  24. {
  25.   uint t=50;   
  26.         for(t=0;t<50;t++)
  27.         nops1ms();
  28. }



  29. void Delay(void)                        
  30. {                                       
  31.    nops1ms();
  32.    nops1ms();
  33. }

  34. int I2C_Start(void)
  35. {
  36.         
  37.         SDA_HIGH;
  38.         SCL_HIGH;//高电平有效
  39.         I2C_delay();//延时
  40.         if(!SDA_READ)
  41.         {
  42.                 return DISABLE;//SDA总线忙,退出
  43.         }
  44.         SDA_LOW;
  45.         I2C_delay();
  46.         //查看此时SDA已经变为低电平
  47.         if(SDA_READ)
  48.                 return DISABLE;//SDA总线忙,退出
  49.         }
  50.         SCL_LOW;
  51.         return ENABLE;
  52. }

  53. void I2C_Stop(void)
  54. {
  55.         
  56.         SCL_LOW;
  57.         //制造一个上升沿,上升沿是结束的标志
  58.         SDA_LOW;        
  59.         SCL_HIGH;//高电平有效
  60.         I2C_delay();//延时
  61.         SDA_HIGH;
  62.         I2C_delay();
  63. }

  64. void I2C_Ack()
  65. {
  66.         SCL_LOW;
  67.         SDA_LOW;//置低
  68.         I2C_delay();   //注意延时时间应该大于4微秒,其他位置也是如此
  69.         SCL_HIGH;
  70.         I2C_delay();
  71.         SCL_LOW;
  72. }

  73. void I2C_NoAck()
  74. {
  75.         SCL_LOW;
  76.         I2C_delay();
  77.         SDA_HIGH;//置高
  78.         I2C_delay();
  79.         SCL_HIGH;
  80.         I2C_delay();
  81.         SCL_LOW;
  82. }

  83. uint8_t I2C_GetAck(void)
  84. {
  85.   uint8_t time = 0;
  86.         
  87.         SDA_HIGH;
  88.         I2C_delay();
  89.         SCL_HIGH;
  90.         I2C_delay();
  91.         while(SDA_READ)
  92.         {
  93.                 time++;
  94.                 if(time > 250)
  95.                 {
  96.                         
  97.                         SCL_LOW;
  98.                         return DISABLE;
  99.                 }
  100.         }
  101.         SCL_LOW;
  102.         return ENABLE;
  103. }

  104. //I2C写一个字节
  105. void I2C_SendByte(uint8_t Data)
  106. {
  107.   uint8_t cnt;

  108.   for(cnt=0; cnt<8; cnt++)
  109.   {
  110.     SCL_LOW;                                 //SCL低(SCL低时,变化SDA)
  111.     I2C_delay();

  112.     if(Data & 0x80)
  113.     {
  114.       SDA_HIGH;                              //SDA高,从最低位开始写起
  115.     }
  116.     else
  117.     {
  118.       SDA_LOW;                               //SDA低
  119.     }
  120.     Data <<= 1;
  121.     SCL_HIGH;                                //SCL高(发送数据)
  122.     I2C_delay();
  123.   }
  124.   SCL_LOW;                                   //SCL低(等待应答信号)
  125.   I2C_delay();
  126. }

  127. //I2C读取一个字节
  128. uint8_t I2C_ReadByte(uint8_t ack)
  129. {
  130.   uint8_t cnt;
  131.   uint8_t data;
  132.         
  133.   for(cnt=0; cnt<8; cnt++)
  134.   {
  135.     SCL_LOW;                                 //SCL低
  136.     I2C_delay();
  137.                
  138.     SCL_HIGH;                                //SCL高(读取数据)
  139.     data <<= 1;
  140.     if(SDA_READ)
  141.     {
  142.       data |= 0x01;                              //SDA高(数据有效)
  143.     }
  144.     I2C_delay();
  145.   }
  146.   //发送应答信号,为低代表应答,高代表非应答
  147.   if(ack == 1)
  148.   {
  149.      I2C_NoAck();
  150.   }
  151.   else
  152.   {
  153.      I2C_Ack();
  154.   }
  155.   return data;                                   //返回数据
  156. }

复制代码




此帖出自GD32 MCU论坛


回复

使用道具 举报

236

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2018-10-10 10:24:32 | 显示全部楼层
开始的宏定义值得借鉴,谢谢楼主!

点评

不客气  详情 回复 发表于 2018-10-10 12:28


回复

使用道具 举报

109

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2018-10-10 12:28:06 | 显示全部楼层
hujj 发表于 2018-10-10 10:24
开始的宏定义值得借鉴,谢谢楼主!

不客气


回复

使用道具 举报

128

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-10-10 18:33:58 | 显示全部楼层
多谢分享!


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-19 11:32 , Processed in 0.140540 second(s), 16 queries , Gzip On, MemCache On.

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