打印

STR912的I2C读写24C16

[复制链接]
3039|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SkyCode|  楼主 | 2009-4-10 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请香版主跟哪位用过STR912的同仁指点一下
代码如下:

/*********************************************************************
函数名:EEPROM_I2CInit()
*********************************************************************/
void EE_I2CInit(void)
{
  I2C_InitTypeDef   I2C_Struct;
  /* Peripherals enable */
  SCU_APBPeriphClockConfig(__I2C1,ENABLE);
  I2C_DeInit(I2C1);

  /* I2C0 Configuration */
  I2C_Struct.I2C_GeneralCall = I2C_GeneralCall_Disable;
  I2C_Struct.I2C_Ack = I2C_Ack_Enable;
  I2C_Struct.I2C_CLKSpeed = 400000;
  I2C_Struct.I2C_OwnAddress = 0xA0;
  I2C_Init(I2C1, &I2C_Struct);

  //I2C_AcknowledgeConfig(I2C1,ENABLE);
  /* Enable I2C0, I2C1 */
  I2C_Cmd(I2C1, ENABLE);
}

/*********************************************************************
*函数名:EE_WriteOneByte()
*功能描述:向E2的指定地址写入一个字节的数据
*********************************************************************/
void EE_WriteOneByte(u16 adr,u8 dat)
{
    u8 addresstemp=0;
    //I2C_AcknowledgePolling();

    GPIO_WriteBit(GPIO0,GPIO_Pin_4,Bit_RESET);


    addresstemp=adr>>8;
    addresstemp=(((addresstemp&0x07)<<1)&0xfe)|0xa0;
    
       I2C_GenerateStart(I2C1, ENABLE);

    /* Test on EV5 and clear it */ 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));  
    
     /* Send RTC address for write */ 
    I2C_Send7bitAddress(I2C1, addresstemp, I2C_MODE_TRANSMITTER);

    /* Test on EV6 and clear it */ 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECTED));
    I2C_Cmd(I2C1, ENABLE);

       I2C_SendData(I2C1,(u8)adr);      
    /* Test on EV8 and clear it */ 
    while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 

       I2C_SendData(I2C1,dat);    
    /* Test on EV8 and clear it */ 
    while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); 

    I2C_GenerateSTOP(I2C1,ENABLE);
    
}


/*********************************************************************
函数名:EE_WriteOneByte()
功能描述:向E2的随机地址读出一个字节的数据
*********************************************************************/
u8 EE_ReadOneByte(u16 adr)
{
    unsigned char addresstemp=0;
    unsigned char result = 0;
    //I2C_AcknowledgePolling();
    GPIO_WriteBit(GPIO0,GPIO_Pin_4,Bit_SET);
    addresstemp=adr>>8;
    addresstemp=(((addresstemp&0x07)<<1)&0xfe)|0xa0;
    
       I2C_GenerateStart(I2C1,ENABLE);

    /* Test on EV5 and clear it */ 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 

    /* Send RTC address for write */ 
    I2C_Send7bitAddress(I2C1, addresstemp, I2C_MODE_TRANSMITTER);
    
    /* Test on EV6 and clear it */ 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECTED)); 
    I2C_Cmd(I2C1, ENABLE);

       I2C_SendData(I2C1,  ( u8)adr);
    /* Test on EV8 and clear it */ 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

     I2C_GenerateStart(I2C1,ENABLE);     
         /* Test on EV5 and clear it */ 
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

     /* Send RTC address for read */ 
      I2C_Send7bitAddress(I2C1, addresstemp, I2C_MODE_RECEIVER); 
      /* Test on EV6 and clear it */ 
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECTED)); 
      I2C_Cmd(I2C1, ENABLE);

     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); 
        result = I2C_ReceiveData(I2C1); 
     __nop();
     //I2C_AcknowledgeConfig(I2C1, DISABLE); 
     I2C_GenerateSTOP(I2C1,ENABLE);
        return   result;    
}



在主程序中:
 只要我读取24C16中的一个随机地址的数据后,单片机就不能再对24C16进行读或者写操作了

每当我读取数据后,看到i2c的SR1寄存器的值为0x9A,其中第四位为BUSY被置1了,
可能就是这个原因导致我下面不能正常读写了

我每次读的子程序后面都会有一个 I2C_stop()执行,怎么还会有BUSY呢

香版主指点一下,谢谢   期待您的回复
沙发
SkyCode|  楼主 | 2009-4-10 11:05 | 只看该作者

很奇怪

在向24C16中写数据后,执行I2C_GenerateSTOP(I2C1,ENABLE);后看到寄存器I2C1->CR中的 stop位是0,这个好像是硬件自动清0的

但是执行了从24C16中读取数据后吧,执行I2C_GenerateSTOP(I2C1,ENABLE);后看到I2C1->CR中的 stop位是1,
不知道为什么会出现这个原因

晕乎乎  走过的路过的都来看看是怎么回事啊  

是我的读子程序有问题吗     

使用特权

评论回复
板凳
SkyCode|  楼主 | 2009-4-13 14:55 | 只看该作者

香主帮忙

香主,您能帮俺看看吗 
每次读操作后  总线怎么着都busy    下面的操作没有办法继续了 
只好重新初始化I2C  汗!!

使用特权

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

本版积分规则

4

主题

55

帖子

0

粉丝