搜索
bottom↓
回复: 72

学习到I2C感觉底层和应用层都比较难,遇到的我的小瓶颈

[复制链接]

出0入0汤圆

发表于 2019-6-21 10:33:05 | 显示全部楼层 |阅读模式
        学习到I2C感觉底层和应用层都比较难,遇到的我的小瓶颈,没什么进步,懵逼了

顺带分享一下I2C总线规范中英文的都有,觉得中文翻译不好的可以直接看英文版的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-6-21 10:39:14 | 显示全部楼层
IIC有哪些觉得难的呢,太笼统了,

出0入29汤圆

发表于 2019-6-21 10:41:41 | 显示全部楼层
初学者还是老老实实的使用IO模拟的,先把IIC的时序搞的明明白白了,后面再使用MCU硬件IIC才是王道
连时序都不清楚,肯定难了

出0入0汤圆

 楼主| 发表于 2019-6-21 11:05:10 | 显示全部楼层
taboo 发表于 2019-6-21 10:39
IIC有哪些觉得难的呢,太笼统了,

单纯的看开发板上的运用I2C的温度传感器数码显示程序都觉得好吃力啊

出0入0汤圆

 楼主| 发表于 2019-6-21 11:05:59 | 显示全部楼层
sunrn123 发表于 2019-6-21 10:41
初学者还是老老实实的使用IO模拟的,先把IIC的时序搞的明明白白了,后面再使用MCU硬件IIC才是王道
连时序都 ...

那就是,建议先放弃这个知识点吗?

出0入0汤圆

发表于 2019-6-21 11:11:35 | 显示全部楼层
第1次听说i2c比较难的,那I2S就不要学 了,   USB就戒了吧

出0入0汤圆

 楼主| 发表于 2019-6-21 11:18:33 | 显示全部楼层
jjj 发表于 2019-6-21 11:11
第1次听说i2c比较难的,那I2S就不要学 了,   USB就戒了吧

哈~我就抱怨一下,依然会学习的 加油

出0入0汤圆

发表于 2019-6-21 11:18:54 | 显示全部楼层
搞个逻辑分析仪,效率高很多。

出0入0汤圆

发表于 2019-6-21 11:33:13 | 显示全部楼层
I2C这么基本的东西都觉得难?

出0入98汤圆

发表于 2019-6-21 11:37:50 | 显示全部楼层
找个8bit的DAC或者ADC看看源代码很快就学会了
比如PCF8591模块,
IO模拟IIC协议周立功有发过一个很详细的文档

出0入0汤圆

发表于 2019-6-21 11:43:18 | 显示全部楼层
IIC基本属于最简单的总线了。

出0入0汤圆

 楼主| 发表于 2019-6-21 12:20:08 | 显示全部楼层
flash3g 发表于 2019-6-21 11:33
I2C这么基本的东西都觉得难?

就很复杂的感觉,我多看看,应该有不同的感觉吧

出0入0汤圆

 楼主| 发表于 2019-6-21 12:21:15 | 显示全部楼层
aozima 发表于 2019-6-21 11:18
搞个逻辑分析仪,效率高很多。

逻辑分析仪,好像挺厉害的东西

出0入0汤圆

发表于 2019-6-21 12:21:29 | 显示全部楼层
买个逻辑分析仪就简单了

出0入0汤圆

 楼主| 发表于 2019-6-21 12:21:55 | 显示全部楼层
flash3g 发表于 2019-6-21 11:33
I2C这么基本的东西都觉得难?

就得复杂,我多学几天再来反馈

出0入0汤圆

 楼主| 发表于 2019-6-21 12:22:51 | 显示全部楼层
rclong 发表于 2019-6-21 11:37
找个8bit的DAC或者ADC看看源代码很快就学会了
比如PCF8591模块,
IO模拟IIC协议周立功有发过一个很详细的文 ...

好的,谢谢指导,我去找下看看

出0入0汤圆

 楼主| 发表于 2019-6-21 12:23:50 | 显示全部楼层
shiva_shiva 发表于 2019-6-21 11:43
IIC基本属于最简单的总线了。

好吧好吧,我在学习一段时间

出0入0汤圆

 楼主| 发表于 2019-6-21 12:24:47 | 显示全部楼层
flash3g 发表于 2019-6-21 12:21
买个逻辑分析仪就简单了

