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
--- /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