打印

I2C做从机接收数据

[复制链接]
7469|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fangui|  楼主 | 2008-4-16 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, IO, pi, ni, ST
大虾们,我遇到一个问题,如下:
    我用一个NXP单片机做I2C的主机,用一个STM32单片机做从机,STM32单片机用中断接收数据,但是我发现当它们互连之后,NXP单片机主机发不出数据,用示波器查看STM32的SCL和SDA管脚的电平为“0“,如果我把STM32单片机移走之后,NXP单片机发送数据正常,我把源码贴出来让各位给我分析分析.
void GPIO_Init(void)
{
  IO_InitTypeDef GPIOB_InitStructure;
  GPIOB_InitStructure.GPIO_Pin =  GPIO_Pin_9;
  GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIOB_InitStructure);

 /* configure I2C1 pins: SCL and SDA ---------------*/
  GPIOB_InitStructure.GPIO_Pin =  GPIO_Pin_10|GPIO_Pin_11;
  GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIOB_InitStructure);
}
void MyI2CInit(void)
{


  I2C_InitTypeDef  I2C_InitStructure;
  I2C_DeInit(I2C2);

  // Enable I2C2 
  I2C_Cmd(I2C2, ENABLE);

  // Enable I2C2 event and buffer interrupt 
  I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF, ENABLE);

  // I2C2configuration 
  I2C_InitStructure.I2C_Mode = I2C_Mode_SMBusDevice;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = cknowledgedAddress_7bit;
  //I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;
  I2C_Init(I2C2, &I2C_InitStructure); 
}
 void I2C2_EV_IRQHandler(void)
{
  switch (I2C_GetLastEvent(I2C2))
  {
    //Test on I2C2 EV1 and clear it 
    case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:   
      break;

    // Test on I2C2 EV2 and clear it 
    case I2C_EVENT_SLAVE_BYTE_RECEIVED:
        if(GPIOB->ODR & GPIO_Pin_9)
            GPIOB->BSRR=GPIO_Pin_9;
        else
            GPIOB->BRR=GPIO_Pin_9;       
      break; 

    // Test on I2C2 EV4 and clear it 
    case I2C_EVENT_SLAVE_STOP_DETECTED:              
      // Clear STOPF flag 
      I2C_ClearFlag(I2C2, I2C_FLAG_STOPF); 
      // Disable I2C2 interrupts 
      //I2C_ITConfig(I2C2, I2C_IT_EVT | I2C_IT_BUF, DISABLE);
      break;
    default:
      break;
  }
}
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM 
    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);            // Set the Vector Table base location at 0x20000000

#else  // VECT_TAB_FLASH
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);            // Set the Vector Table base location at 0x08000000
#endif
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
   
  /* Configure and enable I2C1 interrupt ----------------*/
  NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

}

int main (void) {
  SetupClock(); 
  NVIC_Configuration();
  SysTick_CounterCmd(SysTick_Counter_Enable);
  GPIOInit(); 
  MyI2CInit();
  while (1) ;
}

感觉好像我的MyI2CInit()配置有问题,但是又不知道问题在哪里,请大虾们不吝赐教。
我已经把两个模块共地了。
沙发
fangui|  楼主 | 2008-4-16 16:25 | 只看该作者

哪位大虾知道啊,指点指点

使用特权

评论回复
板凳
chunfeng12| | 2008-4-16 17:22 | 只看该作者

可以参考例程

I2C Exampe3 上面有些关于配置的问题

使用特权

评论回复
地板
chunfeng12| | 2008-4-16 17:26 | 只看该作者

用示波器观察脉冲时,传输是否已经结束

在你的中断程序中是接收结束后关闭中断的,如果主机的传输只有一次,没冲是很难观察的,还有你粘的程序里
MyI2CInit()配置中
I2C_InitStructure.I2C_AcknowledgedAddress = cknowledgedAddress_7bit;
粘错了吧

使用特权

评论回复
5
香水城| | 2008-4-16 17:45 | 只看该作者

为什么你不设置I2C的时钟频率?

//I2C_InitStructure.I2C_ClockSpeed = ClockSpeed;


在不使用太高输出信号频率时,建议使用较低的端口频率,这样有利于减小功耗和噪声。

使用特权

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

本版积分规则

29

主题

87

帖子

0

粉丝