|
|
View previous topic :: View next topic |
Author |
Message |
Wajiha Zubair
Joined: 27 May 2024 Posts: 1
|
MCP2515, PIC16F877A and SPI |
Posted: Tue Jun 04, 2024 10:45 am |
|
|
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: 19495
|
|
Posted: Tue Jun 04, 2024 11:38 am |
|
|
This is a forum for the _CCS_ Compiler, not XC8.
You need to ask on the Microchip forums for help with this, not here. |
|
|
|
|
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
|