工作原理是什么?时序图分析,还是?

出0入0汤圆

发表于 2019-6-21 12:31:08 | 显示全部楼层
可以比较直观的看到时序图

出0入0汤圆

发表于 2019-6-21 12:35:44 | 显示全部楼层
i2c我也不喜欢,能用spi,绝不用i2c

出0入0汤圆

发表于 2019-6-21 12:44:03 | 显示全部楼层
i2c我也不喜欢,能用spi就用spi

出0入0汤圆

 楼主| 发表于 2019-6-21 13:03:34 | 显示全部楼层
bsz84 发表于 2019-6-21 12:44
i2c我也不喜欢,能用spi就用spi

好的,spi还没学到,我到了我比较一下

出0入0汤圆

发表于 2019-6-21 13:37:59 来自手机 | 显示全部楼层
大概率不是因为难,是因为懒

出0入0汤圆

 楼主| 发表于 2019-6-21 13:44:40 | 显示全部楼层
qiqirachel 发表于 2019-6-21 13:37
大概率不是因为难,是因为懒

没有啦,没有啦,我要继续学习

出0入0汤圆

发表于 2019-6-21 16:48:09 | 显示全部楼层
迅得电子 发表于 2019-6-21 11:18
哈~我就抱怨一下,依然会学习的 加油

加油
你会成功的

出0入0汤圆

发表于 2019-6-21 17:02:22 | 显示全部楼层
学了的心得,记得来分享下。

出0入0汤圆

 楼主| 发表于 2019-6-21 17:15:04 | 显示全部楼层
maxking 发表于 2019-6-21 17:02
学了的心得,记得来分享下。

好的,好的

出0入0汤圆

 楼主| 发表于 2019-6-21 17:15:52 | 显示全部楼层
jjj 发表于 2019-6-21 16:48
加油
你会成功的

谢谢,慢慢啃。

出0入0汤圆

 楼主| 发表于 2019-6-21 17:26:21 | 显示全部楼层
请教一下,I2C总线规范里的这句话说:其中一种情况是在SCL 线是高电平时SDA 线从高电平向低电平切换这个情况表示起始条件;当SCL 是高电平时SDA 线由低电平向高电平切换表示停止条件。
关于这一段代码的起始代码部分第7行代码为什么要将TM1640_SCLK设置为低电平呢?→GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0

  1. void TM1640_start(){ //通信时序 启始(基础GPIO操作)(低层)。                                      
  2.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1                  
  3.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1            
  4.         delay_us(DEL);                                                                                                              
  5.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0                            
  6.         delay_us(DEL);                                                                                                              
  7.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0                            
  8.         delay_us(DEL);                                                                                                                 
  9. }
  10. void TM1640_stop(){ //通信时序 结束(基础GPIO操作)(低层)
  11.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(0)); //接口输出0       
  12.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(1)); //接口输出高电平1       
  13.         delay_us(DEL);
  14.         GPIO_WriteBit(TM1640_GPIOPORT,TM1640_DIN,(BitAction)(1)); //接口输出高电平1       
  15.         delay_us(DEL);
  16. }
复制代码

出0入59汤圆

发表于 2019-6-21 18:02:34 | 显示全部楼层
flash3g 发表于 2019-6-21 11:33
I2C这么基本的东西都觉得难?

为啥这么基本的东西,STM32的硬件I2C都没有做好呢?

出0入12汤圆

发表于 2019-6-21 18:55:39 来自手机 | 显示全部楼层
I2C倒是不觉得难,我觉得 BLE 蓝牙很难 一大堆新词 反应不过来,单片机端怎么收发,PC或手机端怎样收发,,谁能科普一下就好了。

出0入0汤圆

发表于 2019-6-21 19:30:59 | 显示全部楼层
polarbear 发表于 2019-6-21 18:02
为啥这么基本的东西,STM32的硬件I2C都没有做好呢?

我用F0的I2C没问题,听说就F103的I2C不行,我没用过。

出0入0汤圆

发表于 2019-6-21 19:33:10 来自手机 | 显示全部楼层
103的iic我只用查询,加超时计数器,出问题了就复位iic重新初始化。

出0入0汤圆

