5546|3

98

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【GD32F350开发分享七】GPIO模拟I2C驱动 [复制链接]

本帖最后由 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论坛

最新回复

多谢分享!  详情 回复 发表于 2018-10-10 18:33
点赞 关注(2)
 

回复
举报

932

帖子

3

TA的资源

纯净的硅(中级)

沙发
 
开始的宏定义值得借鉴,谢谢楼主!
此帖出自GD32 MCU论坛

点评

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

回复

98

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
hujj 发表于 2018-10-10 10:24
开始的宏定义值得借鉴,谢谢楼主!

不客气
此帖出自GD32 MCU论坛
 
 
 

回复

196

帖子

0

TA的资源

一粒金砂(中级)

4
 
多谢分享!
此帖出自GD32 MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表