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 CCS Technical Support

MCP2515 Message Receiving Problem [Solved]

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Mucit23



Joined: 10 May 2014
Posts: 8

View user's profile Send private message

MCP2515 Message Receiving Problem [Solved]
PostPosted: Wed Aug 27, 2014 4:56 pm     Reply with quote

Hi Friends,

I'm using MCP2515 with stm32f10x for the CANbus communication. I can send a message to stm32 with MCP2515. I can receive incoming messages with STM32. But I can not send a message to mcp2515 from stm32.

STM32 side there is no problem. Because STM32 running in loopback mode.

This is My Code

++++++++++++++++++
CCS driver code mostly removed.

Reason: Forum rule #10
10. Don't post the CCS example code or drivers.
http://www.ccsinfo.com/forum/viewtopic.php?t=26245

- Forum Moderator
++++++++++++++++++


MCP2515.c
Code:

/////////////////////////////////////////////////////////////////////////
////                        mcp2515a.c     NODE A                    ////

#include <mcp2515.h>

//IO pins connected to MCP2510
#ifndef EXT_CAN_CS
   #define EXT_CAN_CS   PIN_C2
   #define EXT_CAN_SI   PIN_C5
   #define EXT_CAN_SO   PIN_C4
   #define EXT_CAN_SCK  PIN_C3
   #define EXT_CAN_RESET   PIN_C0 //CCS library does not use this pin by default

////////////////////////////////////////////////////////////////////////
//
// can_init()
//
//
//////////////////////////////////////////////////////////////////////////////
void can_init(void) {

.
.
.

   can_set_mode(CAN_OP_LOOPBACK);
}

////////////////////////////////////////////////////////////////////////
//
// can_set_baud()
//
//
////////////////////////////////////////////////////////////////////////
void can_set_baud(void) {
 
   mcp2510_write(CNF1, 0x01);
   mcp2510_write(CNF2, 0xB8);
   mcp2510_write(CNF3, 0x05);
}


MCP2515.h
Code:

/////////////////////////////////////////////////////////////////////////
////                        can-mcp2510.h                            ////
////                                                                 ////


My main code
Code:
#include <16F886.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOMCLR
#FUSES NOFCMEN
#FUSES NOLVP

#use delay(int=8000000)

#include <lcd_driver.c>
#include <mcp2515.c>

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

   struct rx_stat rxstat;
   int32 rx_id;
   int buffer[8];
   int rx_len;

void main()
{

   set_tris_a(0x3F);
   set_tris_b(0x00);
   set_tris_c(0x00);
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
 
   setup_oscillator(OSC_8MHZ);
   setup_adc(ADC_OFF);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   setup_spi(SPI_DISABLED);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   
   delay_ms(100);
   lcd_init();
   
   can_init();
   lcd_clear();
   lcd_gotoxy(1,1);
   printf(lcd_putc,"MCP2515 Can Test");
   
   while(TRUE)
   {
     
        can_getd(rx_id, &buffer[0], rx_len, rxstat);
     
        lcd_gotoxy(1,2);
        printf(lcd_putc,"Rx_id=0x%4X",buffer[0]);
     
   }

}


For some reason I can not get any incoming messages from MCP2515. But I can send a message.

What do you think could be the problem?

Thank You
Regards
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Thu Aug 28, 2014 1:04 am     Reply with quote

As soon as you use fast_io, it becomes your responsibility to set TRIS correctly.

You are programming the input bit as an output.....
Mucit23



Joined: 10 May 2014
Posts: 8

View user's profile Send private message

PostPosted: Thu Aug 28, 2014 2:45 am     Reply with quote

I'm so sorry for added to CCS driver.

@Ttelmah, Thank you for your answer.

I removed definition #use_fast_io(c). I was hoping this change will solve the problem. But the problem continues in the same way. Confused

I did a few tests.
I first wrote CANCTRL value of 0x80 to the register.

Code:
mcp2510_write(CANCTRL,0x80);


Then I read CANSTAT register.

Code:
temp=mcp2510_read(CANSTAT);


I read the value 0x80

For this reason, I don't think there is a problem with Writing and reading operations. I Think that is another problem.

What else could be the problem?

Thank you for helping.
Regards
RF_Developer



Joined: 07 Feb 2011
Posts: 839

View user's profile Send private message

Re: MCP2515 Message Receiving Problem
PostPosted: Thu Aug 28, 2014 3:29 am     Reply with quote

Mucit23 wrote:

Code:

////////////////////////////////////////////////////////////////////////
//
// can_set_baud()
//
//
////////////////////////////////////////////////////////////////////////
void can_set_baud(void) {
 
   mcp2510_write(CNF1, 0x01);
   mcp2510_write(CNF2, 0xB8);
   mcp2510_write(CNF3, 0x05);
}




