CAN-receiver.
This is the CAN-receiver . The receiver accpets data from CAN-transmitter and when data-match happens INT pin goes low and mcu turns on red led. Entire project is based on bare-metal coding and no library is used here .(pic16f877a is used to control the mcp2515-module). Here is the code part of receiver
#include <xc.h>
#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 = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#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; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define XTALFREQ 16000000
char buf0[14];
char buf1[14];
static void init_config(void) {
//Write your initialization code here
TRISC5=0;
TRISC4=1;
TRISC3=0;
TRISC2=0;// Chipselect;
TRISC1=0;
SSPM0=0;
SSPM1=0;
SSPM2=0;
SSPM3=0;
SMP=0;
CKP=0;
RC2=1;
RC1=0;
CKE=1;
SSPEN=1;
}
char data_trasnfer(unsigned char data)
{
SSPBUF=data;
while(!SSPIF);
SSPIF=0;
data=SSPBUF;
return data;
}
void config()
{
RC2=0;
data_trasnfer(0x02);
data_trasnfer(0x0F);
data_trasnfer(0x80);
RC2=1;
}
void reset()
{
RC2=0;
data_trasnfer(0XC0);
RC2=1;
}
void normalmode()
{
RC2=0;
data_trasnfer(0x02);
data_trasnfer(0x0f);
data_trasnfer(0x00);
RC2=1;
}
void receiver0() // setting mask and filer.
{
RC2=0;
data_trasnfer(0x02);// write
data_trasnfer(0x60);// address
data_trasnfer(0X04);// data to activate roll over.
RC2=1;
/*go to filter*/
RC2=0;
data_trasnfer(0x02);// write
data_trasnfer(0x00);// address.
data_trasnfer(0x00);//data
data_trasnfer(0x00);// data;
RC2=1;
/*go to mask*/
RC2=0;
data_trasnfer(0x02);// write
data_trasnfer(0x20);// address.
data_trasnfer(0x00);//data
data_trasnfer(0x00);// data;
RC2=1;
}
void receiver1() //setting mask and filter
{
RC2=0;
data_trasnfer(0x02);// write
data_trasnfer(0x70);// address
data_trasnfer(0X00);// data
RC2=1;
/*go to Filter*/
RC2=0;
data_trasnfer(0x02);// write
领英推荐
data_trasnfer(0x04);//address
data_trasnfer(0x00);//data
data_trasnfer(0X00);//data
RC2=1;
/*go to mask*/
RC2=0;
data_trasnfer(0x02);
data_trasnfer(0x24);
data_trasnfer(0x00);
data_trasnfer(0x00);
RC2=1;
}
void mcp2515_init()
{
reset();// reset the mcp2515;
config();// set it to configuration mode
RC2=0;
data_trasnfer(0x02);// write ins.
data_trasnfer(0x28);// address.
data_trasnfer(0x05);// data
data_trasnfer(0xF1);
data_trasnfer(0x04);
RC2=1;
receiver0();// set maks filter and turnon rollover
receiver1();//ser mask and filter.
normalmode();
}
void inter()
{
RC2=0;
data_trasnfer(0x02);
data_trasnfer(0x2B);
data_trasnfer(0x03);
RC2=1;
}
void turonoff()
{
RC2=0;
data_trasnfer(0x02);
data_trasnfer(0x2C);
data_trasnfer(0x00);
RC2=1;
}
unsigned char readregister(char data)
{
char b=0x00;
RC2=0;
data_trasnfer(0x03);
data_trasnfer(data);
b=data_trasnfer(0x00);
RC2=1;
return b;
}
void main(void) {
init_config(); //Calling initializing function
mcp2515_init();
/*make inter flagbit =0*/
char status=0x00;
char result1=0x00,result2=0x00;
inter();// activate interrupt
while (1) {
//Write application code here
while(status==0x00)
{
status=readregister(0x2C);
}
if(status&(0x01))
{
// read buffer 0
RC2=0;
data_trasnfer(0x92);
result1=data_trasnfer(0x00);
RC2=1;
}
if(status&(0x02))
{
/*read buffer 1*/
RC2=0;
data_trasnfer(0x96);
result2=data_trasnfer(0x00);
RC2=1;
}
if(result1==0xA6)
{
while(1)
{
RC1=1;
}
}
status=0x00;
}
}
This CAN receiver also receives data from anywhere in its surroundings, including your vacuum cleaner and coffee machine.?? #EMC #ESD