Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: OTP.cpp
- Revision:
- 2:af09cade52df
- Child:
- 3:1d0c09e43e22
diff -r 1e577b8befeb -r af09cade52df OTP.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/OTP.cpp Tue May 13 10:38:10 2014 +0000
@@ -0,0 +1,253 @@
+#include "OTP.h"
+
+OTP::OTP(PinName PDIO_pin, PinName CLK_pin, PinName CSn_pin, Serial &pc):
+ PDIO( DigitalInOut(PDIO_pin, PIN_INPUT, PullNone, 0) ),
+ CLK( DigitalInOut(CLK_pin, PIN_INPUT, PullNone, 0) ),
+ CSn( DigitalOut(CSn_pin, 0) ),
+ pc( pc )
+{
+ factory_section = 0;
+ I2C_A = 0;
+ CCW = 0;
+ Z = 0;
+ output_md1 = 0;
+ output_md0 = 0;
+ pwmDIS = 0;
+ MagCompEN = 0;
+ PWMhalfEN_IndexWidth = 0;
+}
+
+void OTP::setup()
+{
+ PDIO = 1;
+ PDIO.output();
+ CLK = 0;
+ CLK.output();
+ CSn = 0;
+ wait_ms(1);
+ CSn = 1;
+ wait_us(30);
+ CSn = 0;
+ wait_us(30);
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+}
+
+void OTP::read_bits(uint32_t *dest, int bit_length)
+{
+ int idx = 0;
+
+ do
+ {
+ CLK = 1;
+ wait_us(30);
+ *dest |= PDIO<<idx;
+ CLK = 0;
+ wait_us(30);
+ idx++;
+ }while(idx < bit_length);
+}
+
+void OTP::exit()
+{
+ CLK = 0;
+ CSn = 0;
+ PDIO = 1;
+ PDIO.output();
+ wait_us(30);
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ CLK = 1;
+ wait_us(30);
+ CSn = 1;
+ wait_us(30);
+ CLK.input();
+}
+
+void OTP::read()
+{
+ PDIO = 0;
+ wait_us(30);
+ CLK = 1;
+ wait_us(30);
+ CSn = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+
+ //generate two CLK pulses
+ for(int i=0; i<2; i++)
+ {
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(15);
+
+ //switch PDIO to input on first faling edge of CLK
+ if(i==0)
+ PDIO.input();
+ wait_us(15);
+ }
+
+ //read all parameters
+ read_bits(&PWMhalfEN_IndexWidth, 1);
+ read_bits(&MagCompEN, 1);
+ read_bits(&pwmDIS, 1);
+ read_bits(&output_md0, 1);
+ read_bits(&output_md1, 1);
+ read_bits(&Z, 12);
+ read_bits(&CCW, 1);
+ read_bits(&I2C_A, 5);
+ read_bits(&factory_section, 29);
+
+ //mbit0,mbit1
+ {
+ wait_ms(1);
+ for(int i=0; i<3; i++)
+ {
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ }
+ }
+
+ CSn = 0;
+ wait_us(30);
+
+ pc.printf("PWMhalfEN_IndexWidth: %X\n", PWMhalfEN_IndexWidth);
+ pc.printf("MagCompEN: %X\n", MagCompEN);
+ pc.printf("pwmDIS: %X\n", pwmDIS);
+ pc.printf("output_md0: %X\n", output_md0);
+ pc.printf("output_md1: %X\n", output_md1);
+ pc.printf("Z: 0x%03X\n", Z);
+ pc.printf("CCW: %X\n", CCW);
+ pc.printf("I2C_A: 0x%02X (0x%02X)\n", I2C_A, (I2C_A<<2)+0x80);
+ pc.printf("factory_section: 0x%08X\n", factory_section);
+}
+
+uint8_t OTP::ID_to_I2C_A(uint8_t id)
+{
+ return (id&0x7C) >> 2;
+}
+
+void OTP::write()
+{
+ PDIO = 1;
+ CLK = 0;
+ wait_us(30);
+ CSn = 1;
+ wait_us(30);
+
+ //generate four CLK pulses
+ for(int i=0; i<4; i++)
+ {
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ }
+
+ //start writing data (from bit 51)
+ PDIO = 0;
+ wait_us(30);
+ for(int i=0; i<18; i++)
+ {
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ }
+ //I2C_A
+ wait_us(15);
+ for(int i=0; i<5; i++)
+ {
+ PDIO = ( I2C_A>>i )&1;
+ wait_us(15);
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(15);
+ }
+
+ //factory_section
+ {
+ PDIO = 0;
+ wait_us(30);
+ for(int i=0; i<29; i++)
+ {
+ //PDIO = ( factory_section>>(29-i-1) )&1;
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ }
+ }
+
+ //mbit0,latch
+ {
+ for(int i=0; i<2; i++)
+ {
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ }
+ }
+
+ CSn = 0;
+ wait_us(30);
+}
+
+void OTP::prog()
+{
+ pc.printf("Install capacitor on PDIO\n");
+ pc.scanf("\n");
+ pc.printf("Fusing...");
+ PDIO = 1;
+ CLK = 1;
+ wait_us(30);
+ CSn = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+
+ //generate four CLK pulses
+ for(int i=0; i<4; i++)
+ {
+ CLK = 1;
+ wait_us(30);
+ CLK = 0;
+ wait_us(30);
+ }
+
+ //factory_section
+ for(int i=0; i<29; i++)
+ {
+ CLK = 1;
+ wait_us(15); //T_PROG_BURN
+ CLK = 0;
+ wait_us(30);
+ }
+
+ //I2C_A
+ for(int i=0; i<5; i++)
+ {
+ CLK = 1;
+ wait_us(15); //T_PROG_BURN
+ CLK = 0;
+ wait_us(30);
+ }
+
+ CSn = 0;
+ wait_us(30);
+}
+
+void OTP::set_id(uint8_t id)
+{
+ I2C_A = ID_to_I2C_A(id);
+}
\ No newline at end of file