SPI Assembly examples

Ian0

Joined Aug 7, 2020
13,097
Does anyone have a good reference for SPI programs in Assembly?
For what device? Every SPI interface is different! Usually you just check to see if the buffer is empty and if it is, send it some mode data. Some of them automatically handle the CS inputs, and some of them do it so badly that it is easier to do it manually.
 

nsaspook

Joined Aug 27, 2009
16,251
Disassembly Listing for spi_asm (send SPI data loop with CS toggles) using these connections for SPI
1759107546107.png
1759108388625.png
1759108140807.png

Code:
Disassembly Listing for spi_asm
Generated From:
/public/spi_12f1822/spi_asm.X/dist/default/production/spi_asm.X.production.elf
Sep 28, 2025 6:06:18 PM

---  /tmp/xcXgKgmCl/driver_tmp_1.s  ---------------------------------------------------------------------
07FB  27B5     CALL 0x7B5
07FC  00F1     MOVWF spi_data_out
07FD  01F0     CLRF spi_data_in
07FE  0020     MOVLB 0x0
07FF  2FC2     GOTO 0x7C2
---  /public/spi_12f1822/spi_asm.X/mcc_generated_files/spi.c  -------------------------------------------
1:             /**
2:               SPI Generated Driver File
3:           
4:               @Company
5:                 Microchip Technology Inc.
6:           
7:               @File Name
8:                 spi.c
9:           
10:              @Summary
11:                This is the generated driver implementation file for the SPI driver using PIC10 / PIC12 / PIC16 / PIC18 MCUs
12:          
13:              @Description
14:                This header file provides implementations for driver APIs for SPI.
15:                Generation Information :
16:                    Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
17:                    Device            :  PIC12F1822
18:                    Driver Version    :  1.0.0
19:                The generated drivers are tested against the following:
20:                    Compiler          :  XC8 2.36 and above or later
21:                    MPLAB             :  MPLAB X 6.00
22:            */
23:          
24:            /*
25:                (c) 2018 Microchip Technology Inc. and its subsidiaries.
26:              
27:                Subject to your compliance with these terms, you may use Microchip software and any
28:                derivatives exclusively with Microchip products. It is your responsibility to comply with third party
29:                license terms applicable to your use of third party software (including open source software) that
30:                may accompany Microchip software.
31:              
32:                THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
33:                EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
34:                IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
35:                FOR A PARTICULAR PURPOSE.
36:              
37:                IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
38:                INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
39:                WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
40:                HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
41:                THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
42:                CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
43:                OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
44:                SOFTWARE.
45:            */
46:          
47:            #include "spi.h"
48:            #include <xc.h>
49:          
50:            typedef struct {
51:                uint8_t con1;
52:                uint8_t stat;
53:                uint8_t add;
54:                uint8_t operation;
55:            } spi_configuration_t;
56:          
57:            //con1 == SSPxCON1, stat == SSPxSTAT, add == SSPxADD, operation == Master/Slave
58:            static const spi_configuration_t spi_configuration[] = { 
59:                { 0x1, 0x40, 0x1, 0 }
60:            };
61:          
62:            void SPI_Initialize(void)
63:            {
64:                //SPI setup
65:                SSP1STAT = 0x40;
07E0  3040     MOVLW 0x40
07E1  0024     MOVLB 0x4
07E2  0094     MOVWF SSP1STAT
66:                SSP1CON1 = 0x01;
07E3  3001     MOVLW 0x1
07E4  0095     MOVWF SSP1CON1
67:                SSP1ADD = 0x01;
07E5  3001     MOVLW 0x1
07E6  0092     MOVWF SSP1ADD
68:                TRISAbits.TRISA1 = 0;
07E7  0021     MOVLB 0x1
07E8  108C     BCF TRISA, 0x1
69:                SSP1CON1bits.SSPEN = 0;
07E9  0024     MOVLB 0x4
07EA  1295     BCF SSP1CON1, 0x5
70:            }
07EB  0008     RETURN
71:          
72:            bool SPI_Open(spi_modes_t spiUniqueConfiguration)
73:            {
74:                if(!SSP1CON1bits.SSPEN)
75:                {
76:                    SSP1STAT = spi_configuration[spiUniqueConfiguration].stat;
77:                    SSP1CON1 = spi_configuration[spiUniqueConfiguration].con1;
78:                    SSP1CON2 = 0x00;
79:                    SSP1ADD  = spi_configuration[spiUniqueConfiguration].add;
80:                    TRISAbits.TRISA1 = spi_configuration[spiUniqueConfiguration].operation;
81:                    SSP1CON1bits.SSPEN = 1;
82:                    return true;
83:                }
84:                return false;
85:            }
86:          
87:            void SPI_Close(void)
88:            {
89:                SSP1CON1bits.SSPEN = 0;
90:            }
91:          
92:            uint8_t SPI_ExchangeByte(uint8_t data)
07D5  00F2     MOVWF 0x72
93:            {
94:                SSP1BUF = data;
07D6  0872     MOVF 0x72, W
07D7  0024     MOVLB 0x4
07D8  0091     MOVWF SSP1BUF
95:                while(!PIR1bits.SSP1IF);
07D9  0020     MOVLB 0x0
07DA  1D91     BTFSS PIR1, 0x3
07DB  2FD9     GOTO 0x7D9
96:                PIR1bits.SSP1IF = 0;
07DC  1191     BCF PIR1, 0x3
97:                return SSP1BUF;
07DD  0024     MOVLB 0x4
07DE  0811     MOVF SSP1BUF, W
98:            }
07DF  0008     RETURN
99:          
100:           void SPI_ExchangeBlock(void *block, size_t blockSize)
101:           {
102:               uint8_t *data = block;
103:               while(blockSize--)
104:               {
105:                   SSP1BUF = *data;
106:                   while(!PIR1bits.SSP1IF);
107:                   PIR1bits.SSP1IF = 0;
108:                   *data++ = SSP1BUF;
109:               }
110:           }
111:         
112:           // Half Duplex SPI Functions
113:           void SPI_WriteBlock(void *block, size_t blockSize)
114:           {
115:               uint8_t *data = block;
116:               while(blockSize--)
117:               {
118:                   SPI_ExchangeByte(*data++);
119:               }
120:           }
121:         
122:           void SPI_ReadBlock(void *block, size_t blockSize)
123:           {
124:               uint8_t *data = block;
125:               while(blockSize--)
126:               {
127:                   *data++ = SPI_ExchangeByte(0);
128:               }
129:           }
130:         
131:           void SPI_WriteByte(uint8_t byte)
132:           {
133:               SSP1BUF = byte;
134:           }
135:         
136:           uint8_t SPI_ReadByte(void)
137:           {
138:               return SSP1BUF;
139:           }
---  /public/spi_12f1822/spi_asm.X/mcc_generated_files/pin_manager.c  -----------------------------------
1:             /**
2:               Generated Pin Manager File
3:           
4:               Company:
5:                 Microchip Technology Inc.
6:           
7:               File Name:
8:                 pin_manager.c
9:           
10:              Summary:
11:                This is the Pin Manager file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
12:          
13:              Description:
14:                This header file provides implementations for pin APIs for all pins selected in the GUI.
15:                Generation Information :
16:                    Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
17:                    Device            :  PIC12F1822
18:                    Driver Version    :  2.11
19:                The generated drivers are tested against the following:
20:                    Compiler          :  XC8 2.36 and above
21:                    MPLAB             :  MPLAB X 6.00
22:          
23:                Copyright (c) 2013 - 2015 released Microchip Technology Inc.  All rights reserved.
24:            */
25:          
26:            /*
27:                (c) 2018 Microchip Technology Inc. and its subsidiaries.
28:              
29:                Subject to your compliance with these terms, you may use Microchip software and any
30:                derivatives exclusively with Microchip products. It is your responsibility to comply with third party
31:                license terms applicable to your use of third party software (including open source software) that
32:                may accompany Microchip software.
33:              
34:                THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
35:                EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
36:                IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
37:                FOR A PARTICULAR PURPOSE.
38:              
39:                IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
40:                INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
41:                WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
42:                HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
43:                THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
44:                CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
45:                OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
46:                SOFTWARE.
47:            */
48:          
49:            #include "pin_manager.h"
50:          
51:          
52:          
53:          
54:          
55:            void PIN_MANAGER_Initialize(void)
56:            {
57:                /**
58:                LATx registers
59:                */
60:                LATA = 0x10;
07EC  3010     MOVLW 0x10
07ED  0022     MOVLB 0x2
07EE  008C     MOVWF LATA
61:          
62:                /**
63:                TRISx registers
64:                */
65:                TRISA = 0x2C;
07EF  302C     MOVLW 0x2C
07F0  0021     MOVLB 0x1
07F1  008C     MOVWF TRISA
66:          
67:                /**
68:                ANSELx registers
69:                */
70:                ANSELA = 0x00;
07F2  0023     MOVLB 0x3
07F3  018C     CLRF ANSELA
71:          
72:                /**
73:                WPUx registers
74:                */
75:                WPUA = 0x00;
07F4  0024     MOVLB 0x4
07F5  018C     CLRF WPUA
76:                OPTION_REGbits.nWPUEN = 1;
07F6  0021     MOVLB 0x1
07F7  1795     BSF OPTION_REG, 0x7
77:          
78:          
79:                /**
80:                APFCONx registers
81:                */
82:                APFCON = 0x00;
07F8  0022     MOVLB 0x2
07F9  019D     CLRF APFCON
83:          
84:          
85:          
86:          
87:             
88:              
89:            }
07FA  0008     RETURN
90:            
91:            void PIN_MANAGER_IOC(void)
92:            { 
93:            }
94:          
95:            /**
96:             End of File
97:            */
---  /public/spi_12f1822/spi_asm.X/mcc_generated_files/mcc.c  -------------------------------------------
1:             /**
2:               @Generated PIC10 / PIC12 / PIC16 / PIC18 MCUs Source File
3:           
4:               @Company:
5:                 Microchip Technology Inc.
6:           
7:               @File Name:
8:                 mcc.c
9:           
10:              @Summary:
11:                This is the mcc.c file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
12:          
13:              @Description:
14:                This header file provides implementations for driver APIs for all modules selected in the GUI.
15:                Generation Information :
16:                    Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
17:                    Device            :  PIC12F1822
18:                    Driver Version    :  2.00
19:                The generated drivers are tested against the following:
20:                    Compiler          :  XC8 2.36 and above or later
21:                    MPLAB             :  MPLAB X 6.00
22:            */
23:          
24:            /*
25:                (c) 2018 Microchip Technology Inc. and its subsidiaries.
26:              
27:                Subject to your compliance with these terms, you may use Microchip software and any
28:                derivatives exclusively with Microchip products. It is your responsibility to comply with third party
29:                license terms applicable to your use of third party software (including open source software) that
30:                may accompany Microchip software.
31:              
32:                THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
33:                EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
34:                IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
35:                FOR A PARTICULAR PURPOSE.
36:              
37:                IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
38:                INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
39:                WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
40:                HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
41:                THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
42:                CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
43:                OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
44:                SOFTWARE.
45:            */
46:          
47:            #include "mcc.h"
48:          
49:          
50:            void SYSTEM_Initialize(void)
51:            {
52:          
53:                SPI_Initialize();
07BD  27E0     CALL 0x7E0
54:                PIN_MANAGER_Initialize();
07BE  27EC     CALL 0x7EC
55:                OSCILLATOR_Initialize();
07BF  27CB     CALL 0x7CB
56:                WDT_Initialize();
07C0  27B6     CALL 0x7B6
57:            }
07C1  0008     RETURN
58:          
59:            void OSCILLATOR_Initialize(void)
60:            {
61:                // SCS FOSC; SPLLEN disabled; IRCF 8MHz_HF;
62:                OSCCON = 0x70;
07CB  3070     MOVLW 0x70
07CC  0021     MOVLB 0x1
07CD  0099     MOVWF OSCCON
63:                // TUN 0;
64:                OSCTUNE = 0x00;
07CE  0198     CLRF OSCTUNE
65:                // SBOREN disabled;
66:                BORCON = 0x00;
07CF  0022     MOVLB 0x2
07D0  0196     CLRF BORCON
67:                // Wait for PLL to stabilize
68:                while(PLLR == 0)
69:                {
70:                }
07D1  0021     MOVLB 0x1
07D2  1B1A     BTFSC OSCSTAT, 0x6
07D3  0008     RETURN
71:            }
72:          
73:            void WDT_Initialize(void)
74:            {
75:                // WDTPS 1:65536; SWDTEN OFF;
76:                WDTCON = 0x16;
07B6  3016     MOVLW 0x16
07B7  0097     MOVWF WDTCON
77:            }
07B8  0008     RETURN
78:          
79:            /**
80:             End of File
81:            */
---  /public/spi_12f1822/spi_asm.X/main.c  --------------------------------------------------------------
1:             /**
2:               Generated Main Source File
3:           
4:               Company:
5:                 Microchip Technology Inc.
6:           
7:               File Name:
8:                 main.c
9:           
10:              Summary:
11:                This is the main file generated using PIC10 / PIC12 / PIC16 / PIC18 MCUs
12:          
13:              Description:
14:                This header file provides implementations for driver APIs for all modules selected in the GUI.
15:                Generation Information :
16:                    Product Revision  :  PIC10 / PIC12 / PIC16 / PIC18 MCUs - 1.81.8
17:                    Device            :  PIC12F1822
18:                    Driver Version    :  2.00
19:             */
20:          
21:            /*
22:                (c) 2018 Microchip Technology Inc. and its subsidiaries.
23:              
24:                Subject to your compliance with these terms, you may use Microchip software and any
25:                derivatives exclusively with Microchip products. It is your responsibility to comply with third party
26:                license terms applicable to your use of third party software (including open source software) that
27:                may accompany Microchip software.
28:              
29:                THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
30:                EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY
31:                IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS
32:                FOR A PARTICULAR PURPOSE.
33:              
34:                IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
35:                INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
36:                WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP
37:                HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO
38:                THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL
39:                CLAIMS IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT
40:                OF FEES, IF ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS
41:                SOFTWARE.
42:             */
43:          
44:            #include "mcc_generated_files/mcc.h"
45:          
46:            volatile uint8_t spi_data_out=0xBE, spi_data_in;
47:          
48:            /*
49:                                     Main application
50:             */
51:            void main(void) {
52:                // initialize the device
53:                SYSTEM_Initialize();
07C2  27BD     CALL 0x7BD
54:          
55:                // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits
56:                // Use the following macros to:
57:          
58:                // Enable the Global Interrupts
59:                //INTERRUPT_GlobalInterruptEnable();
60:          
61:                // Enable the Peripheral Interrupts
62:                //INTERRUPT_PeripheralInterruptEnable();
63:          
64:                // Disable the Global Interrupts
65:                //INTERRUPT_GlobalInterruptDisable();
66:          
67:                // Disable the Peripheral Interrupts
68:                //INTERRUPT_PeripheralInterruptDisable();
69:          
70:                while (1) {
71:                    // Add your application code
72:                    IO_RA4_SetLow();
07C3  0022     MOVLB 0x2
07C4  120C     BCF LATA, 0x4
73:                    spi_data_in = SPI_ExchangeByte(spi_data_out);
07C5  0871     MOVF 0x71, W
07C6  27D5     CALL 0x7D5
07C7  00F0     MOVWF 0x70
74:                    IO_RA4_SetHigh();
07C8  0022     MOVLB 0x2
07C9  160C     BSF LATA, 0x4
75:                }
76:            }
77:            /**
78:             End of File
79:             */
 
Top