发表于 2019-6-21 19:34:25 | 显示全部楼层
迅得电子 发表于 2019-6-21 17:26
请教一下,I2C总线规范里的这句话说:其中一种情况是在SCL 线是高电平时SDA 线从高电平向低电平切换这个情 ...
  1. static void Delay(void)
  2. {
  3.         uint8_t delay = 10;
  4.         while(delay --);
  5. }

  6. static void I2C_Start(void)
  7. {
  8.         I2C_SDA = 1;
  9.         I2C_SCK = 1;
  10.         Delay();
  11.         I2C_SDA = 0;
  12.         Delay();
  13. }

  14. //I2C写入1Byte,返回ACK=1
  15. static bit I2C_WriteByte(uint8_t dat)
  16. {
  17.         uint8_t cnt;
  18.         for(cnt=0x80; cnt!=0; cnt>>=1)
  19.         {
  20.                 I2C_SCK = 0;
  21.                 Delay();
  22.                 if(dat&cnt)I2C_SDA = 1;
  23.                 else I2C_SDA = 0;
  24.                 Delay();
  25.                 I2C_SCK = 1;
  26.                 Delay();
  27.         }
  28.         I2C_SCK = 0;
  29.         Delay();
  30.         I2C_SDA = 1;                        //释放SDA,接受ACK
  31.         Delay();
  32.         I2C_SCK = 1;
  33.         Delay();
  34.         return ~I2C_SDA;
  35. }

  36. //I2C读出1Byte,0=ACK;1=NACK回应从机
  37. static uint8_t I2C_ReadByte(bit ack)
  38. {
  39.         uint8_t dat = 0;
  40.         uint8_t cnt;
  41.         for(cnt=0; cnt!=8; cnt++)
  42.         {
  43.                 I2C_SCK = 0;
  44.                 I2C_SDA = 1;
  45.                 Delay();
  46.                 I2C_SCK = 1;
  47.                 Delay();
  48.                 dat <<= 1;       
  49.                 dat |= I2C_SDA;               
  50.         }
  51.         I2C_SCK = 0;
  52.         Delay();
  53.         I2C_SDA = ~ack;
  54.         Delay();
  55.         I2C_SCK = 1;
  56.         Delay();
  57.         return dat;
  58. }

  59. static void I2C_Stop(void)
  60. {
  61.         I2C_SCK = 0;
  62.         Delay();
  63.         I2C_SDA = 0;
  64.         Delay();
  65.         I2C_SCK = 1;
  66.         Delay();
  67.         I2C_SDA = 1;
  68.         Delay();
  69. }
复制代码


C51的模拟I2C给你参考一下

出0入0汤圆

发表于 2019-6-21 23:41:28 来自手机 | 显示全部楼层
刚学习单片机时 第一个接口写的就是i2c 当时也是觉得挺难的 现在eeprom程序经过kk级的验证 都懒的多看一眼

出0入0汤圆

发表于 2019-6-21 23:54:01 来自手机 | 显示全部楼层
能用硬件就用硬件的吧!软件太慢了也耗cpu

出0入0汤圆

发表于 2019-6-22 05:36:27 来自手机 | 显示全部楼层
楼主,看一下你的代码和34楼的代码,哪个清晰一点?你的代码用宏替换后,可以和34楼一样的,注意sda脚的输入/输出切换

出0入0汤圆

 楼主| 发表于 2019-6-22 08:32:54 | 显示全部楼层
polarbear 发表于 2019-6-21 18:02
为啥这么基本的东西,STM32的硬件I2C都没有做好呢?

刚学,我会努力的

出0入0汤圆

 楼主| 发表于 2019-6-22 08:34:30 | 显示全部楼层
flash3g 发表于 2019-6-21 19:30
我用F0的I2C没问题,听说就F103的I2C不行,我没用过。

我用的就是F103

出0入0汤圆

 楼主| 发表于 2019-6-22 08:42:36 | 显示全部楼层
XA144F 发表于 2019-6-21 19:33
103的iic我只用查询,加超时计数器,出问题了就复位iic重新初始化。

我用的就是F103的,F103的IIC有什么特别之处吗?

出0入0汤圆

 楼主| 发表于 2019-6-22 08:53:48 | 显示全部楼层
flash3g 发表于 2019-6-21 19:34
C51的模拟I2C给你参考一下

哥,你这个为什么这么复杂,有点没看懂,你看看我的第7行代码为什么又将SCLK设置成低电平,有什么作用吗?

