На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > I2C и ready ножка , как они влияют друг на друга
      использую контроллер stm32f103cb. Требуется связать этот контроллер с девайсом по I2C т.е. передать несколько байт устройству после дождаться когда реди ножка упадет в ноль(она в единице пока данные не готовы для чтения) и прочитать несколько байт. Возникла проблема при настройки реди ножки. Связь по I2C установить удалось, но только если реди ножка настроена как аналоговый вход (GPIO_Mode_AIN) и при этом не получается ждать реди ножку т.е. статус у реди ножки всегда RESET. При настройке ножки как GPIO_Mode_IPU (input pull up) или при настройкe GPIO_Mode_IPD (input pull down) связь по I2C не устанавливается а именно висит на проверке флага I2C_EVENT_MASTER_MODE_SELECT...


      вот код настройки портов:


      GPIO_InitTypeDef GPIO_InitStructure;

      /* Configure I2C2 pins */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
      GPIO_Init(GPIOB, &GPIO_InitStructure);

      /* remap USART1 on port B6(Tx) B7(Rx) */
      //GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);



      /* Configure USART2 Tx as alternate function push-pull */
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(GPIOA, &GPIO_InitStructure);

      /* Configure PA3 */
      // it's pin for slave rady
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
      GPIO_Init(GPIOA, &GPIO_InitStructure);



      вот настройка i2c


      I2C_InitTypeDef I2C_InitStructure;

      /* make defult set */
      I2C_DeInit(I2C2);

      /* do sitings */
      I2C_InitStructure.I2C_ClockSpeed = 10000; // 90kHz
      I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
      I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
      I2C_InitStructure.I2C_OwnAddress1 = 0x50;
      I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
      I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
      I2C_Init(I2C2, &I2C_InitStructure);
      /* Emable i2c2 interface */
      I2C_Cmd(I2C2, ENABLE);



      и вот функции записи и чтения по I2C

      void Read(void)
      {

      /* start */
      I2C_GenerateSTART(I2C2,ENABLE);
      /* check master mode select */
      while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
      /* choose a device & mode */
      I2C_Send7bitAddress(I2C2, Address_Slave, I2C_Direction_Transmitter);
      /* check transmitting success */
      while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING));

      /* first address */
      I2C_SendData(I2C2, Start_address_config);
      /* chek & clear bit status */
      while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING));


      /* start */
      I2C_GenerateSTART(I2C2,ENABLE);
      /* check master mode select */
      while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
      /* choose a device & receive mode*/
      I2C_Send7bitAddress(I2C2, Address_Slave, I2C_Direction_Receiver);
      /* check transmitting success */
      while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


      while(Bit_SET == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3));


      for(i=2; i<9; i++)
      {
      /* wait for ready bit (bit reset) */

      //delay(100);
      //delay(10000000);
      /* wait for slave */
      while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED));
      I2C_AcknowledgeConfig(I2C2, ENABLE);
      USART2_TxBuffer[i] = I2C_ReceiveData(I2C2);
      }
      /* wait for ready bit (bit reset) */
      //while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3));

      /* wait for slave */
      while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED));
      I2C_AcknowledgeConfig(I2C2, DISABLE);
      USART2_TxBuffer[9] = I2C_ReceiveData(I2C2);


      USART2_TxBuffer[10] = 'F';
      USART2_TxBuffer[11] = 'I';

      /* stop */
      I2C_GenerateSTOP(I2C2, ENABLE);

      }


      Надеюсь что объяснил проблему понятно=))
      Спасибо за ответы
        Рекомендую задать сей вопрос на более специфичном форуме. Например на этом?
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0155 ]   [ 16 queries used ]   [ Generated: 23.04.24, 14:07 GMT ]