OpenRex PMIC Programming using Socket Board

On this page you can find a step by step tutorial how to program PMIC programmable power circuit MMPF0100A using a programming socket. For more info you may find useful the main testing page.

This page is intended to be used only for production purpose. Do not try to program fuses on your OpenRex board - it has been already programmed!

Content

Required Equipment

  • PF Series Programmer - KITPFPGMEVME
  • Programming Socket - KITPF0100SKTEVBE
  • flat ribbon cable (with two black 4x2 2.54mm female connectors)
  • mini USB cable
  • non-programmed PMIC chip

Programming procedure

1. Download and install the latest software for the PF family (you may need to sign up at the NXP site). Note: From version 4.1 and above, you don't need to download any other software and drivers (as described in datasheet).

2. Connect programmer and socket using ribbon cable:
Programming PMIC - Connecting socket 3. Insert PMIC chip into socket. Be aware about the pin 1 position:
Programming PMIC - Inserting chip 4. Open PF_Series_HID.application and connect PF Series Programmer with PC using USB Mini cable. You will see a message that the programmer was found:
PF software - Programmer Found_680px 5. Enable Target. You will see that 3V3 power rail has been enabled. LED diode D1 on the socket board starts glowing:
PF software - Target Enabled_680px 6. Go to Script Editor tab and load scipt OpenRex-PF0100A_Socket_OTP_Script_v1.0.txt:
PF software - Loaded script_680px 7. Run the script.

8. Wait until Script Run Complete message is displayed on the right side:
PF software - Script Finished_680px 9. Disable power into the board - uncheck Enable Target mark.

10. Close the aplication and remove USB cable.

Now the PMIC should be programmed and ready to be soldered.

Script

