myiic.c.bak 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "myiic.h"
  2. #include "delay.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  5. //ALIENTEK STM32F103开发板
  6. //IIC驱动代码
  7. //正点原子@ALIENTEK
  8. //技术论坛:www.openedv.com
  9. //创建日期:2017/5/30
  10. //版本:V1.0
  11. //版权所有,盗版必究。
  12. //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  13. //All rights reserved
  14. //////////////////////////////////////////////////////////////////////////////////
  15. //IIC初始化
  16. void IIC_Init(void)
  17. {
  18. GPIO_InitTypeDef GPIO_Initure;
  19. __HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
  20. __HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOB时钟
  21. //PH4,5初始化设置
  22. GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;
  23. GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
  24. GPIO_Initure.Pull=GPIO_PULLUP; //上拉
  25. GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
  26. HAL_GPIO_Init(GPIOB,&GPIO_Initure);
  27. IIC_SDA=1;
  28. IIC_SCL=1;
  29. }
  30. //产生IIC起始信号
  31. void IIC_Start(void)
  32. {
  33. SDA_OUT(); //sda线输出
  34. IIC_SDA=1;
  35. IIC_SCL=1;
  36. delay_us(4);
  37. IIC_SDA=0;//START:when CLK is high,DATA change form high to low
  38. delay_us(4);
  39. IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
  40. }
  41. //产生IIC停止信号
  42. void IIC_Stop(void)
  43. {
  44. SDA_OUT();//sda线输出
  45. IIC_SCL=0;
  46. IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
  47. delay_us(4);
  48. IIC_SCL=1;
  49. IIC_SDA=1;//发送I2C总线结束信号
  50. delay_us(4);
  51. }
  52. //等待应答信号到来
  53. //返回值:1,接收应答失败
  54. // 0,接收应答成功
  55. u8 IIC_Wait_Ack(void)
  56. {
  57. u8 ucErrTime=0;
  58. SDA_IN(); //SDA设置为输入
  59. IIC_SDA=1;delay_us(1);
  60. IIC_SCL=1;delay_us(1);
  61. while(READ_SDA)
  62. {
  63. ucErrTime++;
  64. if(ucErrTime>250)
  65. {
  66. IIC_Stop();
  67. return 1;
  68. }
  69. }
  70. IIC_SCL=0;//时钟输出0
  71. return 0;
  72. }
  73. //产生ACK应答
  74. void IIC_Ack(void)
  75. {
  76. IIC_SCL=0;
  77. SDA_OUT();
  78. IIC_SDA=0;
  79. delay_us(2);
  80. IIC_SCL=1;
  81. delay_us(2);
  82. IIC_SCL=0;
  83. }
  84. //不产生ACK应答
  85. void IIC_NAck(void)
  86. {
  87. IIC_SCL=0;
  88. SDA_OUT();
  89. IIC_SDA=1;
  90. delay_us(2);
  91. IIC_SCL=1;
  92. delay_us(2);
  93. IIC_SCL=0;
  94. }
  95. //IIC发送一个字节
  96. //返回从机有无应答
  97. //1,有应答
  98. //0,无应答
  99. void IIC_Send_Byte(u8 txd)
  100. {
  101. u8 t;
  102. SDA_OUT();
  103. IIC_SCL=0;//拉低时钟开始数据传输
  104. for(t=0;t<8;t++)
  105. {
  106. IIC_SDA=(txd&0x80)>>7;
  107. txd<<=1;
  108. delay_us(2); //对TEA5767这三个延时都是必须的
  109. IIC_SCL=1;
  110. delay_us(2);
  111. IIC_SCL=0;
  112. delay_us(2);
  113. }
  114. }
  115. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
  116. u8 IIC_Read_Byte(unsigned char ack)
  117. {
  118. unsigned char i,receive=0;
  119. SDA_IN();//SDA设置为输入
  120. for(i=0;i<8;i++ )
  121. {
  122. IIC_SCL=0;
  123. delay_us(2);
  124. IIC_SCL=1;
  125. receive<<=1;
  126. if(READ_SDA)receive++;
  127. delay_us(1);
  128. }
  129. if (!ack)
  130. IIC_NAck();//发送nACK
  131. else
  132. IIC_Ack(); //发送ACK
  133. return receive;
  134. }