搜索
bottom↓
楼主: Appcat

被STM32的I2C调戏了两天,终于花半小时用模拟I2C将其消灭,公布代码

  [复制链接]

出0入0汤圆

发表于 2011-6-9 17:50:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-11 23:03:10 | 显示全部楼层
标记一下,以后再修炼

出0入0汤圆

发表于 2011-6-11 23:26:57 | 显示全部楼层
stm32没跳过 stm8的我倒是调通了。但是不稳定,老是死在寄存器判断的地方。
我自以为是时钟的为你,按照pc8563的芯片修改时钟还是不行。上电后时钟还是不稳定。加上超时处理后还是不稳定。最后没办法换成模拟的了。不知道楼主有没有什么特别的方法

出0入0汤圆

发表于 2011-6-20 16:35:57 | 显示全部楼层
下回再试试硬件i2c
mark

出0入0汤圆

发表于 2011-6-20 17:08:05 | 显示全部楼层
mark I2C问题

出0入0汤圆

发表于 2011-6-20 22:23:05 | 显示全部楼层
remind

出0入0汤圆

发表于 2011-6-21 09:37:31 | 显示全部楼层
这么可怕么?

出0入0汤圆

发表于 2011-6-21 09:45:08 | 显示全部楼层
哪个稳定就用哪个吧,谢谢楼主!

出0入0汤圆

发表于 2011-6-21 11:48:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-25 08:00:50 | 显示全部楼层
不错,MARK

出0入0汤圆

发表于 2011-6-25 08:23:20 | 显示全部楼层
lookandmark

出0入0汤圆

发表于 2011-6-25 09:07:12 | 显示全部楼层
mark~~~

出0入0汤圆

发表于 2011-6-25 09:47:39 | 显示全部楼层
STM32 I2C mark.

出0入0汤圆

发表于 2011-7-1 13:31:55 | 显示全部楼层
MARK 正在调

出0入0汤圆

发表于 2011-7-12 23:52:13 | 显示全部楼层
回复【4楼】Appcat 苹果猫
-----------------------------------------------------------------------

I2C天生被模拟的,很多单片机的硬件I2C都很蛋疼

出0入0汤圆

发表于 2011-7-13 10:17:28 | 显示全部楼层
回复【83楼】vilin_li  
-----------------------------------------------------------------------

请问一下,硬件的iic和软件的iic的速度到底差了多少?

出0入0汤圆

发表于 2011-7-14 11:04:59 | 显示全部楼层
看得俺心里真不是滋味,不知道ST是怎么搞的,对于想用I2C又没有入门的人来说。

出0入0汤圆

发表于 2011-7-14 13:05:52 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2011-7-14 16:18:02 | 显示全部楼层
STM32的I2C就是这毛病~!呵呵,软件模似还是比较好用~!

出0入0汤圆

发表于 2011-7-14 16:26:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-15 14:56:33 | 显示全部楼层
唉,看了之后我表示很失望,原来硬件IIC还有这种潜在问题!

出0入0汤圆

发表于 2011-7-25 11:23:39 | 显示全部楼层
不知道STM的I2C例程是不是不通用的啊,对于不同的I2C器件,有什么地方需要特别注意的,反正我是用STM的硬件对IIC器件进行通信没有成功……看了一下官方提供的STM32F10xx产品优化的I²C例程,没研究透,现上传:
STM32F10xx产品优化的I²C例程ourdev_660836F1XVP3.zip(文件大小:3.15M) (原文件名:STM32F10xx产品优化的I²C例程.zip)

出0入0汤圆

发表于 2011-7-25 12:06:59 | 显示全部楼层
楼主没试试STM提供的函数库,好的人说驱动有问题,我用测试库试过,出现死锁现象,数据读写不完全!

出0入0汤圆

发表于 2011-7-25 12:10:02 | 显示全部楼层
mark~~

出0入0汤圆

发表于 2011-7-25 12:24:39 | 显示全部楼层
楼主代码还是不够通用,当然一般没有特殊要求也就这么用了

出0入0汤圆

发表于 2011-7-25 13:38:35 | 显示全部楼层
m

出0入0汤圆

发表于 2011-7-25 18:16:44 | 显示全部楼层
同意