///---------------------------------------------------------------------------
// OpenRex - One Time Programming using Socket board Configuration
// Set VDDOTP = 0 V, PWRON = HIGH, LICELL not used, VIN = 4.2 V,  VDDIO = 3.3 V
//---------------------------------------------------------------------------
WRITE_I2C:7F:01 // Access PF0100 EXT Page1
//[Extended Page 1 Registers: 0xA0 - 0xAF] ----------------------------------
WRITE_I2C:A0:2B // Sw1AB Voltage = 1.375 V
WRITE_I2C:A1:02 // Sw1AB Sequence = 2
WRITE_I2C:A2:05 // Sw1AB Freq = 2 MHZ, Mode = Single phase
WRITE_I2C:A8:2B // Sw1c Voltage = 1.375 V
WRITE_I2C:A9:03 // Sw1c Sequence = 3
WRITE_I2C:AA:01 // Sw1c Freq = 2.0 MHZ
WRITE_I2C:AC:72 // Sw2 Voltage = 3.30 V
WRITE_I2C:AD:06 // Sw2 Sequence = 6
WRITE_I2C:AE:01 // Sw2 Freq = 2 MHZ
//[Extended Page 1 Registers: 0xB0 - 0xBF] ----------------------------------
WRITE_I2C:B0:2C // Sw3A Voltage = 1.500 V
WRITE_I2C:B1:04 // Sw3A Sequence = 4
WRITE_I2C:B2:05 // Sw3A Freq = 2 MHZ, Mode = Single phase
WRITE_I2C:B4:2C // Sw3B Voltage = 1.500 V
WRITE_I2C:B5:04 // Sw3B Sequence = 4
WRITE_I2C:B6:01 // Sw3B Freq = 2 MHZ
WRITE_I2C:B8:38 // Sw4 Voltage = 1.350 V
WRITE_I2C:B9:05 // Sw4 Sequence = 5
WRITE_I2C:BA:11 // Sw4 VTT Mode enable, Freq = 2 MHZ
WRITE_I2C:BC:00 // Swbst Voltage = 5.0 V
WRITE_I2C:BD:08 // Swbst Sequence = 8
//[Extended Page 1 Registers: 0xC0 - 0xCF] ----------------------------------
WRITE_I2C:C0:06 // Vsnvs Voltage = 3.0 V
WRITE_I2C:C4:03 // VREF DDR Sequence = 3
WRITE_I2C:C8:0E // Vgen1 Voltage = 1.5 V
WRITE_I2C:C9:0B // Vgen1 Sequence = 11
WRITE_I2C:CC:08 // Vgen2 Voltage = 1.2 V
WRITE_I2C:CD:09 // Vgen2 Sequence = 9
//[Extended Page 1 Registers: 0xD0 - 0xDF] ----------------------------------
WRITE_I2C:D0:00 // Vgen3 Voltage = 1.8 V
WRITE_I2C:D1:0A // Vgen3 Sequence = 10
WRITE_I2C:D4:07 // Vgen4 Voltage = 2.5 V
WRITE_I2C:D5:07 // Vgen4 Sequence = 7
WRITE_I2C:D8:0F // Vgen5 Voltage = 3.3 V
WRITE_I2C:D9:0C // Vgen5 Sequence = 12
WRITE_I2C:DC:0C // Vgen6 Voltage = 3.0 V
WRITE_I2C:DD:01 // Vgen6 Sequence = 1
//[Extended Page 1 Registers: 0xE0 - 0xEF] ----------------------------------
WRITE_I2C:E0:0F // Power-up DVS = 1.5625 mV/us, SeqCLK = 4 ms, PWRON config = 0
WRITE_I2C:E1:0F // Power-up DVS = 1.5625 mV/us, SeqCLK = 4 ms, PWRON config = 0
WRITE_I2C:E2:0F // Power-up DVS = 1.5625 mV/us, SeqCLK = 4 ms, PWRON config = 0
WRITE_I2C:E8:01 // Fault Mode = Enabled
//[Extended Page 1 Registers: 0xF0 - 0xFF] ----------------------------------
WRITE_I2C:FF:08 // I2C Device Address = 0x08
//===========================================================================
// ONE TIME PROGRAMMING COMMANDS FOLLOW
//===========================================================================
WRITE_I2C:E4:02 // FUSE POR=1 (This Enables OTP Programming)
WRITE_I2C:E5:02 // FUSE POR=1 (This Enables OTP Programming)
WRITE_I2C:E6:02 // FUSE POR=1 (This Enables OTP Programming)
//----------------------------------------------------------------------------------- 
WRITE_I2C:F0:1F // Enable ECC for fuse banks 1 to 5 by writing to OTP EN ECC0 register
WRITE_I2C:F1:1F // Enable ECC for fuse banks 6 to 10 by writing to OTP EN ECC1 register
WRITE_I2C:7F:02 // Access PF0100 EXT Page2
WRITE_I2C:D0:1F // Set Auto ECC for fuse banks 1 to 5 by writing to OTP AUTO ECC0 register
WRITE_I2C:D1:1F // Set Auto ECC for fuse banks 6 to 10 by writing to OTP AUTO ECC1 register
//-----------------------------------------------------------------------------------
WRITE_I2C:F1:00 // Reset Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F2:00 // Reset Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F3:00 // Reset Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F4:00 // Reset Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F5:00 // Reset Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F6:00 // Reset Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F7:00 // Reset Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F8:00 // Reset Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F9:00 // Reset Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:FA:00 // Reset Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
VPGM:ON // Turn ON 8V SWBST
//VPGM:DOWN:n
//VPGM:UP:n
DELAY:500 // Adds 500msec delay to allow VPGM time to ramp up
//-----------------------------------------------------------------------------------
// PF0100 OTP MANUAL-PROGRAMMING (BANK 1 thru 10)
//-----------------------------------------------------------------------------------
// BANK 1
//-----------------------------------------------------------------------------------
WRITE_I2C:F1:03 // Set Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F1:0B // Set Bank 1 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F1:03 // Reset Bank 1 ANTIFUSE_EN
WRITE_I2C:F1:00 // Reset Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 2
//-----------------------------------------------------------------------------------
WRITE_I2C:F2:03 // Set Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F2:0B // Set Bank 2 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F2:03 // Reset Bank 2 ANTIFUSE_EN
WRITE_I2C:F2:00 // Reset Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 3
//-----------------------------------------------------------------------------------
WRITE_I2C:F3:03 // Set Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F3:0B // Set Bank 3 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F3:03 // Reset Bank 3 ANTIFUSE_EN
WRITE_I2C:F3:00 // Reset Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 4
//-----------------------------------------------------------------------------------
WRITE_I2C:F4:03 // Set Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F4:0B // Set Bank 4 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F4:03 // Reset Bank 4 ANTIFUSE_EN
WRITE_I2C:F4:00 // Reset Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 5
//-----------------------------------------------------------------------------------
WRITE_I2C:F5:03 // Set Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F5:0B // Set Bank 5 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F5:03 // Reset Bank 5 ANTIFUSE_EN
WRITE_I2C:F5:00 // Reset Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 6
//-----------------------------------------------------------------------------------
WRITE_I2C:F6:03 // Set Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F6:0B // Set Bank 6 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F6:03 // Reset Bank 6 ANTIFUSE_EN
WRITE_I2C:F6:00 // Reset Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 7
//-----------------------------------------------------------------------------------
WRITE_I2C:F7:03 // Set Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F7:0B // Set Bank 7 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F7:03 // Reset Bank 7 ANTIFUSE_EN
WRITE_I2C:F7:00 // Reset Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 8
//-----------------------------------------------------------------------------------
WRITE_I2C:F8:03 // Set Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F8:0B // Set Bank 8 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F8:03 // Reset Bank 8 ANTIFUSE_EN
WRITE_I2C:F8:00 // Reset Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 9
//-----------------------------------------------------------------------------------
WRITE_I2C:F9:03 // Set Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:F9:0B // Set Bank 9 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:F9:03 // Reset Bank 9 ANTIFUSE_EN
WRITE_I2C:F9:00 // Reset Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
// BANK 10
//-----------------------------------------------------------------------------------
WRITE_I2C:FA:03 // Set Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
WRITE_I2C:FA:0B // Set Bank 10 ANTIFUSE_EN
DELAY:10 // Allow time for bank programming to complete
WRITE_I2C:FA:03 // Reset Bank 10 ANTIFUSE_EN
WRITE_I2C:FA:00 // Reset Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits
//-----------------------------------------------------------------------------------
WRITE_I2C:D0:00 // Clear
WRITE_I2C:D1:00 // Clear
//-----------------------------------------------------------------------------------
VPGM:OFF // Turn off 8V SWBST
DELAY:500 // Adds delay to allow VPGM to bleed off
PWRON:LOW // PWRON LOW to reload new OTP data
DELAY:500
PWRON:HIGH