PN532 NFC读卡器到PIC18F接收错误信息

时间:2014-04-23 21:59:02

标签: c driver nfc rfid pic18

我从iteadstudio.com购买了PN532 NFC读卡器,我试图通过SPI将其与PIC18F4520连接。

由于制造商没有提供C驱动程序,我一直依赖this驱动程序,该驱动程序基于adafruit PN532 Arduino驱动程序并适用于ATMega。

到目前为止,我只对驱动程序进行了一次更改。 由于PN532首先要求数据LSB,而PIC无法在硬件中处理这个问题,所以我添加了这些行:

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

SPIwrite 中的MSB转换为LSB,将LSB转换为MSI readSPIdata 函数。

但是,我一直在 SAMConfig 函数中遇到错误,其中pn532_packetArray [5]不等于0x15,因此不返回1,并且再次在 readPassiveTargetID 中函数,其中pn532_packetArray [7]总是等于0,尽管存在NFC标签。如果我注释掉pn532_packetArray [5]我可以从标签中读取某种形式的ID,虽然我很确定它是不对的。

所有其他校验和以及 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 个答案:

没有答案