There is a recurring problem in customer base, need for a unique silicon die
ID for each chip. This is not a Device ID, as currently implemented. Something
akin to this
Would it be possible to implement thru programmer ? All PSOC Families ? Auto generated, say off a tax number, GPS
coordinates, or IP group number, something unique to the customer. Even a Cypress seed for those who are consultants,
the generated serial # stored in FLASH or EEPROM, and then protected as read only during programming.
PSoC3 and 5 do have a kind of die number. It's called PseudoID and it reflects the die date, number and x and y position. It's unique for each part however there's no 100% guarantee.
For PSoC1 there's no unique number.
I've made software to program PSoC with an unique serial number for production.
i'll give you more details as soon as I am home (mobile atm)
Hi Rolf, I am using a PSoC1 and need to program unique IDs as I am using them in a wireless remote control application. Can you share with me how I can do it please? Thanks, Ron
x and y position sounds like the coordinates of the die on the wafer ?
If so definitely would not be unique, wafer to wafer, same production
I look forward to your post on how you did this.
There are 8 bytes stored at the so called "Customer Tables" which might be of your interest. The Customer Tables are located in flash area at 0x000C0100u, consists of 64 bytes and are written during manufacturing time. The first 8 bytes belongs to the Pseudo Unique ID.
Please have a look at page 1639 of the PSoC® 3 Registers TRM: http://www.cypress.com/?rID=37833
0x000C0100u - Y location of die on the wafer (row number)
0x000C0101u - X location of die on the wafer (column number)
0x000C0102u - Wafer Number: 1 to 24
0x000C0103u - LSB of lot number/wafer start
0x000C0104u - MSB of lot number/wafer start
0x000C0105u - Work week: 1 to 53
0x000C0106u - [7:4] Fab Number: 4 or 5 & [3:0] Year: 0 to 9
0x000C0107u - Marketing part number - minor: 000 to 999
Be aware of the fact that the year can roll over from 9 to 0 and that there's no testing done if these values are correct programmed. So this number is not guaranteed to be unique.
Also have a look at your "cydevice.c" in your project, these locations are already defined:
#define CYDEV_FLSHID_CUST_TABLES_Y_LOC 0x000c0100u
To read these values within your firmware, you can just use the following:
unsigned char ID_Y_LOC = CY_GET_XTND_REG8( (void far *) CYDEV_FLSHID_CUST_TABLES_Y_LOC);
To read these values from MiniProg3, you have to use the PP-COM component and do the following:
- Aquire the PSoC
- Read Wafer ID from customer tables
pp.swdiow(0x4720, 0xB6); // First initiation key
pp.swdiow(0x4720, 0xDD); // READ_HIDDEN_ROW opcode
pp.swdiow(0x4720, 0x0A); // READ_HIDDEN_ROW opcode
pp.swdiow(0x4720, 0x00); // Flash Array ID
pp.swdiow(0x4720, 0x01); // RowID of Protection bytes row
byte Val; string PSoCpseudo = "";
ReadIO(0x4720, out Val);
for (int i = 0; i < 256; i++)
ReadIO(0x4720, out Val);
if (i < 😎
PSoCpseudo += Val.ToString("X2");
Hope this helps you out!
So it looks like, in the worst case, there will be 24 parts bearing the same ID.
But this may be good enough for many users.
Don't get how you get to 24? Anyway, the ID is not guaranteed to be unique, but for most applications it is not a problem. I use the Pseudo ID in an application where multiple PSoCs are communicating over a single bus and it works great!
For PSoC1 I use the PP_COM library with a custom made application to program the unique serial number on the fly. The program loads the lastest firmware from a server and puts the number at the right place in flash.
24 Wafers in a lot can have all identical x. y, and......... So 24 parts can have
the same ID.
Thanks for all the other info, very helpful to the forum.
I don't know if the X and Y values range fully from 0-255. Probably there will fit less dies on one wafer.
Also when a new lot starts, the wafer number can be starting from 0 again, In the end, there will be as much identical x/y values as the total amount of wafers, and I guess there will be a lot wafers produced.
If you need a 16 bit value, maybe it's better to make two groups of 4 bytes and XOR those 4 bytes together to get 2x 1byte.
And to get an even more variation, you'd better use an 16 bit LFSR and shift all the 64 bits in!
In a 24 wafer lot, each wafer will have N number of die. This varies wafer to wafer,
due to mask alignment. I wrote a program in 70's, FORTRAN, for a given die geometry
and scribe channel spacing, what min and max number of full die will be achieved. As
die size increased, the range narrowed as one would expect. The corollary is true as well.
Range of X, Y irrelevant in a sense, as each wafer has N die, therefore have N X,Y pairs,
therefore in a lot of W wafers there will be W die carrying the same X,Y pairing.
Update for other people who were also looking for a solution - the function CyGetUniqueId is now implemented in CyBoot. I upgraded from PSocCreator 3.1SP2 to PSocCreator 3.3
More information : PSoc3/5LP System Reference Guide. There is nothing mentioned in this document about being a real unique number or a pseudo-unique number as discussed in this thread.