出0入0汤圆

发表于 2011-8-18 16:49:31 | 显示全部楼层
mark34楼

出0入0汤圆

发表于 2011-8-18 17:09:13 | 显示全部楼层
st的例程玩玩可以,直接使用会有问题。
暂时还未遇到stm32的硬件bug,不过对于它的硬件iic接口,一定得有防守程序,以防止意外(不被程序设计者预期的)情况发生;使用如“  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); ”这样的编程方式,可能会因外部器件、总线受到干扰等原因导致iic总线被锁死而跳不出来,需要主动复位总线,重新建立通讯模式。

出0入0汤圆

发表于 2011-8-20 12:12:27 | 显示全部楼层
学习

出0入0汤圆

发表于 2011-9-4 15:27:44 | 显示全部楼层
mark 同被调戏了几天

出0入0汤圆

发表于 2011-9-17 09:45:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-17 16:17:17 | 显示全部楼层
好的芯片的硬件iic,做起来比模拟还难做,不知怎么设计的;

出0入0汤圆

发表于 2011-9-17 21:01:32 | 显示全部楼层
IIC好像是有BUG,我的硬件IIC在我的FSMC模块一开起来,连时钟信号都不输出了~~~

出0入0汤圆

发表于 2011-9-17 23:13:22 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-9-18 01:25:34 | 显示全部楼层
我用自带的I2C能通,开始搞了半天没反应,后来发现是我自己没把GPIOB的时钟打开

出0入0汤圆

发表于 2011-9-18 20:44:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-19 08:19:28 | 显示全部楼层
楼主比较幸运,才被 调戏 了两天,我在搞STM32的I2C的时候真是一天接这一天啊。那个时候是用STM32和STM8通过I2C传数据,搞了有大半个月,不过最终成功了,用中断实现的。其实,ST片子的I2C还是很好用的,只有你深入理解了才行,至于官方给的例程,只能是帮你学习理解和练习的,要应用,还需做适当的修改。

出0入0汤圆

发表于 2011-9-19 08:49:01 | 显示全部楼层
好东西

出0入0汤圆

发表于 2011-9-19 16:45:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-24 21:32:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-25 20:44:27 | 显示全部楼层
STM32的IIC很鸡肋。。。。

出0入0汤圆

发表于 2011-9-29 22:27:36 | 显示全部楼层
模拟的 比较好, 网上参考程序 一大把啊!

出0入0汤圆

发表于 2011-10-2 21:20:41 | 显示全部楼层
纠结中,不知道我公司的同事都很排斥使用库函数!

出0入0汤圆

发表于 2011-10-11 20:24:05 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-10-12 00:15:17 | 显示全部楼层
马克

出0入0汤圆

发表于 2011-10-12 11:04:25 | 显示全部楼层
我也用过stm8的i2c,感觉他的硬件i2c是一个没做完的东西. 很容易就出怪事.

出0入0汤圆

发表于 2011-10-19 11:20:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-19 12:46:23 | 显示全部楼层
硬件IIC没有问题,就是初始化麻烦

出0入0汤圆

发表于 2011-10-19 15:40:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-19 19:39:23 | 显示全部楼层
好贴,学习

出0入0汤圆

发表于 2011-10-19 23:45:30 | 显示全部楼层
MARK!!!

出0入0汤圆

发表于 2011-10-20 09:04:57 | 显示全部楼层
还在学习中

出0入0汤圆

发表于 2011-11-3 23:31:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-4 08:52:38 | 显示全部楼层
Mark

出0入0汤圆

发表于 2011-11-4 10:03:40 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-5 13:11:19 | 显示全部楼层
模拟的也可以。。。记号啊。

出0入0汤圆

发表于 2011-12-3 12:42:12 | 显示全部楼层
MARK

出0入13汤圆

发表于 2011-12-3 12:45:59 | 显示全部楼层
这个标记下,很有用呢

出0入0汤圆

发表于 2011-12-3 17:30:24 | 显示全部楼层
飘过

出75入4汤圆

发表于 2011-12-3 22:24:30 | 显示全部楼层
下来直接用了。

出0入0汤圆

发表于 2011-12-4 00:42:09 | 显示全部楼层
学习了

出0入30汤圆

