0

itadstudio.com から PN532 NFC リーダーを購入し、SPI を介して PIC18F4520 と接続しようとしています。

メーカーから入手できる 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;

SPIwrite関数で MSB を LSB に変換し、LSB を MSI readSPIdata関数に変換します。

ただし、pn532_packetArray[5] が 0x15 と等しくないSAMConfig関数でエラーが発生し続けるため、1 が返されず、 readPassiveTargetID関数でも、NFC タグが設定されているにもかかわらず、pn532_packetArray[7] が常に 0 に等しくなります。現在。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
}

誰でも障害を見つけることができますか?

4

0 に答える 0