SEND 2x bytes in Oshonsoft

Discussion in 'Embedded Systems and Microcontrollers' started by camerart, Feb 20, 2018.

  1. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi,
    Using Oshonsoft is there a way to SEND 2x BYTEs with SPI?

    In the attached jpg the bottom line suggests 'send 0x3C 0x0A' but Oshonsoft gives an error.
    Camerart
     
  2. ericgibbs

    Moderator

    Jan 29, 2010
    7,857
    1,597
    hi C,
    The only way with OSH Basic is,
    SPISend 0x3C
    SPISend 0x0A

    The method I use is:
    Problem you will have to use this method throughout the Code listing, major change.

    ''Code fragment to Send Data
    lcd_mode = 1
    ss = 0
    spi8 = SSPBUF
    SSPBUF = data.HB
    While Not SSPSTAT.BF
    Wend
    spi8 = SSPBUF
    SSPBUF = data.LB
    While Not SSPSTAT.BF
    Wend
    ss = 1

    'initialise the SPI Port at start up.
    Proc spi_init()
    TRISC.5 = 0 'sdo to 9225
    TRISC.2 = 0 'TRISC.2 = 0 'ss
    TRISC.4 = 1 'sdi not used on TFT
    TRISC.3 = 0 'clk
    ss = 1
    SSPSTAT = 0
    'SSPSTAT.CKE = 1 'clock edge unrem for trailing edge
    'SSPCON1 = 0x10 ' at 8mhz 2mhz operation no SS control
    SSPCON1 = %00100000
    '00 = fosc/4.. 01 = fosc /16
    '10 = fosc/64.. 11 controlled by timer2.
    SSPCON1.CKP = 1 'clock polarity unrem for high polarity
    End Proc
    E
     
    Last edited: Feb 20, 2018
  3. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Morning E,
    Is 'ss' your chip select?

    Is ' initialise the SPI Port at start up.' is before the LOOP?

    First I'll see if there are other Compass modules, that don't need all this.
    Thanks,
    C.
     
  4. ericgibbs

    Moderator

    Jan 29, 2010
    7,857
    1,597
    hi C,
    Yes, ss = select chip
    Init the SPI before starting the main loop, done just once at the start of the program.

    What effect are you getting when you do a:
    SPISend 0x3C
    SPISend 0x0A

    E
     
  5. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi E,
    At first I got 255.
    So far, trying to READ any of the Register addresses, has either been 255 or 0, part from 0x31 32 (See attachment) where I got a string of numbers.

    I tried this:
    'READ COMPASS
    SPICSOn
    For i = 0 To 2
    compss = 0 'CHIP SELECT COMPASS ON
    addr = 0x0a + i 'TEMP ADDRESS TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
    SPISend 0x3c
    SPISend addr
    SPIReceive data
    SPICSOff
    b(i) = data
    compss = 1 'CHIP SELECT COMPASS OFF
    Next i
    SPICSOff
    id_raw.HB = b(1)
    id_raw.LB = b(2)
    id_raw.3B = b(3)
    '''adc_ct = ct_raw????????????????????
    strid = #id_raw

    And it produced ID= 2204434431, which looks encouraging, although I don't have a number to verify it with.
    C.
     
  6. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi E,
    I've been using the above code, for a while, but is the 'addr' incrementing before it should?
    C
     
  7. ericgibbs

    Moderator

    Jan 29, 2010
    7,857
    1,597
    hi C,
    If the actual Addr = 0x0A, you would increment after you have you have Read that Addr's contents.
    E
     
  8. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi E,
    Looking at the Registers, see attached:
    There are 3x addresses for the I.D. 0x0a 0x0b and 0x0c.

    I'll try to change it.
    C
     
  9. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi,
    After failing to get sensible results, I decided to try it with a logic analyser, and notice something that wasn't immediately obvious.
    See the attached jpg, there are some solder links.
    I connected across the SPI jumper, and guess that the C/S link is for holding the Compass 'on' once it has been programmed.
    The logic analyser showed one REG default setting ok, so I'll go over some of the old settings tomorrow. Should prove positive.
    C
     
  10. spinnaker

    AAC Fanatic!

    Oct 29, 2009
    7,815
    3,702
    The full image is as tiny as the thumbnail.
     
  11. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi S,
    Is this clearer? Jumped to 12c and C/S on.
    C
     
  12. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi,
    Failure!
    I've tried many combinations of READ. Below are some examples.
    The first one with [[THIS WORKS]] READs the REG B and shows 0x20 which is the default, so that seems ok to me.

    READing the X,Z and Y registers [with logic analyser], either individually or singly, shows only fixed READing results where changing numbers are expected.
    C.

    'READ COMPASS 0X01 REGB [[[[THIS WORKS]]]]
    ''compss = 0 'CHIP SELECT COMPASS ON
    ''addr = 0x81
    ''SPICSOn
    ''For i = 0 To 1
    ''SPISend addr 'READ 0X81
    ''SPIReceive data
    ''SPICSOff
    ''b(i) = data
    ''addr = addr + 1 '####################################
    ''Next i
    ''SPICSOff
    ''compss = 1 'CHIP SELECT COMPASS OFF
    ''regb_raw.HB = b(1)
    ''regb_raw.LB = b(2)
    '''adc_ct = ct_raw????????????????????
    ''strreghb = #regb_raw.HB
    ''strreglb = #regb_raw.LB
    '''''''''''''''''''''''''''''TEST''''''''''''''''''''''''''''''''''''''''''''
    'READ X REGISTER
    SPICSOn
    compss = 0 'CHIP SELECT COMPASS ON
    WaitMs 10
    SPISend 0x3d 'READ IDENTIFIER
    SPISend 0x04 'READ X 0X03
    SPIReceive x_raw.LB
    compss = 1 'CHIP SELECT COMPASS OFF
    WaitMs 10
    SPICSOff
    'x_raw.HB
    'x_raw.LB
    'strx = #x_raw.HB
    strxhb = #x_raw.HB
    strxlb = #x_raw.LB

    'READ Z REGISTER
    'compss = 0 'CHIP SELECT COMPASS ON
    'addr = 0x85 'ZDATA ADDRESS XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    'SPICSOn
    'For i = 0 To 1
    'SPISend addr 'READ Z 0X05
    'SPIReceive data
    'SPICSOff
    'b(i) = data
    'addr = addr + 1 '####################################
    'Next i
    'compss = 1 'CHIP SELECT COMPASS OFF
    'SPICSOff
    'z_raw.HB = b(1)
    'z_raw.LB = b(2)
    ''strZ = #Z_raw.HB
    'strzhb = #z_raw.HB
    'strzlb = #z_raw.LB

    'READ Y REGISTER
    'compss = 0 'CHIP SELECT COMPASS ON
    'addr = 0x87 'YDATA ADDRESS XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    'SPICSOn
    'For i = 0 To 1
    'SPISend addr 'READ Y 0X07
    'SPIReceive data
    'SPICSOff
    'b(i) = data
    'addr = addr + 1 '####################################
    'Next i
    'compss = 1 'CHIP SELECT COMPASS OFF
    'SPICSOff
    'y_raw.HB = b(1)
    'y_raw.LB = b(2)
    'strY = #Y_raw.HB
    'stryhb = #y_raw.HB
    'strylb = #y_raw.LB
     
  13. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi E,
    I tried to implement your CODE snippet, but it was just doo difficult to add into my program.
    I've ordered a some different compass modules [LSM303D], that are hopefully easier to implement. I already have the LSM303C type but they also have a problem. They need to have SPI 4 wire to match the rest of my modules.
    Thanks,
    C.
     
  14. ericgibbs

    Moderator

    Jan 29, 2010
    7,857
    1,597
    hi C,
    Look at d/s Section 7.1.4 CTRL_REG4_A SIM
    E
     
  15. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi E,
    Which module are you referring too?
    LSM303C
    LSM303D
    HMC5983
    None of my D/S have Section 7.1
    C
     
  16. ericgibbs

    Moderator

    Jan 29, 2010
    7,857
    1,597
    hi C,
    It is this one LSM303 D as per your post.
    E
     
  17. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi E,
    I made sure they supported 4-wire SPI, before ordering. I have to admit, I haven't been the most efficient parts order clerk:) Still, each time I have to read a new D/S, I learn something.

    EDIT: I've been looking through 'your' D/S and see that the only reference to SPI is the setting you pointed to. I must have misslooked when I ordered them, I was sure they fully catered for SPI, bit I appear to be mistaken.
    Perhaps, I am going to have to use both SPI and i2C, although I have been told, they have shared attributes, so back to the drawing board:(
    C.
     
    Last edited: Feb 22, 2018
  18. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi,
    Hurray:)
    I've just SEND and RECEIVED a BYTE to the GY-282 HMC5983 module, so now should be able to proceed to get some results.
    Now when I read the D/S it looks obvious, whereas before it was a puzzle.
    C.
     
  19. camerart

    Thread Starter Senior Member

    Feb 25, 2013
    1,340
    42
    Hi,
    Here's the first results, showing a BYTE for each of the XZ and Y registers.

    The D/S mentions '2’s complement form' As far as I understand this means that the 2x BYTEs need to have a calculation between them.
    Can someone enlighten me please?
    C
     
Loading...