打印

香主 求解脱 有关STM32 I2C问题

[复制链接]
7430|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JSDTAF100|  楼主 | 2012-6-19 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近想将STM32F1030VBT6用在马达控制器上面,其中使用了I2C与EE2PROM(24C16)连接,之前购买了万利的开发板,I2C调试一直不成功,请问IAR自带的I2C与EE2PROM通信例程是不是本身就存在问题,我在单步检测EV6时老是通不过,后来检查是ADDR置位问题,可是我DEVICE ADDRESS 0xA0不存在问题啊,经过仔细的检查好像是ADDR置位以后瞬间被清0了,所以检查EV6时老是通不过。
     另外如果不是按步调试,直接运行例程在开发部上,读出来的东西无序很奇怪,附图,请各位大神指点,之前碰到过此问题吗

093751cf.jpg.zip

15.66 KB

沙发
IJK| | 2012-6-19 09:57 | 只看该作者
IAR自带的STM32 I2C与EE2PROM通信例程,应该是没有问题的,但它适合的EE2PROM应该是24C01之类的小容量E2。24C16容量比较大,LZ可以看看跟24C01相比 是否有所不同[估计 地址长度不同]。

使用特权

评论回复
板凳
puppyh| | 2012-6-19 10:05 | 只看该作者
IAR自带的STM32 I2C与EE2PROM通信例程 和 ST的软件库,肯定是有问题的,这一点是毋庸置疑的!

使用特权

评论回复
地板
JSDTAF100|  楼主 | 2012-6-19 12:53 | 只看该作者
我研究了 开发板上面是24C02就不行的跟空间大小没有关系   我觉得例程本来就是错误的  所以请各位大神指点,看看你们都是怎么改的,最好能用上硬件I2C,模拟I2C目前还是不想采用

使用特权

评论回复
5
IJK| | 2012-6-19 13:54 | 只看该作者
ST对于I2C现在推荐使用 CPAL,建议LZ也用CPAL。

使用特权

评论回复
6
McuPlayer| | 2012-6-19 14:33 | 只看该作者
尽量不要用IAR或者MDK所附带的STM32库,而使用从ST官方下载的版本

使用特权

评论回复
7
JSDTAF100|  楼主 | 2012-6-20 08:44 | 只看该作者
ST官方如何下载到你想要的例程 比如I2C底层驱动

使用特权

评论回复
8
re张风| | 2012-6-20 09:46 | 只看该作者
STM32的I2C,你只能使用DMA或中断方式。不能使用查询寄存器状态的方法。:lol

使用特权

评论回复
9
JSDTAF100|  楼主 | 2012-6-20 10:06 | 只看该作者
查询是不是标志位有bug吗 我发现ADDR位貌似有问题

使用特权

评论回复
10
lost1421| | 2012-6-20 10:17 | 只看该作者
STM32的I2C,你只能使用DMA或中断方式。不能使用查询寄存器状态的方法。:lol
re张风 发表于 2012-6-20 09:46


好像可以使用查询寄存器状态的方法进行I2C通讯吧。

使用特权

评论回复
11
JSDTAF100|  楼主 | 2012-6-21 08:45 | 只看该作者
究竟大家怎么用硬件I2C的哈

使用特权

评论回复
12
EAMCU| | 2012-6-21 09:29 | 只看该作者
曾经使用DMA方式,工作良好。
但是在看了太多问题报告后,担心出现隐患
现在已经把所有的I2C器件换成SPI器件,xx再也不担心了

使用特权

评论回复
13
JSDTAF100|  楼主 | 2012-6-21 09:33 | 只看该作者
SPI接口的dataflash比I2C接口的E2PROM贵多啦  成本成本啊

使用特权

评论回复
14
re张风| | 2012-6-21 16:52 | 只看该作者
10# lost1421 从设计的初衷来看,是希望可以的,但它们设计得有BUG,所以就不行了。但是使用DMA或中断是好使的,你看它的谌误手册也有相应的说明。如要用的话,还是建议用DMA或中断吧。我搞了好几天才搞起能用!把GPIO模拟I2C都搞好了后,又回过来弄硬件的I2C

使用特权

评论回复
15
香水城| | 2012-6-21 17:02 | 只看该作者

使用特权

评论回复
16
JSDTAF100|  楼主 | 2012-6-26 15:09 | 只看该作者
本人驽钝还望香主具体介绍下  CPAL究竟是什么东东   我在datatsheet上没发现它有关的介绍哈

使用特权

评论回复
17
香水城| | 2012-6-26 16:04 | 只看该作者
我前面贴了,CPAL就是Communication peripheral application library的缩写,简单说就是新的I2C例程库

使用特权

评论回复
18
feng_710| | 2012-6-29 16:19 | 只看该作者
void I2C_Send(u8 D_Addr, u8 R_Addr, u8 Data)  
{
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); /*检测总线是否忙 就是看 SCL 或SDA是否为 低 */
                        /*允许1字节1应答模式*/
                I2C_AcknowledgeConfig(I2C1, ENABLE);
                /* 发送起始位 */
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); /*EV5,主模式*/

    /*发送器件地址(写)*/
    I2C_Send7bitAddress(I2C1,  D_Addr, I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_SendData(I2C1, R_Addr);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /*数据已发送*/
            I2C_SendData(I2C1, Data);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /*数据已发送*/
        I2C_GenerateSTOP(I2C1, ENABLE);   //发送停止位
}

u8 I2C_Receive(u8 D_Addr, u8 R_Addr)  
{
u8 a;
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); /*检测总线是否忙 就是看 SCL 或SDA是否为 低 */
                        /*允许1字节1应答模式*/
                I2C_AcknowledgeConfig(I2C1, ENABLE);
         I2C_GenerateSTART(I2C1, ENABLE);
         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
          I2C_Send7bitAddress(I2C1, D_Addr+1, I2C_Direction_Receiver);
          while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
          Put_String("\n\r读数据\n\r");
                  I2C_AcknowledgeConfig(I2C1, DISABLE);
                 I2C_GenerateSTOP(I2C1, ENABLE);
          while( !((I2C1->SR1) & 0x40) || ((I2C1->SR2) & 0x20));
          a=I2C_ReceiveData(I2C1);
         I2C_AcknowledgeConfig(I2C1,ENABLE);
         return a;   
}

使用特权

评论回复
19
lin34337151| | 2013-5-19 17:45 | 只看该作者
我最近搞IIC,遇到个问题,就是IIC频繁的读,读多了会卡死程序死掉了。MCU是STM32F103VCT6  IIC器件FM24CL04

使用特权

评论回复
20
busdriver| | 2013-5-19 18:17 | 只看该作者
STM32 I2C,使用cpal会好很多吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

110

帖子

1

粉丝