Weird SPI interface: VIH to VIHH for CS?


Closed Thread
Results 1 to 10 of 10

Hybrid View

  1. #1
    Join Date
    Jan 2009
    Location
    Huntsville, AL
    Posts
    36

    Default Weird SPI interface: VIH to VIHH for CS?

    I have a dual channel digital pot using an SPI interface (MCP4261):


    http://ww1.microchip.com/downloads/en/DeviceDoc/22059b.pdf


    I'm confused about this SPI interface based on the following reasons:

    On page 41 (section 6.1.5), it states that "the CS signal must transition from the inactive state (VIH) to an active state (VIL or VIHH)."

    On page 11, it demonstrates this by showning CS going from VIH (a voltage between VIHH and VIL) to VIHH.

    Furthermore, on page 9, it states that min schmitt trigger high input threshold (VIH) is .45Vdd (at Vdd = 5V), while VIL is <= .2Vdd.

    So does this mean I have to keep CS between 1V and 2.25V (for Vdd=5V) for it to be "inactive"? This is counter to most SPI interfaces I've used (CS is inactive when high, active when low).

    Any help or insight is appreciated!

    Thanks,
    Dave

  2. #2
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    As long as you're HIGH level is over the minimum Vih, and your LOW level is under than min Vil, you're not going to have problem.

    By their notation on the CS pin, it has to be active when low, unless they wouldn't have place a line over it.

    Have a look at Wikipedia for a real-English explanation
    http://en.wikipedia.org/wiki/Logic_level
    Last edited by mister_e; - 28th January 2009 at 20:16.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  3. #3
    Join Date
    Jan 2009
    Location
    Huntsville, AL
    Posts
    36


    Did you find this post helpful? Yes | No

    Default

    Ah, I figured out the VIHH thing. It's Vdd + some delta-V used in order to use their "wiperlock" technology. You can only activate it if CS exceeds Vdd.

    Regardless, I still can't adjust the resistance of the chip. I'm using the following code with a 16F628:
    ---------------------------------
    cmcon=7
    define osc 8

    res var byte

    CS var porta.2 'CS
    CLK var porta.3 'CLK
    SI var porta.4 'SI
    LED var porta.1 'LED

    high CS
    high LED
    pause 500
    low LED
    pause 500
    high LED

    repeatit:
    res=24
    low CS
    shiftout SI,CLK,1,[%00000000\8,res\8]
    high CS
    pause 100
    low CS
    shiftout SI,CLK,1,[%00010000\8,res\8]
    high CS
    pause 200
    res=res+128
    goto repeatit

    end
    ---------------------------------

    I have a 10k pullup resistor on SI, yet no change in resistance.

    Any advice or help is appreciated!

    Dave

  4. #4
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    move res=24 before your repeatit label may help

    Maybe not a bad idea to set the clock LOW at the top of your code.
    Last edited by mister_e; - 29th January 2009 at 03:25.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  5. #5
    Join Date
    Jan 2009
    Location
    Huntsville, AL
    Posts
    36


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by mister_e View Post
    move res=24 before your repeatit label may help

    Maybe not a bad idea to set the clock LOW at the top of your code.
    Good catch. But even with the res=24 inside the loop, I'm still reading 100k across the wipers and the A terminals, and low resistance across the wipers and the B terminals. I slowed down the clock with a "define shift_pauseus 100", took the res=24 outside the loop, but still can't see any changes in resistance. Here's my adjusted code:

    --------------------
    cmcon=7
    define osc 8
    define shift_pauseus 100

    res var byte

    CS var porta.2 'CS
    CLK var porta.3 'CLK
    SI var porta.4 'SI
    LED var porta.1 'LED

    high CS
    high LED
    pause 500
    low LED
    pause 500
    high LED

    res=24

    repeatit:
    low CS
    shiftout SI,CLK,1,[%00000000\8,res\8]
    high CS
    pause 10
    low CS
    shiftout SI,CLK,1,[%00010000\8,res\8]
    high CS
    pause 500
    res=res+32
    goto repeatit

    end
    --------------------
    I also have 10k resistors between the MCP4261 pins and the 16F628A pins, but that shouldn't affect anything.

    WP and SHDN can be left floating, right? Am I correctly formatting the command byte? Aren't the memory locations %0000 and %0001 the correct ones to address?

    Thanks for the help!
    Dave

  6. #6
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    I wouldn't leave a pin floating myself, mainly SHDN. On the other hand, by their specs, they says there's a "Smart Pull-Up" inside... how smart it is... who knows

    Your code seems to be ok to me, but you still haven't added the LOW CS in there... not sur if this could help though...

    PS: Make sure your DEFINEs are all in UPPERCASE.

    Do you have a PICKIT 2? in this case you could monitor what happen on CS/CLK/SDI and SDO

    Do you have a complete schematic of your thing?

    EDIT: Try this one
    Code:
            define OSC 8
            
            cmcon=7
            res var byte
            Command var WORD
            CS var porta.2 'CS
            CLK var porta.3 'CLK
            SI var porta.4 'SI
            LED var porta.1 'LED
            
            high CS
            LOW CLK
            high LED
            pause 500
            low LED
            pause 500
            high LED
            
            res=24
    
    repeatit:
            command.highbyte=0 ' Volatile Wiper 0
            comand.lowbyte=res
            low CS
            shiftout SI,CLK,1,[command\16]
            high CS
            
            pause 10
            
            Command.HighByte=%00010000  ' Volatile Wiper 1    
            low CS
            shiftout SI,CLK,1,[Command\16]
            high CS
            
            pause 500
            res=res+32
            
            goto repeatit
    Last edited by mister_e; - 29th January 2009 at 06:45.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

Similar Threads

  1. Master SPI interface to LCD/OLED??
    By jellis00 in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 19th September 2009, 23:44
  2. need help for APR6008 SPI interface
    By vu2iia in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 30th June 2009, 03:19
  3. 16-bit SPI problem
    By shaiqbashir in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 19th June 2008, 15:42
  4. Help with MicroMag3 SPI interface to PIC
    By kaan in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 31st May 2006, 23:20
  5. Serial Peripheral Interface (SPI)
    By O2_Guy in forum Serial
    Replies: 1
    Last Post: - 22nd March 2006, 20:01

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts