返回该小组首页 回复主题
zlswrhcom

zlswrhcom

小组等级:     E币:119  (E币换礼)

#1楼主:stm32f关于GPIO的应用

文章发表于:2008-07-18 05:15

在GPIO配置中有:/* Configure I2C1 pins: SDA ----------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure SCL as output push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
在应用时我这样做错在哪里?如下:
#define I2C_SCL_LOW() GPIO_ResetBits(GPIOB, GPIO_Pin_7)/*模拟I2C时钟控制位*/
#define I2C_SCL_HIGH() GPIO_SetBits(GPIOB, GPIO_Pin_7)
#define I2C_SDA_LOW GPIO_ResetBits(GPIOB, GPIO_Pin_6)/*模拟I2C时钟控制位*/

#define I2C_SDA_HIGH GPIO_SetBits(GPIOB, GPIO_Pin_6)
#define I2C_SDA() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6)//模拟I2C数据传送位
最后一句是用语句while(I2C_SDA())......

STM32

   小组等级:    E币:4167  (E币换礼)

#2

文章发表于:2008-07-18 17:54

语法上没有错。

另外,善意提醒一下,GPIO_Speed可以选用2MHz,使用50MHz时功耗较大。

ZLSWRHCOM

   小组等级:    E币:119  (E币换礼)

#3

文章发表于:2008-07-28 17:11

模拟的通过了,我现在想用自身的I2C来操作PCF8563,搞了两个星期了都无果,请赐教!?谢谢!

主程序中我作了如下设置:

void I2C_FLASH_Init(void)
{
  I2C_InitTypeDef  I2C_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  /* I2C2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
 
  /* Configure I2C2 pins: SCL and SDA */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  I2C_Cmd(I2C1, ENABLE);
/* Enable I2C1 and I2C2 event and buffer interrupt */
  I2C_ITConfig(I2C1, I2C_IT_EVT | I2C_IT_BUF, ENABLE);
  /* Apply I2C configuration after enabling it */
  /* I2C1 configuration ------------------------------------------------------*/
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
   I2C_InitStructure.I2C_OwnAddress1 = 0xa0;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 5000;
  I2C_Init(I2C1, &I2C_InitStructure);
}

在PCF8563的读写程序中我做了如下操作:

void writeData(unsigned char address,unsigned char mdata)
{ I2C_AcknowledgePolling();
     I2C_GenerateSTART(I2C1,ENABLE);
     I2C_SendData(I2C1,0xa2);//写命令
     I2C_SendData(I2C1,address);//写地址
     I2C_SendData(I2C1,mdata); //写数据
     I2C_AcknowledgeConfig(I2C1,DISABLE);
     I2C_GenerateSTOP(I2C1,ENABLE);

}

unsigned char ReadData(unsigned char address) /*单字节*/
{  unsigned char rdata;
  I2C_AcknowledgePolling();
   
    I2C_GenerateSTART(I2C1,ENABLE);
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
    I2C_SendData(I2C1,0xa2);//写命令

    
    while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
  I2C_SendData(I2C1,address);//写地址
   I2C_AcknowledgePolling();
   
    I2C_GenerateSTART(I2C1,ENABLE);
    I2C_SendData(I2C1,0xa3);   //读命令
   rdata="I2C"_ReceiveData(I2C1);
   while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
   I2C_AcknowledgeConfig(I2C1,DISABLE);
    I2C_GenerateSTOP(I2C1,ENABLE);
   return(rdata);

}

void ReadData1(unsigned char address,unsigned char count,unsigned char * buff) /*多字节*/
{

 unsigned char i;
   
   I2C_AcknowledgePolling();
   
    I2C_GenerateSTART(I2C1,ENABLE);
   
    while(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
    I2C_SendData(I2C1,0xa2);//写命令
   I2C_SendData(I2C1,address);//写地址
  I2C_AcknowledgePolling();
   I2C_GenerateSTART(I2C1,ENABLE);
   I2C_SendData(I2C1,0xa3); //读命令
  for(i=0;i<count;i++)
   {
        buff[i]=I2C_ReceiveData(I2C1);
        if(i!=count-1) ;while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));
   }

   I2C_AcknowledgeConfig(I2C1,DISABLE);
    I2C_GenerateSTOP(I2C1,ENABLE);

}

void I2C_AcknowledgePolling(void){
  unsigned int q="I2C"_ReadRegister(I2C1,I2C_Register_SR1);
    do{
        I2C_GenerateSTART(I2C1,ENABLE);
        I2C_ReadRegister(I2C1,I2C_Register_SR1);//清除ADDR位

        I2C_Send7bitAddress(I2C1,0x30,I2C_Direction_Transmitter);
        q="I2C"_ReadRegister(I2C1,I2C_Register_SR1);
    }while(!q);
 while(!(I2C_ReadRegister(I2C1,I2C_Register_SR1)&0x0002));
    I2C_ClearFlag(I2C1,I2C_FLAG_AF);
}

STM32

   小组等级:    E币:4167  (E币换礼)

#4

文章发表于:2008-07-28 18:46

请参考ST提供的I2C例程。

hawk05

   小组等级:    E币:334  (E币换礼)

#5

文章发表于:2008-07-30 09:05

有可能是GPIO的配置问题,我作USART1测试时,也是可以软件模拟,硬件就不行,后来发现GPIO需要配置成复用输入,或者复用输出,不然端口,还是普通端口,不会成为USART端口或者I2C端口!

总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

设计资源与分销

所有小组精华文章