// PIC18 in C - Versione 0.2 - 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 // Software SPI - Write only master #include "ConfigurationBits.h" #define _XTAL_FREQ 1000000 // Default output frequency of HFINTOSC at Reset #define DATA1 0x78 // See MCP4822 data sheet -> Write 0x85A to DAC A #define DATA2 0x5A // See MCP4822 data sheet -> Write 0x85A to DAC A #define MOSI LATCbits.LATC5 // Pin 16 MOSI RC5/SDO #define MISO LATCbits.LATC4 // Pin 15 MISO RC4/SDI - Unused #define SS0 LATBbits.LATB0 // Pin 21 DAC_SS RB0 #define SS1 LATBbits.LATB1 // Pin 22 ADC_SS RB1 - Unused #define CLK LATCbits.LATC3 // Pin 14 SCK RC3/SCK // Write a byte to SPI - Master void SPI_Master_write_byte(unsigned char dato); void main(void) { // 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 TRISBbits.RB1 = 0; // Set SS1 pin as output - Unused TRISCbits.RC4 = 1; // Set MISO pin as input - Unused SS0 = 1; // Disable Slave Select (DAC) SS1 = 1; // Disable Slave Select (ADC) - Unused CLK = 0; // Clear clock while (1) { SS0 = 0; // Enable Slave Select (DAC) SPI_Master_write_byte(DATA1); // Write a byte to slave __delay_us(200); // Useless delay... SPI_Master_write_byte(DATA2); // Write a byte to slave SS0 = 1; // Disable Slave Select (DAC) __delay_ms(10); } } void SPI_Master_write_byte(unsigned char dato) { unsigned char mask; for (mask = 0x80; mask != 0; mask >>= 1) { // Write 8 bit, starting form MSB if (dato & mask) // If masked bit is 1 MOSI = 1; // Write single 1 else MOSI = 0; // Write single 0 __delay_us(100); // Delay half periode CLK = 1; // Clock active on rising edge __delay_us(100); // Delay half periode CLK = 0; // Clock to idle } }