出0入0汤圆

 楼主| 发表于 2019-6-22 08:57:03 | 显示全部楼层
muniao 发表于 2019-6-21 23:54
能用硬件就用硬件的吧!软件太慢了也耗cpu

硬件不考虑芯片引脚的问题?

出0入0汤圆

 楼主| 发表于 2019-6-22 08:58:57 | 显示全部楼层
TANK99 发表于 2019-6-22 05:36
楼主,看一下你的代码和34楼的代码,哪个清晰一点?你的代码用宏替换后,可以和34楼一样的,注意sda脚的输 ...

我觉得,我的代码更清晰,我想问一下你我的第7行代码为什么又将SCLK设置成低电平,有什么作用吗?
GPIO_WriteBit(TM1640_GPIOPORT,TM1640_SCLK,(BitAction)(0)); //接口输出0   

出0入0汤圆

发表于 2019-6-22 14:29:45 | 显示全部楼层
基础的接口,IIS比IIC还要复杂

出0入0汤圆

发表于 2019-6-22 14:29:56 | 显示全部楼层
把协议弄懂就简单了

出0入91汤圆

发表于 2019-6-22 14:47:23 | 显示全部楼层
I2C 说难的其实都是沉不下心来学习的,   I2C 无非就是 START  STOP 信号 ,再加中间的数据

出0入0汤圆

发表于 2019-6-22 23:49:50 | 显示全部楼层
迅得电子 发表于 2019-6-22 08:53
哥,你这个为什么这么复杂,有点没看懂,你看看我的第7行代码为什么又将SCLK设置成低电平,有什么作用吗 ...

SCLK置低是为了给SDA准备数据

出0入0汤圆

发表于 2019-6-22 23:51:30 | 显示全部楼层
看下这个
https://blog.csdn.net/lingfeng5/article/details/73361833

出0入0汤圆

发表于 2019-6-22 23:55:41 | 显示全部楼层
iic想做好不容易的 要兼容各个厂家芯片协议还是要花点时间的

出0入0汤圆

发表于 2019-6-23 10:29:30 | 显示全部楼层
迅得电子 发表于 2019-6-22 08:57
硬件不考虑芯片引脚的问题?

得画原理图的时候就考虑啊

出0入0汤圆

发表于 2019-6-23 21:44:21 | 显示全部楼层
polarbear 发表于 2019-6-21 18:02
为啥这么基本的东西,STM32的硬件I2C都没有做好呢?

因为使用正版的 I2C 需要付版权费

出0入59汤圆

发表于 2019-6-24 08:15:43 | 显示全部楼层
tyustli 发表于 2019-6-23 21:44
因为使用正版的 I2C 需要付版权费

那为啥不见 AVR 的,STM8 的,STC的,TI的,NXP 的CPU的 I2C 的总线出问题?

出0入0汤圆

 楼主| 发表于 2019-6-24 08:31:51 | 显示全部楼层
hzyzs 发表于 2019-6-22 14:29
基础的接口,IIS比IIC还要复杂

更复杂吗

出0入0汤圆

 楼主| 发表于 2019-6-24 08:32:33 | 显示全部楼层
laoshuhunya 发表于 2019-6-22 14:29
把协议弄懂就简单了

协议吗?我查查

出0入0汤圆

 楼主| 发表于 2019-6-24 08:33:51 | 显示全部楼层
ackyee 发表于 2019-6-22 14:47
I2C 说难的其实都是沉不下心来学习的,   I2C 无非就是 START  STOP 信号 ,再加中间的数据 ...

好的,我静下心学习一下

出0入0汤圆

 楼主| 发表于 2019-6-24 08:34:33 | 显示全部楼层
flash3g 发表于 2019-6-22 23:51
看下这个
https://blog.csdn.net/lingfeng5/article/details/73361833

好的,谢谢大佬

出0入4汤圆

发表于 2019-6-24 08:39:57 | 显示全部楼层
迅得电子 发表于 2019-6-21 12:21
逻辑分析仪,好像挺厉害的东西

前两天周未,花了一天的时间才搞定AT24C04
是掉坑里了。

一开始准备使用renesas的自带IIC硬件驱动,后来不想折腾了,还是用的IO模拟。

出0入0汤圆

 楼主| 发表于 2019-6-24 08:46:19 | 显示全部楼层
