ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

GPIO模拟IIC,可读可写,已验证

2022-06-17 12:33:46  阅读:118  来源: 互联网

标签:IIC void IIC0 Delay SCL0 可读 SDA0 GPIO


  1 #include "iic.h"
  2 
  3 void IIC0_Delay(u32 count)
  4 {
  5     for(uint32_t i= count*3;i>0;i--){}
  6     //Sys_HardDelayUs(count);
  7     //rt_thread_mdelay(1);
  8 }
  9 void SCL0_OUT(void)
 10 {
 11     gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
 12 }
 13 void SDA0_OUT(void)
 14 {
 15     gpio_init(GPIOB, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
 16 }
 17 void SDA0_IN(void)
 18 {
 19     gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
 20 }
 21 void IIC0_Start(void)
 22 {
 23     SDA0_OUT();
 24     SCL0(1);
 25     SDA0(1);
 26     IIC0_Delay(5);
 27     SDA0(0);
 28     IIC0_Delay(5);
 29     SCL0(0);
 30 }
 31 void IIC0_Stop(void)
 32 {
 33     SDA0_OUT();
 34     SCL0(0);
 35     SDA0(0);
 36     //IIC0_Delay(2);
 37     SCL0(1);
 38     IIC0_Delay(5);
 39     SDA0(1);
 40     IIC0_Delay(5);
 41     //SCL0(0);
 42 }
 43 
 44 
 45 u8 IIC0_Wait_Ack(void)
 46 {
 47     u16 cnt=0;
 48 
 49     SDA0(1);
 50     IIC0_Delay(5);
 51     SCL0(1);
 52     IIC0_Delay(5);
 53     SDA0_IN();
 54     while(READ_SDA0())
 55     {
 56         cnt++;
 57         IIC0_Delay(1);
 58         if(cnt>1000)
 59         {
 60         IIC0_Stop();
 61         return 1;
 62         }
 63     }
 64 
 65     SCL0(0);
 66     SDA0_OUT();
 67     SDA0(0);
 68     return 0;
 69 }
 70 
 71 
 72 void IIC0_write_Byte(u8 data)
 73 {
 74     u8 i;
 75     SCL0(0);
 76     IIC0_Delay(2);
 77     for(i = 0; i < 8; i++)
 78     {
 79         if((data & 0x80))
 80         {
 81             SDA0(1);
 82         }
 83         else
 84         {
 85             SDA0(0);
 86         }
 87 
 88         data <<= 1;
 89         //SCL0(0);
 90         IIC0_Delay(2);
 91         SCL0(1);
 92         IIC0_Delay(2);
 93         SCL0(0);
 94         IIC0_Delay(2);
 95     }
 96 }
 97 void IIC0_Write(u8* data,u32 len)
 98 {
 99     u8 ret=0;
100     IIC0_Start();
101     while(len)
102     {
103         len--;
104         IIC0_write_Byte(*data);
105         ret = IIC0_Wait_Ack();
106         if(ret)
107         {
108             //break;
109         }
110         data++;
111     }
112     IIC0_Stop();
113 }
114 void IIC0_Ack(void)
115 {
116     SCL0(0);
117     SDA0_OUT();
118     SDA0(0);
119     IIC0_Delay(2);
120     SCL0(1);
121     IIC0_Delay(2);
122     SCL0(0);
123 }
124 void IIC0_NAck(void)
125 {
126     SCL0(0);
127     SDA0_OUT();
128     SDA0(1);
129     IIC0_Delay(2);
130     SCL0(1);
131     IIC0_Delay(2);
132     SCL0(0);
133 
134 }
135 u8 IIC0_Read_Byte(u8 ack)
136 {
137     u8 i=0;
138     u8 bit=0;
139     u8 data=0;
140     SDA0_IN();
141     for(i=0;i<8;i++)
142     {
143         SCL0(0);
144         IIC0_Delay(2);
145         bit = READ_SDA0();
146         SCL0(1);
147         IIC0_Delay(2);
148         data |= (bit<<(7-i));
149     }
150     if(ack)
151     {
152         IIC0_Ack();
153     }
154     else
155     {
156         IIC0_NAck();
157     }
158     return data;
159 }
160 
161 void IIC0_Read(u8* data,u32 len,u8*out)
162 {
163     u8 i=0;
164     u8 ret=0;
165     IIC0_Start();
166     while(i<2)//slave address bit0=Write,register address write
167     {
168 
169         IIC0_write_Byte(*data);
170         ret = IIC0_Wait_Ack();
171         if(ret)
172         {
173         break;
174         }
175         i++;
176         data++;
177     }
178     IIC0_Start();
179     do//slave address bit0=Read
180     {
181         IIC0_write_Byte(*data);
182         ret = IIC0_Wait_Ack();
183         if(ret)
184         {
185         break;
186         }
187     }while(0);
188     while(len)
189     {
190         len--;
191         *out = IIC0_Read_Byte(len);// if(len==0),NACK;if (len!=0),ACK;
192         if(!len)break;
193         out++;
194     }
195     IIC0_Stop();
196     return;
197 }
198 
199 void i2c0_soft_init(void)
200 {
201     SCL0_OUT();
202     SDA0_OUT();
203 }
204 
205  

 

标签:IIC,void,IIC0,Delay,SCL0,可读,SDA0,GPIO
来源: https://www.cnblogs.com/ycpkbql/p/16385321.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有