Считыватель PN532 NFC для PIC18F Получение неверной информации

Я купил считыватель PN532 NFC у iteadstudio.com и пытаюсь связать его с PIC18F4520 через SPI.

Поскольку у производителя нет доступных драйверов C, я полагался на этот драйвер, который основан на драйвере adafruit PN532 Arduino и адаптирован для ATMega.

Я только сделал 1 замену водителю. Поскольку PN532 ожидает данных LSB в первую очередь, а PIC не может обработать это аппаратно, я добавил строки:

data = (data & 0xF0) >> 4 | (data & 0x0F) << 4;
data = (data & 0xCC) >> 2 | (data & 0x33) << 2;
data = (data & 0xAA) >> 1 | (data & 0x55) << 1;

для преобразования MSB в LSB в SPIwrite и LSB в функции MSI readSPIdata.

Тем не менее, я продолжаю получать ошибки в функции SAMConfig, где pn532_packetArray[5] не равно 0x15, поэтому 1 не возвращается, и снова в функции readPassiveTargetID, где pn532_packetArray[7] всегда равно 0, несмотря на то, что тег NFC является подарок. Если я закомментирую pn532_packetArray[5], я смогу прочитать некоторую форму идентификатора из тега, хотя я совершенно уверен, что это неправильно.

Все остальные контрольные суммы и функция sendCommandCheckAck работают правильно. Я неоднократно проверял свой код в отношении драйвера. На этом этапе я выдергиваю волосы, поэтому любая помощь или предложения будут с благодарностью.

Вот точный код:

unsigned char SAMConfig (void){
    PN532DataArray[0] = 0x14; //commands taken from the datasheet
    PN532DataArray[1] = 0x01;
    PN532DataArray[2] = 0x14;
    PN532DataArray[3] = 0x01;

    if (!commandAndAck(PN532DataArray,4,1000))
        return 0;

    readSpiData(PN532DataArray, 8);

    return(PN532DataArray[5]== 0x15 ? 1:0);   //ALWAYS RETURNS 0!!
}

Поэтому я считаю, что проблема должна быть в функции readSPIData:

void readSpiData (unsigned char* buffer, unsigned char n){
    enable_slave;
    delay_ms(2);
    spiWrite(PN532_SPI_DATAREAD);//Send data read command
    for(unsigned char i = 0; i < n; i++){
        delay_ms(1);
        buffer[i] = spiRead(); //buffer is incremented with read data
    }
    for(unsigned char i = 0; i < n; i++)
    {
        buffer[i] = (buffer[i] & 0xF0) >> 4 | (buffer[i] & 0x0F) << 4;//LSB => MSB      
        buffer[i] = (buffer[i] & 0xCC) >> 2 | (buffer[i] & 0x33) << 2;
        buffer[i] = (buffer[i] & 0xAA) >> 1 | (buffer[i] & 0x55) << 1;
    }
    disable_slave;
}

Функция чтения SPI является базовой:

unsigned char spiRead (void){
    sspbuf = 0;         //send out rubbish data
    while(!(sspstat.BF));       //waiting for BF(bit 0) to go to 1
    return sspbuf;          //return useful data byte
}

Кто-нибудь может обнаружить ошибку?

0 ответов

Другие вопросы по тегам