GD32 模拟IIC程序驱动

[复制链接]
179|4
 楼主 | 2019-1-31 10:00 | 显示全部楼层 |阅读模式
通过GD32单片机两个普通IO口模拟IIC程序
  1. #ifndef __PLATFORM_IIC_H__
  2. #define __PLATFORM_IIC_H__

  3. #define IIC_ACK     0x00
  4. #define IIC_NACK    0x01

  5. void iic_init(void);
  6. void iic_start(void);
  7. void iic_stop(void);
  8. unsigned char iic_read_byte(void);
  9. void iic_write_byte(unsigned char data);
  10. unsigned char iic_wait_ack(void);
  11. void iic_ack(unsigned char ack_nack);



  12. #endif

  13. ---------------------
复制代码


 楼主 | 2019-1-31 10:01 | 显示全部楼层

  1. /*******************************************************************************
  2. file : platform_iic.c
  3. author : huohongpeng
  4. date : 2017-02-23
  5. description : application for IIC, base on gd lib (GPIO)
  6. *******************************************************************************/
  7. #include "platform_iic.h"
  8. #include "platform_delay.h"
  9. #include "gd32f1x0.h"


  10. #define iic_printf printf("[%d-%s()] : ",__LINE__, __FUNCTION__);printf

  11. /**
  12. description : IIC delay us function interface
  13. param :  us - microsecond count
  14. retval : None
  15. author : huohongpeng
  16. date : 2017-02-23
  17. */
  18. static void iic_delay_us(int us)
  19. {
  20.     delay_us(us);
  21. }

  22. /**
  23. description : IIC SCL to high
  24. param :  None
  25. retval : None
  26. author : huohongpeng
  27. date : 2017-02-23
  28. */
  29. static void iic_scl_h(void)
  30. {
  31.     GPIO_SetBits(GPIOB, GPIO_PIN_13);
  32. }

  33. /**
  34. description : IIC SCL to low
  35. param :  None
  36. retval : None
  37. author : huohongpeng
  38. date : 2017-02-23
  39. */
  40. static void iic_scl_l(void)
  41. {
  42.     GPIO_ResetBits(GPIOB, GPIO_PIN_13);
  43. }

  44. /**
  45. description : IIC write one bit data to sda
  46. param :  bit - 0, 1
  47. retval : None
  48. author : huohongpeng
  49. date : 2017-02-23
  50. */
  51. static void iic_write_sda(unsigned char bit)
  52. {
  53.     if(bit == 0)
  54.     {
  55.         GPIO_ResetBits(GPIOB, GPIO_PIN_15);
  56.     }
  57.     else   
  58.     {
  59.         GPIO_SetBits(GPIOB, GPIO_PIN_15);
  60.     }
  61. }

  62. /**
  63. description : IIC read one bit data to sda
  64. param :  None
  65. retval : bit - 0, 1
  66. author : huohongpeng
  67. date : 2017-02-23
  68. */
  69. static unsigned char iic_read_sda(void)
  70. {
  71.     if(GPIO_ReadInputBit(GPIOB, GPIO_PIN_15) == Bit_SET)
  72.     {
  73.         return 0x01;
  74.     }
  75.     else
  76.     {
  77.         return 0x00;
  78.     }  
  79. }

  80. /**
  81. description : IIC SCL and SDA init
  82. param :  None
  83. retval : None
  84. author : huohongpeng
  85. date : 2017-02-23
  86. */
  87. void iic_init(void)
  88. {
  89.     GPIO_InitPara GPIO_InitParaStruct;

  90.     /* iic interface */
  91.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);

  92.     GPIO_InitParaStruct.GPIO_Mode = GPIO_MODE_OUT;      
  93.     GPIO_InitParaStruct.GPIO_PuPd = GPIO_PUPD_PULLUP;
  94.     GPIO_InitParaStruct.GPIO_Speed = GPIO_SPEED_50MHZ;
  95.     GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_PP;
  96.     GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_13;  
  97.     GPIO_Init(GPIOB, &GPIO_InitParaStruct);

  98.     GPIO_InitParaStruct.GPIO_OType = GPIO_OTYPE_OD;
  99.     GPIO_InitParaStruct.GPIO_Pin = GPIO_PIN_15;
  100.     GPIO_Init(GPIOB, &GPIO_InitParaStruct);

  101.     GPIO_SetBits(GPIOB, GPIO_PIN_13);
  102.     GPIO_SetBits(GPIOB, GPIO_PIN_15);

  103. }

  104. /**
  105. description : IIC send start
  106. param :  None
  107. retval : None
  108. author : huohongpeng
  109. date : 2017-02-23
  110. */
  111. void iic_start(void)
  112. {
  113.     iic_write_sda(1);
  114.     iic_scl_h();
  115.     iic_delay_us(1);

  116.     iic_write_sda(0);
  117.     iic_delay_us(1);

  118.     iic_scl_l();
  119.     iic_delay_us(1);
  120. }

  121. /**
  122. description : IIC send stop
  123. param :  None
  124. retval : None
  125. author : huohongpeng
  126. date : 2017-02-23
  127. */
  128. void iic_stop(void)
  129. {
  130.     iic_scl_l();
  131.     iic_delay_us(1);
  132.     iic_write_sda(0);

  133.     iic_scl_h();
  134.     iic_delay_us(1);

  135.     iic_write_sda(1);
  136.     iic_delay_us(1);
  137. }

  138. /**
  139. description : IIC read one byte data
  140. param :  None
  141. retval : one byte data
  142. author : huohongpeng
  143. date : 2017-02-23
  144. */
  145. unsigned char iic_read_byte(void)
  146. {
  147.     int i, data;

  148.     for(i = 0, data = 0; i < 8; i++)
  149.     {
  150.         data <<= 1;
  151.         iic_scl_h();
  152.         iic_delay_us(1);
  153.         data |= iic_read_sda();
  154.         iic_scl_l();
  155.         iic_delay_us(1);
  156.     }

  157.     return data;
  158. }

  159. /**
  160. description : IIC write one byte data
  161. param :  one byte data
  162. retval : None
  163. author : huohongpeng
  164. date : 2017-02-23
  165. */
  166. void iic_write_byte(unsigned char data)
  167. {
  168.     int i;

  169.     for(i = 0; i < 8; i++)
  170.     {
  171.         iic_write_sda((data & 0x80)>>7);
  172.         iic_delay_us(1);
  173.         iic_scl_h();
  174.         iic_delay_us(1);
  175.         iic_scl_l();
  176.         iic_delay_us(1);
  177.         data <<= 1;
  178.     }

  179. }

  180. /**
  181. description : IIC wait device ack
  182. param :  None
  183. retval : 0 - success
  184.          1 - error
  185. author : huohongpeng
  186. date : 2017-02-23
  187. */
  188. unsigned char iic_wait_ack(void)
  189. {
  190.     iic_write_sda(0x01);
  191.     iic_delay_us(1);
  192.     iic_scl_h();
  193.     iic_delay_us(1);
  194.    
  195.     if(iic_read_sda() == 0)
  196.     {
  197.         iic_scl_l();
  198.         iic_delay_us(1);

  199.         return 0;
  200.     }
  201.     else
  202.     {
  203.         iic_printf("stop \r\n");
  204.         iic_stop();
  205.         return 1;
  206.     }
  207. }

  208. /**
  209. description : IIC send ack or nack to device
  210. param :  None
  211. retval : None
  212. author : huohongpeng
  213. date : 2017-02-23
  214. */
  215. void iic_ack(unsigned char ack_nack)
  216. {
  217.     iic_write_sda(ack_nack);
  218.     iic_delay_us(1);
  219.     iic_scl_h();
  220.     iic_delay_us(1);
  221.     iic_scl_l();
  222.     iic_delay_us(1);
  223. }

  224. ---------------------
复制代码
| 2019-2-9 10:25 | 显示全部楼层
外设用的什么芯片啊
| 2019-2-24 23:24 | 显示全部楼层
这个需要延时处理的
| 2019-2-24 23:25 | 显示全部楼层
看程序上是延时1us的进行信号的电平变化的
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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