打印

gd32f103c8 i2c 读写eeprom有问题

[复制链接]
3206|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
itman-hou|  楼主 | 2015-12-4 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
gd32f103c8 i2c 读写eeprom有问题,程序一直在“while(!I2C_StateDetect(I2C1,I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND));” 上循环。一直解决不了,希望帮助一下。
沙发
itman-hou|  楼主 | 2015-12-4 15:05 | 只看该作者
代码如下:
int main(void)
{
                int i;  
          //uint32_t sr2_1;
                RCC_Configuration();
          RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_I2C1RST, ENABLE);
                RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_I2C1RST, DISABLE);
                GPIO_Configuration();
                I2C_Configuration();
       
         /* Enable I2C1 */
    I2C_Enable(I2C1,ENABLE);
       
                I2C_Acknowledge_Enable(I2C1,ENABLE);
       
    /* The software must wait until I2C Bus is idle */
    while(I2C_GetBitState(I2C1,I2C_FLAG_I2CBSY));

    /* Send a start condition to I2C bus */
    I2C_StartOnBus_Enable(I2C1,ENABLE);

    /* The software must wait until SBSEND bit is set */
    while(!I2C_StateDetect(I2C1,I2C_PROGRAMMINGMODE_MASTER_SBSEND));
       
                /* Send slave address to I2C bus */
                I2C_AddressingDevice_7bit(I2C1,I2C_ADDR,I2C_DIRECTION_TRANSMITTER);
   
                //for(;;)
                //{
                        //I2C_SendData(I2C1,I2C1_Buf_Write[0]);
                //}
               
    /* The software must wait until ADDSEND bit is set */
    while(!I2C_StateDetect(I2C1,I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND));
               
                /* Wait until the transmit data buffer is empty */
    while(!I2C_GetBitState(I2C1,I2C_FLAG_TBE));
   
    for(i=0;i<5;i++)
    {
      /* Data transmission */
      I2C_SendData(I2C1,I2C1_Buf_Write[i]);
      while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED));
    }
               
                /* Send a stop condition to I2C bus */
    I2C_StopOnBus_Enable(I2C1,ENABLE);
    while(I2C1->CTLR1&0x0200);
               
               
                /*read*/
    I2C_Enable(I2C1,ENABLE);

    I2C_Acknowledge_Enable(I2C1,ENABLE);

    while(I2C_GetBitState(I2C1, I2C_FLAG_I2CBSY));

   
    I2C_StartOnBus_Enable(I2C1, ENABLE);

   
    while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND));

               
                I2C_AddressingDevice_7bit(I2C1,I2C_ADDR,I2C_DIRECTION_TRANSMITTER);

   
    while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND));
   
    I2C_StartOnBus_Enable(I2C1, ENABLE);
               
    while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_SBSEND));
               
    for(i=0;i<2;i++)
                {
      I2C_SendData(I2C1,addr[i]);
      while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED));
                }
               
    I2C_AddressingDevice_7bit(I2C1, I2C_ADDR, I2C_DIRECTION_RECEIVER);

    while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_RECEIVER_ADDSEND));
               
                for(i=0;i<3;i++)
                {
                        if(i==2)
                        {
                                /* Wait until the second last data byte is received into the shift register */
        while(!I2C_GetBitState(I2C1,I2C_FLAG_BTC));
        /* Send a NACK for the last data byte */
        I2C_Acknowledge_Enable(I2C1, DISABLE);
                        }
                        /* Wait until the RBNE bit is set */
      while(!I2C_StateDetect(I2C1, I2C_PROGRAMMINGMODE_MASTER_BYTE_RECEIVED));
      /* Read a data from I2C_DTR */
      I2C1_Buf_Read[i] = I2C_ReceiveData(I2C1);
                }
               
    I2C_StopOnBus_Enable(I2C1,ENABLE);
    while(I2C1->CTLR1&0x0200);
                I2C_Acknowledge_Enable(I2C1, ENABLE);

    /* Infinite loop */
    while(1);
}

使用特权

评论回复
板凳
itman-hou|  楼主 | 2015-12-4 16:38 | 只看该作者
我看 I2C 的寄存器 ,一直在那里循环的原因是:TRS 和 ADDSEND 没有被置位。但是不知道在哪里可以给它们置位,还是说哪里没有配置好?

使用特权

评论回复
地板
vivilzb1985| | 2015-12-10 14:33 | 只看该作者
这个是在硬件上没有反应的,要不在该处加一个延时重启控制的呗

使用特权

评论回复
5
shenmu2012| | 2015-12-10 14:59 | 只看该作者
这个需要添加延时程序的,有个先后的时序的需要注意。

使用特权

评论回复
6
firstblood| | 2015-12-11 18:51 | 只看该作者
这个问题的在于硬件上的

使用特权

评论回复
7
comeon201208| | 2015-12-11 22:47 | 只看该作者
itman-hou 发表于 2015-12-4 15:05
代码如下:
int main(void)
{

这个程序还是逻辑性挺强的。

使用特权

评论回复
8
angerbird| | 2015-12-12 18:14 | 只看该作者
这个采用I2C总显得形式操作,需要注意信号的连续性。

使用特权

评论回复
9
smilingangel| | 2015-12-13 19:38 | 只看该作者
eeprom的读写比较常见的,多调试即可。

使用特权

评论回复
10
peace555| | 2015-12-13 20:21 | 只看该作者
用示波器或者逻辑仪看下波形是否正确

使用特权

评论回复
11
itman-hou|  楼主 | 2016-2-2 11:47 | 只看该作者
本帖最后由 itman-hou 于 2016-8-15 12:03 编辑

问题解决了:
i2c的 sda 和 scl 加上上拉电阻就可以了

使用特权

评论回复
12
chuntian2016| | 2016-2-16 18:04 | 只看该作者
采用I2C总先来读写EEPROM的数据的。

使用特权

评论回复
13
shenmu2012| | 2016-2-18 11:41 | 只看该作者
这个是硬件上的问题了,检查下的。

使用特权

评论回复
14
shenmu2012| | 2016-2-18 11:42 | 只看该作者
还有不行的话,在这个地方加一个延时检测的,到达时间后程序添加自动复位的解决。

使用特权

评论回复
15
firstblood| | 2016-2-18 17:37 | 只看该作者
在该while语句中加上软启动程序代码的,当然如楼上所说,需要延时程序的。

使用特权

评论回复
16
comeon201208| | 2016-2-18 21:24 | 只看该作者
这个就注意I2C总线的应用的。

使用特权

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

本版积分规则

13

主题

42

帖子

1

粉丝