发表于 2012-2-3 15:52:57 | 显示全部楼层
mark.

出0入0汤圆

发表于 2012-2-10 20:47:08 | 显示全部楼层
同MARK,也遇到问题,现在还不敢用硬件IIC

出0入0汤圆

发表于 2012-2-11 09:48:51 | 显示全部楼层
Mark

出0入0汤圆

发表于 2012-2-11 18:05:37 | 显示全部楼层
IIC,学习中

出0入0汤圆

发表于 2012-4-13 16:51:23 | 显示全部楼层
IIC 是一个大学问啊 值得挑战一下!!!!

出0入0汤圆

发表于 2012-4-17 11:49:18 | 显示全部楼层
请教一下(模拟I2C):


int I2C_FRAM_BufferWrite(u8* pBuffer, u16 WriteAddr, u16 NumByteToWrite)           //写缓冲区          BOOL
{
        u8 Addr = 0, count = 0;

        Addr = WriteAddr / I2C_PageSize;                    //  取页地址 ?

        count = WriteAddr % I2C_PageSize;                 // 取 地址 低 8 位

        Addr = Addr << 1;                                         // 这里 为什么要扩大2倍

        Addr = Addr & 0x0F;                                       // 为什么又要取低4位

        FRAM_ADDRESS = I2C1_SLAVE_ADDRESS7 | Addr;  

    if (!I2C_Start()) return FALSE;
    I2C_SendByte(FRAM_ADDRESS);                          //设置器件地址+段地址    怎么理解?
    if (!I2C_WaitAck())
        {
                I2C_Stop();
                return FALSE;
        }
    I2C_SendByte(count);                                        //设置段内地址      这个是 写 FM24CL16片内内存地址吗
          
        I2C_WaitAck();        
         
        while(NumByteToWrite--)
        {
          I2C_SendByte(* pBuffer);
          I2C_WaitAck();
          pBuffer++;
        }
        I2C_Stop();
          //注意:因为这里要等待EEPROM写完,可以采用查询或延时方式(10ms)
          //Systick_Delay_1ms(10);
       
             I2C_delay_ms(10)        ;

        return TRUE;
}

帮下忙啊   代码一些不理解~~~~  我在测试FM24CL64 不知道是不是 器件换了的原因!  

出0入0汤圆

发表于 2012-7-24 16:22:22 | 显示全部楼层
mark
                                                   

出0入0汤圆

发表于 2012-7-25 10:58:30 | 显示全部楼层
STM32 软件iic mark

出0入0汤圆

发表于 2012-7-25 13:44:54 | 显示全部楼层
看了半天不知道stm32的I2C到底是有问题还是没问题,我用的访问铁电,如果好用就一直是好用的,不好用就彻底不好用,曾经发了个询问帖最后也是没有解决的了

出0入0汤圆

发表于 2012-10-2 23:38:01 | 显示全部楼层
mark                                             

出0入0汤圆

发表于 2012-10-3 19:06:22 | 显示全部楼层
说实话,硬件I2C不是一般人能驾驭它的。。。。。。。楼主 被调戏正常正常。习惯了。。。。

出0入0汤圆

发表于 2012-10-29 11:50:06 | 显示全部楼层
学习了,mark一下

出0入0汤圆

发表于 2012-11-21 12:19:36 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2012-11-22 22:27:49 | 显示全部楼层
mark------------------------

出0入0汤圆

发表于 2012-11-22 22:52:42 来自手机 | 显示全部楼层
mark了!

出155入0汤圆

发表于 2012-12-28 14:30:26 | 显示全部楼层
嗯,正要用呢,收藏先

出0入0汤圆

发表于 2012-12-29 09:29:28 | 显示全部楼层
Mark                                 

出0入0汤圆

发表于 2012-12-29 11:13:21 | 显示全部楼层
mark  ~~~ 学习了!

出0入0汤圆

发表于 2013-1-11 17:05:18 | 显示全部楼层
m                                

出0入0汤圆

发表于 2013-1-12 09:00:20 | 显示全部楼层
学习了 谢谢楼主

出0入0汤圆

