SPI - The basics


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1
    Join Date
    Mar 2009
    Posts
    653

    Default

    Just had my first attempt dabbling with SPI this evening - fail!

    I'm trying to control a AD5206 (six digital pots in the one IC package - http://www.analog.com/static/importe...D5204_5206.pdf)

    To test that the wiper on the nominated pot moves I've put 5V on the High side of the internal pot6 pin, & 0V on the low side of pot6 pin. I'm trying to set pot 6's wiper to the midway point (it's a 256 position pot, so I'm sending a value of 127) - but the wiper is not going to 2.5V ....it just sits at 5V.

    I've try to join all the 'SPI' elements together (as taken from several threads!). The only bit I'm not totally sure about (& it's pretty fundamental!) is how to send just 11 bits to the AD5206 (the format is three bits to select which of the 6 internal digital pots you want the wiper to move, then send the data to actually control the wiper (3 'variable resistor select' bits + 8 databits so 11 bits in total).

    Any ideas....

    Code:
    @ __CONFIG _FCMEN_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _BOR_OFF & _PWRTE_OFF
    
    '16F690 Pin Connections....
    ' PIN# NAME     USE & CONNECTION
    '  1   Vdd      +5VDC power supply   
    '  9   RC7      SDO (serial Data out)
    '  10  RB7      HSEROUT pIN
    '  11  RB6      SPI Clock out
    '  13  RB4      SDI (serial Data In)
    '  16  RCO      CS Chip Select (to pin 3 on AD5206)   output           
    '  20  Vss      Ground
    '*************************************************************************************
    DEFINE  OSC 8          ' set Oscillator at 8Mhz.
    DEFINE  NO_CLRWDT 1   ' PBP doesn't clear WDT automatically
    DEFINE HSER_SPBRG 25   'HSEROUT Stuff.
    DEFINE HSER_TXSTA 24h  'HSEROUT Stuff.
    DEFINE HSER_CLROERR 1  'HSEROUT Stuff.
    
    txsta = %10100100       'setup the tx register
    RCSTA.7 = 1             'Enable RB7 for TX USART
    INTCON.0 = 0            'clears the RABIF Flag (to 0), COULD be 1 on reset (unique to F690)
    ANSEL      = 0          'disable AtoD.
    ANSELH     = 0          'disable AtoD.
    
    OPTION_REG = %00000111  'enable weak pullups.
    WPUB     = %00010000   'enable weak pullups on the SDI RB4 (input from digital pot)
    
    '------SPI setup
    SSPEN VAR SSPCON.5   ' SSP Enable bit
    CKP   VAR SSPCON.4   ' Clock Polarity Select
    SMP   VAR SSPSTAT.7  ' Data input sample phase
    CKE   VAR SSPSTAT.6  ' Clock Edge Select bit
    SSPIF VAR PIR1.3     ' SPI interrupt flag
    
    SSPCON.5=1 'enable SSP 
    SSPCON.4=1 'Clock idles high bit name CKP
    SSPCON.3=0 ' bit 3 to 0 indicate clock speed. bit 0 set means clock = OSC/16 = 1.25 MHz
    SSPCON.2=0
    SSPCON.1=0
    SSPCON.0=1
    SSPSTAT.7=1 ' SPI Master mode 
    SSPSTAT.6=0 ' data transmitted on rising edge of SCK
    
    SCK     var PortB.6  'clock pin
    CS      var PORTC.0     'chip select
    SDI     var PortB.4    'data in
    SDO     var PortC.7      'data out
    AD5206  var word    'word used to send 3 control bits  + 8 data bits
    
    TrisC.0 = 0    'Chip Select (CS) 
    TrisB.6 = 0    'SPI Clock Out
    TrisB.7 = 0    'Debug Out
    
    ' AD5206 Variable resistor select 'Control' bits as as follows....
    '000 Select Variable resistor1
    '001 Select Variable resistor2
    '010 Select Variable resistor3
    '011 Select Variable resistor4
    '100 Select Variable resistor5
    '101 Select Variable resistor6
    
    AD5206 = %00001010111111   'upper byte = select Variable Resistor 6 (ref the table above) , lower byte = set VR6 wiper value to midway
    
    high CS 
    
    ' CODE TO CONTROL SPI POTENTIOMETER AD5206
    
    Main:
        gosub WriteSPI
        pause 1000
        goto Main
    
    WriteSPI:
        LOW CS                            
        Shiftout SDO, SCk, 1, [AD5206 \11] ' not sure about this bit!!
        high cs
        RETURN                       
    
    end

  2. #2
    Join Date
    Jul 2003
    Posts
    2,405

    Default

    SHIFTOUT is a software SPI communications routine. If you use it, don't enable the PICs hardware SPI. If you do, then the hardware SPI takes control of these pins, and SHIFTOUT won't work.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  3. #3
    Join Date
    Mar 2009
    Posts
    653

    Default

    Quote Originally Posted by Bruce View Post
    SHIFTOUT is a software SPI communications routine. If you use it, don't enable the PICs hardware SPI. If you do, then the hardware SPI takes control of these pins, and SHIFTOUT won't work.
    Thanks for the heads up.

    Ok....struggling here! (being completely new to SPI!)

    I'd assumed the reason that SPI hw being available on the PIC was to assist in ease of comms with SPI devices....but now youre saying that h/w should not be used when shiftout is used? So (n00b hat on again!).... Why use shiftout wrt SPI then?

    How does shiftout 'marry' up with the SPI master clock (when using h/w presumably there's tight correlation between the SPI buffers being read out at the right time etc)

    If not using shiftout (as in my above code), how would getting an 11 bit control stream out the SDO pin (the least 3 significant bits of an upper byte + a complete lower byte) be approached in hw?

  4. #4
    Join Date
    Jul 2003
    Posts
    2,405

    Default

    It's pretty much the same for any built-in hardware peripheral.

    Once you enable a peripheral, it takes control of the pins. With PBP SHIFTIN & SHIFTOUT you can use most any pin. With the hardware peripheral you're stuck using whatever pins are used for the hardware peripheral.

    Melabs has a few examples for using hardware SPI here http://melabs.com/resources/samples-pbp-general.htm but I would stick with SHIFTOUT & SHIFTIN unless you just want to learn how the hardware works.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  5. #5
    Join Date
    Mar 2009
    Posts
    653

    Default

    Thank (as ever) Bruce....I managed to get the hardware working (while testing I was sending a data byte of zeros to the digipot ....which ahem, being zeros don't show up on the PIC's SDO pin...doh, lol. Also, I was clocking data out of the pic on the wrong edge of the clock, which meant the least significant of the data byte was going awol from the digipot's perspective)

    So, while I'm what's the pros and cons of s/w SPI vs hw SPI?

    From the top of my head (and some assumptions)...

    sw SPI ...
    pros - flexibility of pin assignments, bit centric.
    cons - slower? can't use interrupts in the same program (this is an assumption on my part as I know serout/debug get corrupted when interrupts are used in the same program)

    hw SPI ...

    pros - can use interrupts in the same program?, faster?
    cons - tied to using the allocated SPI pins. byte centric?
    Last edited by HankMcSpank; - 9th September 2010 at 12:11.

  6. #6
    Join Date
    Feb 2008
    Location
    Michigan, USA
    Posts
    231

    Default Re: SPI - The basics

    Something seems weird about this interface.

    The datasheets that I have looked at seem to say that the hardware SPI is only capable of communicating in 8 bit bytes. So even if you were able to write a program that handled the HWSPI, you would be locked into devices that used 8 bits.
    I seems that so many of the desired devices that use SPI require more than that.

    The above D/A is one example. An SCA61T inclinometer that I'm playing with is using 11 bit data.

    I'm going to read the inclinometer and output to the D/A so it looks like a software SPI is the ONLY solution. I intent to try a variation on Bruce's multi-bit write above to do similar with the read so we'll see how that goes.

    Sure seems odd that is the case if I understand it correctly.

    Bo

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

    Default Re: SPI - The basics

    It's just a matter of playing with it. If you need to send 11 Bits with the MSSP, then you just need to send 2 byte (2x8 bits) BUT mask/set the extra bits with 1 or 0.

    Have a look at MCP3204/3208 section 6
    http://ww1.microchip.com/downloads/e...doc/21298c.pdf

    If you really need speed, you want to use the MSSP port, case not, SHIFTIN/SHIFTOUT handle it.
    Steve

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

Members who have read this thread : 1

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