laujc 发表于 2019-6-24 08:39
前两天周未,花了一天的时间才搞定AT24C04
是掉坑里了。

要学的东西太多了吗?还是觉得有点难解决

出0入4汤圆

发表于 2019-6-24 09:12:12 | 显示全部楼层
迅得电子 发表于 2019-6-24 08:46
要学的东西太多了吗?还是觉得有点难解决

不多,都说是掉坑里了。正常情况我1小时可以搞定的。

LZ,你有示波器,或逻辑分析仪,有仿真器等工具吗?如果都有,看着协议,一个小时应该也可以搞得定。

如果没有,就不好说了,看个人运气。

出0入8汤圆

发表于 2019-6-24 09:15:43 | 显示全部楼层
时序,延时稍微加长点。现在都硬件IIC了,不需要调软件了。

出0入0汤圆

 楼主| 发表于 2019-6-24 09:22:40 | 显示全部楼层
laujc 发表于 2019-6-24 09:12
不多,都说是掉坑里了。正常情况我1小时可以搞定的。

LZ,你有示波器,或逻辑分析仪,有仿真器等工具吗 ...

这些都没有 现在看视频搞开发板,这些东西暂时还没有,暂时也买不起

出0入0汤圆

 楼主| 发表于 2019-6-24 09:23:11 | 显示全部楼层
harold 发表于 2019-6-24 09:15
时序,延时稍微加长点。现在都硬件IIC了,不需要调软件了。

直接硬件实现吗?

出0入4汤圆

发表于 2019-6-24 09:38:55 | 显示全部楼层
迅得电子 发表于 2019-6-24 09:22
这些都没有 现在看视频搞开发板,这些东西暂时还没有,暂时也买不起 ...

工欲善其事,必先利其器。

没有工具,调试起来只能靠猜。本来一分钟搞定的事情,可能你一天都高不定,慢慢就没有信心搞下去了。

出0入0汤圆

 楼主| 发表于 2019-6-24 09:43:50 | 显示全部楼层
laujc 发表于 2019-6-24 09:38
工欲善其事,必先利其器。

没有工具,调试起来只能靠猜。本来一分钟搞定的事情,可能你一天都高不定,慢 ...

出来实习,工资低,租房又贵,基本解决温饱。

出0入0汤圆

发表于 2019-6-24 13:01:48 | 显示全部楼层
买个带逻辑分析仪的示波器  2w多点的  一举两得

出0入0汤圆

 楼主| 发表于 2019-6-24 13:11:23 | 显示全部楼层
haffman1 发表于 2019-6-24 13:01
买个带逻辑分析仪的示波器  2w多点的  一举两得

我现在只能解决温饱

出0入8汤圆

发表于 2019-6-24 13:22:10 来自手机 | 显示全部楼层
迅得电子 发表于 2019-6-24 09:43
出来实习,工资低,租房又贵,基本解决温饱。

让公司买,不是你自己买
如果公司不肯买,就换一个有这些设备的公司
因为你在一个没有这些设备的公司呆10年
不如在一个有这些设备的公司呆1个月

出0入0汤圆

 楼主| 发表于 2019-6-24 14:01:28 | 显示全部楼层
canspider 发表于 2019-6-24 13:22
让公司买,不是你自己买
如果公司不肯买,就换一个有这些设备的公司
因为你在一个没有这些设备的公司呆10 ...

好的,谢谢,我申请试试

出0入0汤圆

发表于 2019-9-2 22:03:15 来自手机 | 显示全部楼层
搞个简易分析仪吧,前期可以那示波器对照datasheet一点点分析进步会很快的

出0入0汤圆

发表于 2019-9-3 00:38:52 来自手机 | 显示全部楼层
spi确实比IIC好调

出0入0汤圆

发表于 2019-9-3 07:21:09 来自手机 | 显示全部楼层
I2C还觉得难?你得赶紧到门里来,别老站在外面

出0入0汤圆

发表于 2019-9-3 13:00:49 | 显示全部楼层
1!!!!!!!!!!!!!!!!!!

出0入4汤圆

发表于 2019-9-3 13:12:35 | 显示全部楼层
i2c我觉得比较麻烦又发又收,但逻辑很简单。跳过I2C学spi吧这个容易。而且i2c的除了eeprom其他很少用到。usb和i2c比起来那就是高楼大厦和狗窝的区别。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 09:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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