Instead of overriding the defines in the CCS header file, you have edited both the .h and the .c files, making them non-standard. In particular you've changed the reasonably well organised baud rate setting stuff and changed them into "magic" numbers. Its very difficult to check if those numbers, 0x01, 0xB8 and 0x05, are right for what you want to do. By far the best way of using the CCS code is to leave it as it is, and NOT edit it in any way, and then provide your overriding defines in your code.

Its important to understand that the CCS driver code expects to generate 125kbps CAN baudrate when the CAN interface, in this case the mcp2515, is clocked at 20MHz. What clock are you running the mcp2515 at? Is it driven by the processor clock, which is at 8MHz? Does it have its own crystal? If so, what frequency? What CAN baudrate do you want? Do those magic numbers really give you that rate from your clock?
Mucit23



Joined: 10 May 2014
Posts: 8

View user's profile Send private message

PostPosted: Thu Aug 28, 2014 4:27 pm     Reply with quote

Hi @RF_Developer,

I use a PC program to calculate Baud Rate the values.

The program link: http://www.intrepidcs.com/support/mbtime.htm
I'm calculates baud rate with this program.

0x01, 0xB8 and 0x05, these values for 250Kbits.

MCP2515 is working with 16MHz crystal. PIC16F886 is running with 8 MHz internal oscillator

I want 250kbits baud rate. I can communicate at the speed of 250 kbps with magic values. Because I measure the speed of communication with the logic analyzer.

I think the problem with MCP2515 library. Do you have a library that you know is working?

Thank You
Regards
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Aug 28, 2014 4:51 pm     Reply with quote

Fix your read loop. Call can_kbhit() to see if data is available. If so,
then call the rest of the code. Also add a delay after you get the message
so you can see it displayed.

Example of revised loop code:
Code:

while(TRUE)
   {
     if(can_kbhit())   // Is data available ?
      {
       can_getd(rx_id, &buffer[0], rx_len, rxstat);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"Rx_id=0x%4X", buffer[0]);

       delay_ms(1000);  // Display message for 1 second     
      }
   }
Mucit23



Joined: 10 May 2014
Posts: 8

View user's profile Send private message

PostPosted: Sat Aug 30, 2014 1:39 pm     Reply with quote

Hi

I tried giving you part of the program. But it didn't work.

I think it is related to the Rx filter. Does MCP2510 receives all incoming messages? Do you need to change the filter settings?

Code:
//receive acceptance filter n standard indifier
.
#define RXF0SIDH  0x00
#define RXF0SIDL  0x01
#define RXF1SIDH  0x04
#define RXF1SIDL  0x05
#define RXF2SIDH  0x08
#define RXF2SIDL  0x09
#define RXF3SIDH  0x10
#define RXF3SIDL  0x11
#define RXF4SIDH  0x14
#define RXF4SIDL  0x15
#define RXF5SIDH  0x18
#define RXF5SIDL  0x19

//receive acceptance filter n extended indifier
#define RXF0EIDH  0x02
#define RXF0EIDL  0x03
#define RXF1EIDH  0x06
#define RXF1EIDL  0x07
#define RXF2EIDH  0x0a
#define RXF2EIDL  0x0b
#define RXF3EIDH  0x12
#define RXF3EIDL  0x13
#define RXF4EIDH  0x16
#define RXF4EIDL  0x17
#define RXF5EIDH  0x1a
#define RXF5EIDL  0x1b

//receive acceptance mask n standard identifer mask
#define RXM0SIDH  0x20
#define RXM0SIDL  0x21
#define RXM1SIDH  0x24
#define RXM1SIDL  0x25

//receive acceptance mask n extended identifer mask
#define RXM0EIDH  0x22
#define RXM0EIDL  0x23
#define RXM1EIDH  0x26
#define RXM1EIDL  0x27
.
.
.


Edit;
I also tried interrupts. Tx interrupts is working.
I am writing 0xFF to register CANTINTE.
I'm sending a message MCP2515, then I read CANINTF register. I read the value 0x04. Also INT Pin is running.

My Results are like this.

Thank You

Regards.
Mucit23



Joined: 10 May 2014
Posts: 8

View user's profile Send private message

PostPosted: Sat Aug 30, 2014 3:51 pm     Reply with quote

Thanks to everyone

My problem was solved. The problem was at the incoming identifier type. I was sending a message with standard ID. But can init function was extended_id to be used is specified.

Now, I'm getting a message with standard_id.

Thank You

Regards
Display posts from previous:   
Post new topic   Reply to topic    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