1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Решено PN532 не отвечает на команды

Тема в разделе "STM8/STM32", создана пользователем radioengineer, 14 янв 2019.

  1. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Зарубился я тут со чтением карт #NFC и специально приобрел вот такой вот модуль.
    pn532_4-500x500.jpg
    Подключаю конечно же к #stm32 по шине #i2c
    Проблема в том, что модуль не отвечает, причем совсем, питание есть, данные проходят до него. Должен он выдавать низкий уровень на пине IRQ после подачи ему команды от микроконтроллера, а он просто молчит.
    Я проверил уже все что мог. Код для чтения строго по апноуту. В апноуте следующая картинка:
    DeepinScreenshot_выберите-область_20190114140454.png
    У меня же IRQ всегда в высоком уровне.
    Вот кусок, который отправляет команду в #PN532
    PHP:
    void NFC::send uint8_t cmduint8_t len )
    {
        
    uint8_t sum;
        
    len ++;

        
    // Отправка.
        
    i2c->beginTransmission PN532_I2C_ADDRESS );
        
    sum PN532_PREAMBLE PN532_PREAMBLE PN532_STARTCODE2;
        
    i2c->write PN532_PREAMBLE );
        
    i2c->write PN532_PREAMBLE );
        
    i2c->write PN532_STARTCODE2 );

        
    i2c->write len );
        
    i2c->write ( ~len );

        
    i2c->write PN532_HOSTTOPN532 );
        
    sum += PN532_HOSTTOPN532;

        for ( 
    uint16_t i 0< ( len ); i++ )
        {
            
    i2c->write cmd[i] );
            
    sum += cmd[i];
        }

        
    i2c->write ( (uint8_t)~sum );
        
    i2c->write ( (uint8_t)PN532_POSTAMBLE );

        
    // Конец отправки.
        
    i2c->endTransmission();
    }
    Код, который проверяет пин IRQ:
    PHP:
    uint8_t NFC::isReady void )
    {
        
    uint8_t pinState HAL_GPIO_ReadPin _irqPort_irqPin );

        if ( 
    pinState == GPIO_PIN_SET )
            return 
    PN532_I2C_BUSY;
        else
            return 
    PN532_I2C_READY;
    }
    Отправка данных по шине в режиме опроса без прерываний. У кого какие будут предположения, а то у меня уже идеи кончились, три дня отлаживаю.
     
    : NFC, stm32, i2c, PN532
  2. Дмитрий BASIC

    Дмитрий BASIC В доску свой

    Сообщения:
    203
    Симпатии:
    107
    Можно попробовать проверить подменой , если есть другой модуль , может он неисправен, еще может быть адрес неверно прописан или проэкт неправильно скомпилирован, вообщем надо разбираться!
  3. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Подменить вот как раз нечем, заказал только один модуль как на зло. Адрес пишу верный, он там всего один для этой микросхемы.
    --- Сообщения объединены, 14 янв 2019 ---
    Я уже даже пропаял микросхему по кругу для уверенности :)
  4. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.582
    Симпатии:
    355
    Адрес:
    Алматы
    Я разобрался в чем проблема и она не в коде. Я использовал преобразователь уровней TXB0102, который не рассчитан на подтягивающие резисторы менее 50кОм и передачу данных с открытым стоком, а специально для I2C и подтяжек у производителя есть отдельная серия микросхем TXS0102. Вот, что значит поторопился и невнимательно прочел даташит:facepalm:

Поделиться этой страницей