// PIC18 in C - Versione 0.21 - Febbraio 2015 // Copyright (c) 2015, Vincenzo Villa // Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported. // Creative Commons | Attribution-Share Alike 3.0 Unported // https://www.vincenzov.net/tutorial/PIC18/SPI.htm // PIC18F25K20 / MPLABX 2.30 / XC8 1.33 // Hardware SPI - Full duplex - Master #include "ConfigurationBits.h" #define _XTAL_FREQ 1000000 // Default output frequency of HFINTOSC on Reset #define MAX146_CONTROL_BYTE 0x8F // 1000 1111 = Channel 0, Unipolar, single ended, external clock (see datasheet) #define MOSI LATCbits.LATC5 // Pin 16 MOSI RC5/SDO #define MISO PORTCbits.RC4 // Pin 15 MISO RC4/SDI #define SS0 LATBbits.LATB0 // Pin 21 DAC_SS RB0 - Unused #define SS1 LATBbits.LATB1 // Pin 22 ADC_SS RB1 #define CLK LATCbits.LATC3 // Pin 14 SCK RC3/SCK // Write a byte to SPI - Master unsigned char SPI_Master_write_read_byte_MSSP(unsigned char dato); void main(void) { unsigned char Byte1, Byte2, dummy; // Configure SPI pin TRISCbits.RC5 = 0; // Set MOSI pin as output TRISCbits.RC3 = 0; // Set clock pin as output TRISBbits.RB0 = 0; // Set SS0 pin as output - Unused TRISBbits.RB1 = 0; // Set SS1 pin as output TRISCbits.RC4 = 1; // Set MISO pin as input SS0 = 1; // Disable Slave Select (DAC) - Unused SS1 = 1; // Disable Slave Select (ADC) CLK = 0; // Clear clock // Configure SPI hardware SSPCON1bits.SSPEN = 1; // Synchronous Serial Port Enable bit SSPCON1bits.SSPM = 0b0000; // SPI Master mode, clock = FOSC/4 SSPSTATbits.CKE = 1; // 1 = Transmit occurs on transition from active to Idle clock state SSPCON1bits.CKP = 0; // Idle state for clock is a low level SSPSTATbits.SMP = 0; // Input data sampled at middle of data output time while (1) { SS1 = 0; // Enable Slave Select (ADC) dummy = SPI_Master_write_read_byte_MSSP(MAX146_CONTROL_BYTE); // Write a byte to slave - Read back 0 Byte1 = SPI_Master_write_read_byte_MSSP(0); // Write 0 to slave - Read first byte Byte2 = SPI_Master_write_read_byte_MSSP(0); // Write 0 to slave - Read first byte SS1 = 1; // Disable Slave Select (ADC) __delay_ms(10); } } unsigned char SPI_Master_write_read_byte_MSSP(unsigned char dato) { SSPBUF = dato; // Send 8 bit to SPI while (!SSPSTATbits.BF); // SSPBUF is empty? return SSPBUF; }