AnsweredAssumed Answered

MFRC530 + LPC2103 via SPI0

Question asked by Vladisan Kim on Aug 15, 2017
Latest reply on Aug 17, 2017 by Vladisan Kim

Hello,

 

We have a board with LPC2103 and MFRC530 connected via SPI0. I'm trying to read registers in MFRC530, after reset, but it seems like the received data is wrong. For example: I'm trying to read 8 registers:

  • 0x10 (Page);
  • 0x11 (TxControl);
  • 0x12 (CwConductance);
  • 0x13 (PreSet13);
  • 0x14 CoderControl;
  • 0x15 ModWidth;
  • 0x16 PreSet16;
  • 0x17 PreSet17.

 

I have following results:

0x10 - 0x00; 0x11 - 0x00; 0x12 - 0x58; 0x13 - 0x3F; 0x14 - 0x3F; 0x15 - 0x19; 0x16 - 0x13; 0x17 - 0x00.

 

According to the data sheet, after reset, registers should look like this:

0x10 - 0x80; 0x11 - 0x58; 0x12 - 0x3F; 0x13 - 0x3F; 0x14 - 0x19; 0x15 - 0x13; 0x16 - 0x00; 0x17 - 0x00.

 

It seems like the result set is right shifted by one. What could be wrong with my setup?

 

LPC2103 PLL settings:

    //LPC2103 70 MHz MAX!
    //M    = 5
    //P = 2
    //FOSC = 13.56 MHz    BQ1
    //CCLK = M * FOSC ~ 67.8 MHz
    //FCCO = CCLK * 2 * P ~ 280 Mhz
    PLLCON    = 0x01;
    PLLCFG    = 0x24;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
    while ( !(PLLSTAT & 0x00000400) )
    { ; }
    PLLCON    = 0x03;
    PLLFEED = 0xAA;
    PLLFEED = 0x55;
    APBDIV    = 0x01;

 

SP0 settings:

    //                          SCK0 P0.4                MISO0 P0.5            MOSI0 P0.6                    SSEL0    P.07
    PINSEL0                |= (1 << (2 * 4)) | (1 << (2 * 5)) | (1 << (2 * 6)) /*| (1 << (2 * 7))*/;
    S0SPCCR                = 0x08;                                        //SPI0 rate = ((5 * 13.56) / APBDIV) / 8 ~ 8.475MHz
    S0SPCR                = 0x20;                                        //master mode, 16-bits per transfer

 

SPI0 reading function:

uint8_t spi_0_read(uint8_t addr)
{
    uint8_t ret = 0x00;
    FIOCLR    |= (1 << 22);                               //SSEL low
    S0SPDR    = (0x80 | (addr << 1));
    while ( S0SPSR != 0x80 )                          //Wait SPIF         
    { sleep_us(50); }
    ret            = S0SPDR;
    FIOSET    |= (1 << 22);                              //SSEL high
    return ret;
}

 

Also, I don't quite understand how Page register works. The data sheet says that

 

The MFRC530 register set is segmented into eight pages contain eight registers each. A
Page register can always be addressed, irrespective of which page is currently selected.

 

When using the MFRC530 with the dedicated address bus, the microprocessor defines
three address lines using address pins A0, A1 and A2. This enables addressing within a
page. To switch between registers in different pages a paging mechanism needs to be
used.

 

Table 34. Dedicated address bus: assembling the register address

Register bit: UsePageSelect    Register address
1                                                  PageSelect2 PageSelect1 PageSelect0 A2 A1 A0

 

LPC2103 P0.4 connected with MFRC530 A2 (SCK0)

LPC2103 P0.5 connected with MFRC530 D0 (MISO0)

LPC2103 P0.6 connected with MFRC530 A0 (MOSIO0)

 

What should I write into the page register before reading registers of that page? Does the value in 0x81 in the page register means that I've selected the Page 1?

 

Thanks,

Outcomes