CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

MCP2515, PIC16F877A and SPI

 
Post new topic   This topic is locked: you cannot edit posts or make replies.    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Wajiha Zubair



Joined: 27 May 2024
Posts: 1

View user's profile Send private message

MCP2515, PIC16F877A and SPI
PostPosted: Tue Jun 04, 2024 10:45 am     Reply with quote

Hello,

I have this code and have been trying to make it work but it doesn't give the desired output. I am not sure if the SPI connection is the problem or the the way the message is being sent to the mcp2515. Can anyone help please.

I am using XC8 compiler.

#include <xc.h>
#include <string.h>


// Configuration Bits
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (LVP disabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 8000000 // 20 MHz external oscillator frequency


#ifndef MCP2515_H
#define MCP2515_H

void MCP2515_Reset(void);
void MCP2515_Init(void);
void MCP2515_SendMessage(unsigned char id);
unsigned char MCP2515_ReceiveMessage(unsigned char* id);
void blinkLED(int ms);

#endif

#ifndef SPI_H
#define SPI_H

void SPI_Init(int s);
void SPI_Write(unsigned char data);
unsigned char SPI_Read(void);

#endif

/*
void main() {
//MASTER
TRISD = 0; // Configure RC0 as output for LED
TRISBbits.TRISB3 = 1; // Configure RB3 as input for Button
PORTDbits.RD2 = 1; // Initial LED state

SPI_Init(1); // Initialize SPI
MCP2515_Init(); // Initialize MCP2515

while (1) {
if (PORTBbits.RB3 == 1) { // when button is pressed
PORTDbits.RD2 = 1;
blinkLED(100);


}

unsigned char id;
unsigned char receivedMessage[8];
if (MCP2515_ReceiveMessage(&id)) {
//if (strcmp(receivedMessage, "ON") == 1) {
if ( id == 0x01 ){
PORTDbits.RD2 = 0; // Turn on LED
// __delay_ms(1000);
}
//else if (strcmp(receivedMessage, "OFF") == 0) {
// PORTDbits.RD2 = 1; // Turn off LED
//}
}
}
}
*/

// /*
void main() {
//SLAVE
TRISBbits.TRISB3 = 1; // Configure RB3 as input for Button
TRISD = 0; // CS output (assuming RA5 for CS)
PORTDbits.RD2 = 1;


SPI_Init(0); // Initialize SPI
MCP2515_Init(); // Initialize MCP2515

while (1) {
if (PORTBbits.RB3 == 1) {
PORTDbits.RD2 = 0;
// Button pressed, send CAN message to PIC1
unsigned char message[] = "ON";
MCP2515_SendMessage(0x01); // Send "ON" message
__delay_ms(1000); // Debounce delay
blinkLED(100);

}
if (PORTBbits.RB3 == 0){
PORTDbits.RD2 = 1;
}
}
}
// */


void MCP2515_Reset(void) {
PORTDbits.RD0 = 0; // Select MCP2515
SPI_Write(0xC0); // Send reset command
PORTDbits.RD0 = 1; // Deselect MCP2515
__delay_ms(1); // Wait for the reset to complete
}

void MCP2515_Init(void) {
MCP2515_Reset();
// Additional initialization code here (setting up CAN bitrate, filters, etc.)
}

void MCP2515_SendMessage(unsigned char id) {
PORTDbits.RD0 = 0; // Select MCP2515
SPI_Write(0x40); // Load TX buffer command
SPI_Write(id); // Load identifier
PORTDbits.RD0 = 1; // Deselect MCP2515

PORTDbits.RD0 = 0; // Select MCP2515
SPI_Write(0x80); // Request to send command
PORTDbits.RD0 = 1; // Deselect MCP2515
}

unsigned char MCP2515_ReceiveMessage(unsigned char* id) {
PORTDbits.RD0 = 0; // Select MCP2515
SPI_Write(0x90); // Read RX buffer command
*id = SPI_Read(); // Read identifier
PORTDbits.RD0 = 1; // Deselect MCP2515
return 1; // Indicate a message was received
}

void SPI_Init(int s) {
TRISCbits.TRISC5 = 0; // SDO output
TRISCbits.TRISC4 = 1; // SDI input
TRISCbits.TRISC3 = 0; // SCK output for Master (ignored for Slave)

// SPI control register settings
if (s == 1) {
SSPCON = 0b00100010; // SPI Master mode, clock = Fosc/64
} else {
SSPCON = 0b00100100; // SPI Slave mode, clock = SCK pin
}

SSPSTAT = 0b00000000; // Sample at middle, low to high clock
PORTDbits.RD0 = 1; // Set CS high (inactive)
}

void SPI_Write(unsigned char data) {
SSPBUF = data; // Load data into buffer
//blinkLED(50);
while(!SSPSTATbits.BF); // Wait until transmission is complete
}

unsigned char SPI_Read(void) {
SPI_Write(0x00); // Write dummy data to initiate SPI read
//blinkLED(50);

return SSPBUF; // Return the received data
}

void blinkLED(int ms){
PORTDbits.RD2 = 0;
__delay_ms(ms);
PORTDbits.RD2 = 1;

}
Ttelmah



Joined: 11 Mar 2010
Posts: 19326

View user's profile Send private message

PostPosted: Tue Jun 04, 2024 11:38 am     Reply with quote

This is a forum for the _CCS_ Compiler, not XC8.
You need to ask on the Microchip forums for help with this, not here.
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies.    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group