找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2493|回复: 3
收起左侧

STM8s 用GPIO模拟IIC通信源程序

[复制链接]
ID:125378 发表于 2019-7-29 09:08 | 显示全部楼层 |阅读模式
实测有效,供大家一起学习
0.png
单片机源程序如下:
  1. /**
  2.   **********************************  STM8S  ***********************************
  3.   * @文件名     : soft_iic.c
  4.   * @作者       : gaoxiao
  5.   * @文件版本   : V1.0.0
  6.   * @日期       : 2019年06月29日
  7.   * @摘要       : 软件模拟IIC源文件
  8.   ******************************************************************************/
  9. /*----------------------------------------------------------------------------
  10.   更新日志:
  11.   2019-06-29 V1.0.0:初始版本
  12.   ----------------------------------------------------------------------------*/
  13. /* 包含的头文件 --------------------------------------------------------------*/
  14. #include "soft_iic.h"


  15. /************************************************
  16. 函数名称 : IIC_init
  17. 功    能 : iic初始化函数
  18. 参    数 : 无
  19. 返 回 值 : 无
  20. 作    者 : gaoxiao
  21. *************************************************/
  22. void IIC_init(void)
  23. {
  24.   iic_scl_out();
  25.   iic_sda_out();
  26. }

  27. /************************************************
  28. 函数名称 : IIC_Start
  29. 功    能 : iic起始函数
  30. 参    数 : 无
  31. 返 回 值 : 无
  32. 作    者 : gaoxiao
  33. *************************************************/
  34. void IIC_Start(void)
  35. {
  36.   iic_sda_out();

  37.   iic_sda_1();
  38.   iic_scl_1();
  39.   system_delay_100us(1);
  40.   iic_sda_0();
  41.   system_delay_100us(1);
  42.   iic_scl_0();
  43. }

  44. /************************************************
  45. 函数名称 : IIC_Stop
  46. 功    能 : iic结束函数
  47. 参    数 : 无
  48. 返 回 值 : 无
  49. 作    者 : gaoxiao
  50. *************************************************/
  51. void IIC_Stop(void)
  52. {
  53.   iic_sda_out();
  54.   iic_sda_0();
  55.   iic_scl_0();
  56.   system_delay_100us(1);
  57.   iic_sda_1();
  58.   iic_scl_1();
  59.   system_delay_100us(1);
  60. }

  61. /************************************************
  62. 函数名称 : IIC_Wait_Ack
  63. 功    能 : 等待应答信号到来
  64. 参    数 : 无
  65. 返 回 值 : 1,接收应答失败  0,接收应答成功
  66. 作    者 : gaoxiao
  67. *************************************************/
  68. uint8_t IIC_Wait_Ack(void)
  69. {
  70.   uint8_t ucErrTime = 0;
  71.   
  72.   iic_sda_in();

  73.   system_delay_100us(1);
  74.   iic_scl_1();
  75.   system_delay_100us(1);
  76.   while(iic_sda_read())
  77.   {
  78.     ucErrTime++;
  79.     if(ucErrTime > 50)
  80.     {
  81.       IIC_Stop();
  82.       return 1;
  83.     }
  84.     system_delay_100us(1);
  85.   }
  86.   iic_scl_0();
  87.   
  88.   return 0;
  89. }

  90. /************************************************
  91. 函数名称 : IIC_Ack
  92. 功    能 : 产生ACK应答信号
  93. 参    数 : cak 1:应答  2:无应答
  94. 返 回 值 : 无
  95. 作    者 : gaoxiao
  96. *************************************************/
  97. void IIC_Ack(uint8_t ack)
  98. {
  99.   iic_scl_0();
  100.   iic_sda_out();
  101.   
  102.   if(1 == ack) iic_sda_0();
  103.   else iic_sda_1();
  104.   
  105.   system_delay_100us(1);
  106.   iic_scl_1();
  107.   system_delay_100us(1);
  108.   iic_scl_0();
  109. }

  110. /************************************************
  111. 函数名称 : IIC_SendByte
  112. 功    能 : 写一个字节,from MSB to LSB
  113. 参    数 : data 数据
  114. 返 回 值 : 无
  115. 作    者 : gaoxiao
  116. *************************************************/
  117. uint8_t IIC_WriteByte(uint8_t data)
  118. {
  119.   uint8_t bits;
  120.   
  121.   iic_sda_out();
  122.   
  123.   for(uint8_t Loop_i = 0;Loop_i < 8;Loop_i ++)
  124.   {
  125.     bits = data&0x80;
  126.     if(0x80 == bits)
  127.     {
  128.       iic_sda_1();
  129.     }
  130.     else
  131.     {
  132.       iic_sda_0();
  133.     }
  134.     system_delay_100us(1);
  135.    
  136.     iic_scl_1();
  137.     system_delay_100us(1);
  138.     iic_scl_0();
  139.     data = data << 1;   
  140.   }

  141.   iic_sda_1();
  142.   
  143.   return IIC_Wait_Ack();//等待应答
  144. }

  145. /************************************************
  146. 函数名称 : IIC_ReadByte
  147. 功    能 : 读一个字节
  148. 参    数 : 无
  149. 返 回 值 : 数据
  150. 作    者 : gaoxiao
  151. *************************************************/
  152. uint8_t IIC_ReadByte(void)
  153. {
  154.   uint8_t data = 0;
  155.   
  156.   iic_sda_1();
  157.   iic_sda_in();
  158.   system_delay_100us(1);

  159.   for(uint8_t Loop_i = 0;Loop_i < 8;Loop_i ++)
  160.   {
  161.     iic_scl_1();
  162.     system_delay_100us(1);   
  163.     if(iic_sda_read())
  164.     {
  165.       data = (1 << 1)|data;
  166.     }
  167.     else
  168.     {
  169.       data = (0 << 1)|data;
  170.     }
  171.     system_delay_100us(1);
  172.     iic_scl_0();
  173.     system_delay_100us(1);
  174.   }

  175.   IIC_Ack(1);
  176.   
  177.   return data;
  178. }
复制代码

所有资料51hei提供下载:
soft_iic.7z (1.36 KB, 下载次数: 50)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:605144 发表于 2019-8-29 15:37 | 显示全部楼层
谢谢LZ分享,学习了
回复

使用道具 举报

ID:68189 发表于 2019-8-30 16:23 | 显示全部楼层
感谢楼主的分享,学习受教了.
回复

使用道具 举报

ID:1009545 发表于 2022-3-10 22:22 | 显示全部楼层
能用,不完整
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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