asking
Full Member level 5
- Joined
- Sep 21, 2010
- Messages
- 279
- Helped
- 6
- Reputation
- 12
- Reaction score
- 6
- Trophy points
- 1,298
- Activity points
- 3,377
Hello,
I am new to SPI communication and confused looking at two different examples of application using SPI communication.
1) PIC16 Connected to MAX7219 via Soft SPI interface.
2) Example given on mikroe Site to use SPI application.
Now i am comfused why 1st example the author had completed re-written the Soft_SPI_Write Subroutine ? as per details i thinK
Soft_SPI_Init
Soft_SPI_Read
Soft_SPI_Write
are library routines in MikroC Pro for PIC.
Please can anyone tell me the difference ?
1st Application Code:
2nd Application Code, Example code at MikroC Website :
I am new to SPI communication and confused looking at two different examples of application using SPI communication.
1) PIC16 Connected to MAX7219 via Soft SPI interface.
2) Example given on mikroe Site to use SPI application.
Now i am comfused why 1st example the author had completed re-written the Soft_SPI_Write Subroutine ? as per details i thinK
Soft_SPI_Init
Soft_SPI_Read
Soft_SPI_Write
are library routines in MikroC Pro for PIC.
Please can anyone tell me the difference ?
1st Application Code:
Code:
#define CS_Pin GP0_bit
#define MOSI_Pin GP1_bit
#define CLK_Pin GP2_bit
void SPI_Write_Byte(unsigned short num){
unsigned short t, Mask, Flag;
CLK_Pin = 0;
Mask = 128;
for (t=0; t<8; t++){
Flag = num & Mask;
if(Flag == 0) MOSI_Pin = 0;
else MOSI_Pin = 1;
CLK_Pin = 1;
CLK_Pin = 0;
Mask = Mask >> 1;
}
}
void MAX7219_INIT() {
// Disable Shutdown mode
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(0x0C); // Select Shutdown register
SPI_Write_Byte(0x01); // Set D0 bit to return to normal operation
CS_Pin = 1; // CS pin is pulled HIGH
// Set BCD decode mode for digits DIG0-DIG3
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(0x09); // Select Decode Mode register
SPI_Write_Byte(0x0F); // Select BCD mode for digits DIG0-DIG3
CS_Pin = 1; // CS pin is pulled HIGH
// Set display brighness
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(0x0A); // Select Intensity register
SPI_Write_Byte(0x0a); // Set maximum brightness
CS_Pin = 1; // CS pin is pulled HIGH
// Set display refresh
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(0x0B); // Select Scan-Limit register
SPI_Write_Byte(0x03); // Select digits DIG0-DIG3
CS_Pin = 1; // CS pin is pulled HIGH
// Enable Display-Test
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(0x0F); // Select Display-Test register
SPI_Write_Byte(0x01); // Enable Display-Test
CS_Pin = 1; // CS pin is pulled HIGH
Delay_ms(1000);
// Disable Display-Test
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(0x0F); // Select Display-Test register
SPI_Write_Byte(0x00); // Disable Display-Test
CS_Pin = 1; // CS pin is pulled HIGH
}
void Display_Counter(unsigned int j){
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(4); // Send thousands digit
SPI_Write_Byte((j/1000)%10);
CS_Pin = 1; // CS pin is pulled HIGH
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(3); // Send hundreds digit
SPI_Write_Byte((j/100)%10);
CS_Pin = 1; // CS pin is pulled HIGH
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(2); // Send tens digit
SPI_Write_Byte((j/10)%10);
CS_Pin = 1; // CS pin is pulled HIGH
CS_Pin = 0; // CS pin is pulled LOW
SPI_Write_Byte(1); // Send ones digit
SPI_Write_Byte(j%10);
CS_Pin = 1; // CS pin is pulled HIGH
}
unsigned short i;
unsigned int counter = 0;
void main() {
TRISIO=0b00001000; // GP3 is input only
CMCON0 = 0x07;
ANSEL = 0x00;
MAX7219_INIT(); // initialize max7219
do{
for (counter=0; counter<10000; counter++) {
Display_Counter(counter);
Delay_ms(1000);
}
}while(1);
}
2nd Application Code, Example code at MikroC Website :
Code:
// DAC module connections
sbit Chip_Select at RC0_bit;
sbit SoftSpi_CLK at RC3_bit;
sbit SoftSpi_SDI at RC4_bit;
sbit SoftSpi_SDO at RC5_bit;
sbit Chip_Select_Direction at TRISC0_bit;
sbit SoftSpi_CLK_Direction at TRISC3_bit;
sbit SoftSpi_SDI_Direction at TRISC4_bit;
sbit SoftSpi_SDO_Direction at TRISC5_bit;
// End DAC module connections
unsigned int value;
void InitMain() {
TRISA0_bit = 1; // Set RA0 pin as input
TRISA1_bit = 1; // Set RA1 pin as input
Chip_Select = 1; // Deselect DAC
Chip_Select_Direction = 0; // Set CS# pin as Output
Soft_SPI_Init(); // Initialize Soft_SPI
}
// DAC increments (0..4095) --> output voltage (0..Vref)
void DAC_Output(unsigned int valueDAC) {
char temp;
Chip_Select = 0; // Select DAC chip
// Send High Byte
temp = (valueDAC >> 8) & 0x0F; // Store valueDAC[11..8] to temp[3..0]
temp |= 0x30; // Define DAC setting, see MCP4921 datasheet
Soft_SPI_Write(temp); // Send high byte via Soft SPI
// Send Low Byte
temp = valueDAC; // Store valueDAC[7..0] to temp[7..0]
Soft_SPI_Write(temp); // Send low byte via Soft SPI
Chip_Select = 1; // Deselect DAC chip
}
void main() {
ANSEL = 0; // Configure AN pins as digital
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
InitMain(); // Perform main initialization
value = 2048; // When program starts, DAC gives
// the output in the mid-range
while (1) { // Endless loop
if ((RA0_bit) && (value < 4095)) { // If RA0 button is pressed
value++; // increment value
}
else {
if ((RA1_bit) && (value > 0)) { // If RA1 button is pressed
value--; // decrement value
}
}
DAC_Output(value); // Send value to DAC chip
Delay_ms(1); // Slow down key repeat pace
}
}