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.Does anyone have a good reference for SPI programs in Assembly?



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: */