1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

I2C display doesn't give an acknowledge

Discussion in 'Microcontrollers' started by 3Dfx, May 6, 2017.

  1. 3Dfx

    3Dfx New Member

    Joined:
    May 6, 2017
    Messages:
    1
    Likes:
    0
    Hello everyone!
    I've got a NHD-C160100DiZ-FSW-FBW display and a Simcom sim5360 module. The display is connected correctly - that is for sure. I tried to get connected using a datasheet example (using Lua language), but the display doesn't get ACK-bit - the SDA line is staying HIGH.
    Here is a modified code I am using now but there is still no ACK bit. I would greatly appreciate any help from you.
    Code (text):

    function I2C_out(j) --//I2C Output
        print("~~I2C output '",string.format("0x%X",j),"':\r\n")
        local d, n;
        d=j;
        n=0;
        vmsleep(delay);
        print("1. Sending 8 bits (n = [0,7])\r\n")
        for n = 0,7 do --//send 8 bits
            print("1.",n+1,".1) n = ", n, ", d = ",d, ", d and 0x80 = ",bit.band(d,0x80),". ");
            if(bit.band(d,0x80) == 0x80) then --//get only the MSB
                setHIGH(SDA);--SDA=1; --//If it is 1 then SDA=1
                print("SDA to 1: SDA == ", gpio.getv(SDA),"\r\n");
            else
                setLOW(SDA);--SDA=0; --//If 0 then SDA=0  
                print("SDA to 0: SDA == ", gpio.getv(SDA),"\r\n");          
            end
           
            vmsleep(delay);
            print("1.",n+1,".2) SCL clocks\r\n");
            print("SСL to 0: ")  
            setLOW(SCL);--SCL = 0;
            print("SCL == ",gpio.getv(SCL),"\r\n")
            vmsleep(delay);
            print("SСL to 1: ")  
            setHIGH(SCL);--SCL = 1; --//clock in data
            print("SCL == ",gpio.getv(SCL),"\r\n")
            vmsleep(2*delay);
           
            d = bit.lshift(d,1);--d=(d<<1); --//shift data byte left
           
            print("SСL to 0: ")  
            setLOW(SCL);--SCL = 0;
            print("SCL == ",gpio.getv(SCL),"\r\n")
            vmsleep(delay);
        end;
       
        print("\r\n2.\r\n")
       
        print("SDA to 1: ")
        setHIGH(SDA);--SDA = 1;
        print("SDA == ",gpio.getv(SDA),"\r\n")  
        vmsleep(2*delay);
       
        print("SСL to 1: ")  
        setHIGH(SCL);--SCL = 1; --//clock in data
        print("SCL == ",gpio.getv(SCL),"\r\n")
        vmsleep(2*delay);
       
        print("SСL to 0: ")  
        setLOW(SCL);--SCL = 0;
        print("SCL == ",gpio.getv(SCL),"\r\n")
        vmsleep(delay);
       
        pinToIN(SDA);
       
        --[
        print("3. Wait until ACK:\r\n")
        while(gpio.getv(SDA)==1) do --//wait here until ACK
            print("SСL to 0: ")  
            setLOW(SCL);--SCL = 0;
            print("SCL == ",gpio.getv(SCL),"\r\n")
            vmsleep(delay);
            print("SСL to 1: ")  
            setHIGH(SCL);--SCL = 1;
            print("SCL == ",gpio.getv(SCL),"\r\n")
            vmsleep(delay);
            print("NACK (Sending '", string.format("0x%X",j)," (gpio.getv(SDA) == ",gpio.getv(SDA),"')\r\n");
        end;  
       
        print("!!!!!!!!!!!ACK!!!!!!!!!!!!\r\n");  
        pinToOUT(SDA);
        vmsleep(delay);
       
        setLOW(SCL);--SCL = 0;  
        vmsleep(delay);
    end;
    --/*****************************************************/
    function I2C_Start(void)
        print("~~Start:\r\n")          
       
        print("SСL to 1: ");
        setHIGH(SCL)--SCL = 1;  
        print("SCL == ",gpio.getv(SCL),"\r\n");
        vmsleep(10)
       
        print("SDA to 1: ")
        setHIGH(SDA);--SDA = 1;
        print("SDA == ",gpio.getv(SDA),"\r\n")  
        vmsleep(10)
       
        print("SDA to 0: ")  
        setLOW(SDA);--SDA = 0;
        print("SDA == ",gpio.getv(SDA),"\r\n")
        vmsleep(10)  
       
        print("SСL to 0: ")  
        setLOW(SCL);--SCL = 0;
        print("SCL == ",gpio.getv(SCL),"\r\n")
        vmsleep(10)
       
        print("~~(endstart)\r\n");
    end
    --/*****************************************************/
    function I2C_Stop(void)
        print("~~Stop:\r\n")      

        print("SDA to 0: ")  
        setLOW(SDA);--SDA = 0;
        print("SDA == ",gpio.getv(SDA),"\r\n")
        vmsleep(10)  
       
        print("SСL to 0: ")  
        setLOW(SCL);--SCL = 0;
        print("SCL == ",gpio.getv(SCL),"\r\n")
        vmsleep(10)  
       
        print("SСL to 1: ");
        setHIGH(SCL)--SCL = 1;  
        print("SCL == ",gpio.getv(SCL),"\r\n");
        vmsleep(10)
       
        print("SDA to 1: ")
        setHIGH(SDA);--SDA = 1;
        print("SDA == ",gpio.getv(SDA),"\r\n")  
        vmsleep(10)
       
        print("~~(endstop)\r\n");
    end
    --/*****************************************************/
    function Show(text)
        local n,i;
        local page=0xB0;  --//first page
        for i=0, 13 do --//100 pixels = 12.5 pages
            I2C_Start();
            I2C_out(Slave);
            I2C_out(Comsend);
            I2C_out(page);
            I2C_out(0x10); --//column address Y9:Y6
            I2C_out(0x01); --//column address Y5:Y2
            I2C_Stop();
            I2C_Start();
            I2C_out(Slave);
            I2C_out(Datasend);
            for n=0, 160 do
                I2C_out(text);  --//send data 4 times for grayscaling
                I2C_out(text);
                I2C_out(text);
                I2C_out(text);
                text = text+1;  --//point to next byte of data
                vmsleep(10);
            end
            I2C_Stop();
            page = page+1;  --//move to next page
        end
    end
    --/****************************************************
    --* LCD Initialization *
    --*****************************************************/
    function init_LCD()
        I2C_Start();
        I2C_out(Slave);
       
        for n = 1, #initTable do
            I2C_out(initTable[n]);
        end
       
        I2C_Stop();
    end
    --/*****************************************************/
    --]]

    --/****************************************************
    --* MAIN *
    --/*****************************************************/
       
    Slave = 0x3F; --//slave address
    --Comsend = 0x00;
    --Datasend = 0x40;
    initTable = {
        0x00,    --Comsend
       
        -- Select partial display line (p. 56)
        -- Sets the ratio within range of 16 to 128 (ICON disabled) or 17 to 129 (ICON enabled)
        -- to realize partial display by using the 2-byte instruction
        0x48,    -- 1-st
        0x64,    -- 2-nd : 1/100 duty
       
        -- ADC select (p. 62)
        -- Changes the relationship between RAM column address and segment driver.
        -- The direction of segment driver output pins could be reversed by software.
        -- This makes IC layout flexible in LCD module assembly.
        0xA0,    -- ADC = 0: normal direction (SEG0 -> SEG127)

        -- SHL select (p. 61)
        -- COM output scanning direction is selected by this instruction which determines the LCD driver output status.
        0xC8,    -- SHL = 1: reverse direction (COM127 -> COM0)
       
        -- Set Initial COM0 Register (p. 55)
        -- Sets the initial row (COM) of the LCD panel using the 2-byte instruction.
        -- By using this instruction, it is possible to realize the window moving without the change of display data.
        0x44,    -- 1-st
        0x00,    -- 2-nd scan from COM0

        --    Oscillator ON Start (p. 62)
        0xAB,    -- This instruction enables the built-in oscillator circuit

        -- Select Regulator Resistor (p. 60)
        -- Selects resistance ratio of the internal resistor used in the internal voltage regulator.
        -- See voltage regulator section in power supply circuit
        0x26, -- 1+ (Rb / Ra) = 6.5

        -- Set Electronic Volume Register (p. 60)
        -- Consist of 2-byte Instructions
        -- The 1st instruction set Reference Voltage mode,
        -- the 2nd one updates the contents of reference voltage register.
        -- After second instruction, Reference Voltage mode is released.
        0x81,    -- 1-st *****
        0x18,    -- 2-nd
        -- 0x1C, -- 2-nd

        -- Select LCD bias (p. 60)
        -- Selects LCD bias ratio of the voltage required for driving the LCD.
        0x57,    -- 1/12
        -- 0x56, -- 1/11 ****
       
        -- Select DC-DC Step-up (p. 59)
        -- Selects one of 4 DC-DC step-up to reduce the power consumption by this instruction.
        -- It is very useful to realize the partial display function.
        0x64,    -- 3x times boosting circuit

        0xE3,    -- NOP (p. 64)
        0xE3,    -- NOP (p. 64)
       
        -- Power control (p. 58)
        0x2C,    --    Internal voltage converter circuit is ON
       
        -- Select DC-DC Step-up (p. 59)
        -- Selects one of 4 DC-DC step-up to reduce the power consumption by this instruction.
        -- It is very useful to realize the partial display function.
        0x66,    -- 5x times boosting circuit
       
        0xE3,    -- NOP (p. 64)
        0xE3,    -- NOP (p. 64)
       
        -- Power control (p. 58)
        0x2E,    -- Internal voltage converter circuit is ON
                -- Internal voltage regulator circuit is ON
       
        0xE3,    -- NOP (p. 64)
        0xE3,    -- NOP (p. 64)
       
        -- Power control (p. 58)
        0x2F,    -- Internal voltage converter circuit is ON
                -- Internal voltage regulator circuit is ON
                -- Internal voltage follower circuit is ON
       
        -- Set Bias Power Save Mode (p. 58)
        -- This command is for saving the IC current consumption by Bias Power Saving
        -- After this Instruction is set, Bias function is also working
        0xF3,    -- 1-st
        0x00,    -- 2-nd

        -- Set FRC & PWM mode (p. 65)
        0x96,    -- 3FRC
                -- 60PWM

        -- Set Mode Register (p. 49)
        -- 2-byte instruction to set Mode (EXT) and FR (Frame frequency control), BE (Booster efficiency control).
        -- Booster Efficiency
        -- The ST7528 incorporates software configurable Booster Efficiency Command.
        -- It could be used with Voltage multiplier to get the suitable Vout and Power consumption.
        -- Default setting is Level 2
        0x38,    -- 1-st
        0x75,    -- 2-nd
                -- FR frequency = 70 Hz ±20%
                -- Booster Efficiency Level 2
                -- The Instruction of EXT=1 Mode is available

        -- Set FRC & PWM mode (p. 65)
        0x95,    -- 3FRC
                -- 45PWM
        -- 0x97, ****

        -- 16-level (White Mode ~ Dark Mode) Gray Scale Display with PWM and FRC Methods
        -- (p. 1)

    --------------------------------------------------
    --start 16-level grayscale settings
    --------------------------------------------------
        -- Set Gray Scale Mode & Register (p. 65)
        -- Consists of 2 bytes instruction.
        -- The first byte sets grayscale mode and the second byte updates the contents
        -- of gray scale register without issuing any other instruction.
        0x80, -- Set white mode and 1st frame
        0x00, -- set pulse width

        0x81, -- Set white mode and 2nd frame
        0x00, -- set pulse width
       
        0x82, -- Set white mode and 3rd frame
        0x00, -- set pulse width
       
        0x83, -- Set white mode and 4th frame
        0x00, -- set pulse width
    --------------------------------------------------
        0x84,
        0x06,
        0x85,
        0x06,
        0x86,
        0x06,
        0x87,
        0x06,
        0x88,
        0x0B,
        0x89,
        0x0B,
        0x8A,
        0x0B,
        0x8B,
        0x0B,
        0x8C,
        0x10,
        0x8D,
        0x10,
        0x8E,
        0x10,
        0x8F,
        0x10,
        0x90,
        0x15,
        0x91,
        0x15,
        0x92,
        0x15,
        0x93,
        0x15,
        0x94,
        0x1A,
        0x95,
        0x1A,
        0x96,
        0x1A,
        0x97,
        0x1A,
        0x98,
        0x1E,
        0x99,
        0x1E,
        0x9A,
        0x1E,
        0x9B,
        0x1E,
        0x9C,
        0x23,
        0x9D,
        0x23,
        0x9E,
        0x23,
        0x9F,
        0x23,
        0xA0,
        0x27,
        0xA1,
        0x27,
        0xA2,
        0x27,
        0xA3,
        0x27,
        0xA4,
        0x2B,
        0xA5,
        0x2B,
        0xA6,
        0x2B,
        0xA7,
        0x2B,
        0xA8,
        0x2F,
        0xA9,
        0x2F,
        0xAA,
        0x2F,
        0xAB,
        0x2F,
        0xAC,
        0x32,
        0xAD,
        0x32,
        0xAE,
        0x32,
        0xAF,
        0x32,
        0xB0,
        0x35,
        0xB1,
        0x35,
        0xB2,
        0x35,
        0xB3,
        0x35,
        0xB4,
        0x38,
        0xB5,
        0x38,
        0xB6,
        0x38,
        0xB7,
        0x38,
        0xB8,
        0x3A,
        0xB9,
        0x3A,
        0xBA,
        0x3A,
        0xBB,
        0x3A,
    --------------------------------------------------
        0xBC, -- Set Dark mode and 1st frame
        0x3C, -- set pulse width

        0xBD, -- Set Dark mode and 2nd frame
        0x3C, -- set pulse width

        0xBE, -- Set Dark mode and 3rd frame
        0x3C, -- set pulse width

        0xBF, -- Set Dark mode and 4th frame
        0x3C, -- set pulse width
    --------------------------------------------------
    -- end grayscale settings
    --------------------------------------------------

        -- Set Mode Register (p. 49)
        -- 2-byte instruction to set Mode (EXT) and FR (Frame frequency control), BE (Booster efficiency control).
        -- Booster Efficiency
        -- The ST7528 incorporates software configurable Booster Efficiency Command.
        -- It could be used with Voltage multiplier to get the suitable Vout and Power consumption.
        -- Default setting is Level 2
        0x38,    -- 1-st
        0x74,    -- 2-nd
                -- FR frequency = 70 Hz ±20%
                -- Booster Efficiency Level 2
                -- The Instruction of EXT=0 Mode is available

        0xAF    -- Turns the display ON
    };
    delay = 10
       
        pinToOUT(SCL)
        pinToOUT(SDA)
        pinToOUT(RST)
        pinToOUT(CSB)

        print("CSB to 0: ")  
        setLOW(CSB)
        print("CSB == ",gpio.getv(CSB),"\r\n")
        vmsleep(5);
       
        print("RST to 0: ")  
        setLOW(RST)
        print("RST == ",gpio.getv(RST),"\r\n")
        vmsleep(100);
       
        print("RST to 1: ")  
        setHIGH(RST)
        print("RST == ",gpio.getv(RST),"\r\n")
        vmsleep(100);

        init_LCD();

    --The end
     
     

Share This Page