发表于 2013-4-27 15:22:16 | 显示全部楼层
潜水很久了,还是说些啥,其实并不是stm32的错,一般arm7以上的arm处理器基本都用到中断来完成I2C的通讯,这个楼主可以去看看其他的arm处理器是不是也这样,一般较大的系统或者比较严谨的工程,都不允许有死等待或者延时的代码出现的,数据的传输都在中断实时完成,这样才不会影响一些后台运行的程序,不会造成阻塞。所以这恰恰是arm的优点,楼主可以看看譬如一些操作系统下的驱动管理,就有更深的体会了。像这种模拟性质的i2c更多的见于单纯的前后台操作,而且是基于低端的51等8位单片机或者没有主i2c功能的芯片多一些。小弟第一次口水,希望大家手下留情(*^__^*)

出1070入962汤圆

 楼主| 发表于 2013-4-27 15:48:02 | 显示全部楼层
楼上不知道看过STM32勘误手册没有?它要求I2C的中断优先级最高,否则就会出现问题。
既然你是玩较大的系统或者是严谨的工程的,你不会不清楚强制要求I2C中断优先级最高意味着什么吧?

我CAN还用不用? SPI还用不用? 哪个不比I2C要求的速度快上N倍?凭啥让一个低速总线中断优先级最高?

出0入0汤圆

发表于 2013-4-27 16:29:39 | 显示全部楼层
我用的FML256,SPI的

出0入0汤圆

发表于 2013-4-27 19:34:10 | 显示全部楼层
I2C,其实STM32的库也是可以用的,曾经用过,只是麻烦点,模拟的I2C网上已经有很多现成品了

出0入0汤圆

发表于 2013-4-27 20:24:30 | 显示全部楼层
mark!     

出0入0汤圆

发表于 2013-4-28 09:05:22 | 显示全部楼层
MARK一下,必定有用

出0入0汤圆

发表于 2013-4-29 10:46:36 | 显示全部楼层
想问问有无用M0做的例子,或者有硬件I2C和SPI带注释的例子,最近咋研究I2C和SPI。想多看人家代码

出0入0汤圆

发表于 2013-4-29 11:58:58 | 显示全部楼层
MARK, STM2 I2C

出0入0汤圆

发表于 2013-4-29 22:00:01 | 显示全部楼层
顶啊,好东

出0入0汤圆

发表于 2013-4-30 08:34:47 | 显示全部楼层
呵呵有一个被STM32 折磨的

出0入0汤圆

发表于 2013-4-30 11:58:34 | 显示全部楼层
谢谢分享,收藏了。

出0入0汤圆

发表于 2013-4-30 14:33:28 | 显示全部楼层
同感,硬件的IIC是很纠结。

出0入0汤圆

发表于 2013-4-30 18:40:35 来自手机 | 显示全部楼层
调戏这个词,恰当。

出0入0汤圆

发表于 2013-5-11 22:39:54 | 显示全部楼层
Appcat 发表于 2010-3-1 14:44
确实可以使用硬件解决的,但是,如果使用公布的那个例程,没啥问题,如果整合到一起跑,问题就来了。初略看 ...

低速的当然要优先级高了,木桶效应嘛

出0入0汤圆

发表于 2013-5-13 13:43:01 | 显示全部楼层
需要这个,标记一下

出0入0汤圆

发表于 2013-5-14 11:34:09 | 显示全部楼层
mark                              

出1070入962汤圆

 楼主| 发表于 2013-5-14 11:44:42 | 显示全部楼层
鬼吹土豆 发表于 2013-5-11 22:39
低速的当然要优先级高了,木桶效应嘛

I2C的低速,一是理解为速度低,二是理解为实时性要求低,这样的外设,在空闲的时候慢慢操作就是了,如果来了实时性更高的请求,随便插入,弄完了这边在接着慢慢搞。
对于中断可重入的M3 ARM来说,I2C中断优先级最高,意味着其他高速外设的中断都要为它让路,不是不可以,而是会带来很多麻烦,对I2C中断函数写作要求更高,那种慢慢等的
写法就歇菜了。这样一来,不觉得别扭吗?
这个和木桶效应毛关系都扯不上,外设和外设之间的不是桶板那样对等的关系。

出10入0汤圆

发表于 2013-6-2 16:36:41 | 显示全部楼层
MARK                                       
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 07:17

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

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