Menu

Hardware SPI - Simple demo. Writing and reading data.

3 days ago
3 days ago
  • Roger Jönsson

    Roger Jönsson - 3 days ago

    Here is a an easy to understand example sending and receiving data over Hardware SPI.
    I needed something to test on, so I took a RAM (chip 23LCV1024 1Mbit) and after som hair loss, I had managed how to write data on to it, verifying by reading the data back. I hope it will be useful to someone else.

    #CHIP 18F27Q84, 64
    #OPTION Explicit
    
    
        #include <glcd.h>
        #DEFINE GLCD_TYPE         GLCD_TYPE_SSD1306
        #DEFINE GLCD_I2C_Address  0x78 
        // Define I2C Software settings
        #DEFINE I2C_MODE Master
        #DEFINE I2C_DATA    PORTC.0
        #DEFINE I2C_CLOCK   PORTC.1
        #DEFINE I2C_DISABLE_INTERRUPTS ON
        GLCDPrint (0, 0, "i2C GLCD TEST")
    
    
        // PIC PPS Tool version: 0.0.6.5
        #startup InitPPS, 85
        #define PPSToolPart 18F27Q84
        Sub InitPPS        
                // Module: SPI1
                SPI1SDIPPS = 0x0016   // RC6 > SDI1
                RC5PPS = 0x0032       // SDO1 > RC5
                RC4PPS = 0x0031       // SCK1 > RC4
                SPI1SCKPPS = 0x0014   // RC4 > SCK1 (bi-directional)        
            End Sub
    
        'This is a PPS chip, so, needs to make the PPS match these assignments
        #DEFINE SPI_DI     portC.6    //SDIx  SO/Pin2
        #DEFINE SPI_DO     portC.5    //SDOx  SI/Pin5
        #DEFINE SPI_SCK    portC.4    //SCKx  SCK/Pin6
        #DEFINE SPI_CS     portC.3    //      CS/Pin1
    
    
    #DEFINE HWSPIMode   MasterFast
    #DEFINE HWSPIClockMode  SPI_SS_0 + SPI_CPOL_0 + SPI_CPHA_0
    SPIMode (HWSPIMode,  HWSPIClockMode )
    
    
    Dim Mydata as Byte = 0
    
    //WRITING AND READING BYTES (23LCV1024 1Mbit RAM CHIP) with DIRECT COMMANDS via the HWSPIport: 
    
    //WRITE BYTE:
    SPI_CS=0
    FastHWSPITransfer 0x2   // WRITE instruction
    FastHWSPITransfer 0x0   // MSB 24bit address 0x000008
    FastHWSPITransfer 0x0   // ||
    FastHWSPITransfer 0x8   // LSB
    FastHWSPITransfer 0xAF  //Write data 0xAF=175
    SPI_CS=1                //Write sequence is terminated
    
    //READ BYTE:
    SPI_CS=0
    FastHWSPITransfer 0x3   //READ instruction
    FastHWSPITransfer 0x0   // MSB 24bit address 0x000008
    FastHWSPITransfer 0x0   // ||
    FastHWSPITransfer 0x8   // LSB 
    SPITransfer 0x0, Mydata //Dummy address for data to be shifted out
    SPI_CS=1                //Read sequence is terminated
    
    GLCDPrint (0, 20, Mydata)
    
     

    Last edit: Roger Jönsson 2 days ago
  • Roger Jönsson

    Roger Jönsson - 3 days ago

    Changes to make sequential write and read:

    DIM Readbyte as byte=0
    
    //SEQUENTIAL WRITING AND READING: (23LCV1024 1Mbit RAM CHIP)
    
    //WRITE BYTES
    SPI_CS=0
    FastHWSPITransfer 0x2   // WRITE instruction
    FastHWSPITransfer 0x0   // MSB 24bit START ADDRESS
    FastHWSPITransfer 0x10   // ||
    FastHWSPITransfer 0x64  // LSB
    //Write bytes sequentially:
    FastHWSPITransfer 10    //Write data
    FastHWSPITransfer 15    
    FastHWSPITransfer 20    
    FastHWSPITransfer 25    
    FastHWSPITransfer 35    
    SPI_CS=1                //Write sequence is terminated
    
    //READ BYTES:
    SPI_CS=0
    FastHWSPITransfer 0x3   // READ instruction
    FastHWSPITransfer 0x0   // MSB START ADDRESS
    FastHWSPITransfer 0x10   // ||
    FastHWSPITransfer 0x64  // LSB
    //Read bytes sequentially:
    SPITransfer 0x0, ReadByte //Dummy address for data to be shifted out
        GLCDPrint (0, 30, ReadByte)
    SPITransfer 0x0, ReadByte 
        GLCDPrint (20, 30, ReadByte)
    SPITransfer 0x0, ReadByte 
        GLCDPrint (40, 30, ReadByte)
    SPITransfer 0x0, ReadByte 
        GLCDPrint (60, 30, ReadByte)
    SPITransfer 0x0, ReadByte 
        GLCDPrint (80, 30, ReadByte)
    SPI_CS=1                //Read sequence is terminated
    
     

    Last edit: Roger Jönsson 2 days ago

Log in to post a comment.

Monday.com Logo