
Originally Posted by
comwarrior
The 4550 is quite commonly supported... not only that but the datasheets seem (to me) to be written properly...
I've not played with CAN, however i (along with a lot of other people on here) know the 4550 very well...
Thank you for your substantive post. It has helped me greatly.
Are you using SHIFTOUT to write the values or do you use the MSSP module?
If it was me I start by making a routine which write values to the MCP2515. Then I'd make a routine which reads values from the MCP2515 to verify that the write routine is working properly.
Can you post some code of your current attempts?
I'm using the MSSP. I think my commands are getting to the MCP but I'm guessing my problem lies in one of these places:
CNF1, CNF2, CNF3, SSPCON, SSPSTAT OR BAUDCON. It could be anywhere else too. Basically, the entire program is suspect. Thanks for the help Henrik. Maybe you can spot some issues with what I wrote:
Code:
INCLUDE "modedefs.bas"
'
DEFINE OSC 20
'==============================================================================
' SETTINGS
' ==============================================================================
'76543210 '76543210
TRISA = %11111111: PORTA = %00000000
TRISB = %00010001: PORTB = %00010000
TRISC = %00000000: PORTC = %00000001
TRISD = %11111111: PORTD = %00000000
TRISE = %00010000: PORTE = %00010111
ADCON0 = %00000000
ADCON1 = %00000000
ADRESH = %00000000
ADRESL = %00000000
CMCON = %00000000
SSPSTAT = %11000100
SSPCON1 = %10110001
BAUDCON = %00001111
'===============================================================================
' Register Mapping
'================================================================================
CANSTAT CON $0E
CANCTRL CON $0F
BFPCTRL CON $0C
TEC CON $1C
REC CON $1D
CNF3 CON $28
CNF2 CON $29
CNF1 CON $2A
CANINTE CON $2B
CANINTF CON $2C
EFLG CON $2D
TXRTSCTRL CON $0D
'' Recieve Filters ''
RXF0SIDH CON $00
RXF0SIDL CON $01
RXF0EID8 CON $02
RXF0EID0 CON $03
RXF1SIDH CON $04
RXF1SIDL CON $05
RXF1EID8 CON $06
RXF1EID0 CON $07
RXF2SIDH CON $08
RXF2SIDL CON $09
RXF2EID8 CON $0A
RXF2EID0 CON $0B
RXF3SIDH CON $10
RXF3SIDL CON $11
RXF3EID8 CON $12
RXF3EID0 CON $13
RXF4SIDH CON $14
RXF4SIDL CON $15
RXF4EID8 CON $16
RXF4EID0 CON $17
RXF5SIDH CON $18
RXF5SIDL CON $19
RXF5EID8 CON $1A
RXF5EID0 CON $1B
'' Receive Masks ''
RXM0SIDH CON $20
RXM0SIDL CON $21
RXM0EID8 CON $22
RXM0EID0 CON $23
RXM1SIDH CON $24
RXM1SIDL CON $25
RXM1EID8 CON $26
RXM1EID0 CON $27
'' Tx Buffer 0 ''
TXB0CTRL CON $30
TXB0SIDH CON $31
TXB0SIDL CON $32
TXB0EID8 CON $33
TXB0EID0 CON $34
TXB0DLC CON $35
TXB0D0 CON $36
TXB0D1 CON $37
TXB0D2 CON $38
TXB0D3 CON $39
TXB0D4 CON $3A
TXB0D5 CON $3B
TXB0D6 CON $3C
TXB0D7 CON $3D
'' Tx Buffer 1 ''
TXB1CTRL CON $40
TXB1SIDH CON $41
TXB1SIDL CON $42
TXB1EID8 CON $43
TXB1EID0 CON $44
TXB1DLC CON $45
TXB1D0 CON $46
TXB1D1 CON $47
TXB1D2 CON $48
TXB1D3 CON $49
TXB1D4 CON $4A
TXB1D5 CON $4B
TXB1D6 CON $4C
TXB1D7 CON $4D
'' Tx Buffer 2 ''
TXB2CTRL CON $50
TXB2SIDH CON $51
TXB2SIDL CON $52
TXB2EID8 CON $53
TXB2EID0 CON $54
TXB2DLC CON $55
TXB2D0 CON $56
TXB2D1 CON $57
TXB2D2 CON $58
TXB2D3 CON $59
TXB2D4 CON $5A
TXB2D5 CON $5B
TXB2D6 CON $5C
TXB2D7 CON $5D
'' Rx Buffer 0 ''
RXB0CTRL CON $60
RXB0SIDH CON $61
RXB0SIDL CON $62
RXB0EID8 CON $63
RXB0EID0 CON $64
RXB0DLC CON $65
RXB0D0 CON $66
RXB0D1 CON $67
RXB0D2 CON $68
RXB0D3 CON $69
RXB0D4 CON $6A
RXB0D5 CON $6B
RXB0D6 CON $6C
RXB0D7 CON $6D
'' Rx Buffer 1 ''
RXB1CTRL CON $70
RXB1SIDH CON $71
RXB1SIDL CON $72
RXB1EID8 CON $73
RXB1EID0 CON $74
RXB1DLC CON $75
RXB1D0 CON $76
RXB1D1 CON $77
RXB1D2 CON $78
RXB1D3 CON $79
RXB1D4 CON $7A
RXB1D5 CON $7B
RXB1D6 CON $7C
RXB1D7 CON $7D
'===============================================================================
' Register Bit Masks
'===============================================================================
DLC_0 CON $00
DLC_1 CON $01
DLC_2 CON $02
DLC_3 CON $03
DLC_4 CON $04
DLC_5 CON $05
DLC_6 CON $06
DLC_7 CON $07
DLC_8 CON $08
'===============================================================================
' ' CAN SPI commands
'===============================================================================
'
' CAN_RESET $C0
' CAN_READ $03
MCPWRT CON $02
' CAN_RTS $80
' CAN_RTS_TXB0 $81
' CAN_RTS_TXB1 $82
' CAN_RTS_TXB2 $84
' CAN_RD_STATUS $A0
' CAN_BIT_MODIFY $05
' CAN_RX_STATUS $B0
' CAN_RD_RX_BUFF $90
' CAN_LOAD_TX $40
'===============================================================================
' ALIAS & MODIFIERS
'==============================================================================
CS VAR PORTB.4 ' CS LINE
SCLK VAR PORTB.1 ' CLOCK LINE
SDI VAR PORTB.0 ' DATA INPUT LINE
SDO VAR PORTC.7 ' DATA OUTPUT LINE
SENDLED VAR PORTA.5 ' LED TO INDICATE THE PROGRAM IS IN THE SENDING ROUTINE
MAINLED VAR PORTE.2 ' LED TO INDICATE THE PROGRAM IS IN THE MAIN ROUTINE
INT VAR PORTB.5 ' INTERRUPT OUTPUT FROM 18F4550
MCPRST VAR PORTC.0 ' RESET LINE FOR MCP2515
SW_LOAD VAR PORTA.4 ' BUTTON CONNECTED TO 18F4550 TO START SENDING DATA (WHEN IMPLEMENTED)
'===============================================================================
' SOFTWARE VARIABLES
'===============================================================================
DATAOUT VAR BYTE 'FIRST BYTE OF DATA TO BE SENT
MCPREG VAR BYTE 'ADDRESS OF FIRST BYTE OF DATA TO BE SENT
'==============================================================================
' RESET MCP2515
'==============================================================================
LOW MCPRST ' COMMAND TO RESET THE MCP2515 (SOFTWARE)
PAUSE 1
HIGH MCPRST
PAUSE 20
'==============================================================================
' INITIALIZE MCP2515
'==============================================================================
LOW CS
SSPBUF = MCPWRT ' COMMAND TO WRITE TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
MCPREG = CANCTRL ' PUT THE MCP2515 INTO CONFIGURATION MODE
DATAOUT = %10001010
GOSUB SENDCANDATA
MCPREG = CNF3 'CNF3 - CONFIGURATION REGISTER 3
DATAOUT = $07
GOSUB SENDCANDATA
MCPREG = CNF2 'CNF2 - CONFIGURATION REGISTER 2
DATAOUT = $BA
GOSUB SENDCANDATA
MCPREG = CNF1 'CNF1 - CONFIGURATION REGISTER 1
DATAOUT = $03
GOSUB SENDCANDATA
MCPREG = TXB0SIDL 'TRANSMIT BUFFER 0 FOR SIDL
DATAOUT = %10000000
GOSUB SENDCANDATA
MCPREG = TXB0SIDH 'TRANSMIT BUFFER 0 FOR SIDH
DATAOUT = %00000001
GOSUB SENDCANDATA
MCPREG = CANCTRL 'PUT THE MCP2515 BACK INTO NORMAL MODE
DATAOUT = %00001010
GOSUB SENDCANDATA
HIGH CS
'==============================================================================
' MAIN PROGRAM FOR MCP2515
'==============================================================================
PROGRAMSTART:
HIGH SENDLED
PAUSE 50
LOW CS
SSPBUF = $02 ' COMMAND TO WRITE TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 :WEND
MCPREG = CANINTE ' DISABLE ALL INTERRUPTS
DATAOUT = %00000000
GOSUB SENDCANDATA
MCPREG = TXB0CTRL ' FLAG THE TRANSMIT BUFFER - - 11=HIGH, 10=MEDIUM, 01=LOW, 00=LOWEST
DATAOUT = %00001011
GOSUB SENDCANDATA
MCPREG = TXB0SIDL ' TRANSMIT BUFFER 0 FOR SIDH
DATAOUT = %00110010
GOSUB SENDCANDATA
MCPREG = TXB0SIDH ' TRANSMIT BUFFER 0 FOR SIDH
DATAOUT = %00110001
GOSUB SENDCANDATA
MCPREG = TXB0DLC ' NUMBER OF BYTES TO BE TRANSMITTED IN CAN FRAME
DATAOUT = %00000010
GOSUB SENDCANDATA
MCPREG = TXB0D0 ' DATA PACKET FOR BYTE 1
DATAOUT = %00000001
GOSUB SENDCANDATA
MCPREG = TXB0D1 'DATA PACKET FOR BYTE 2
DATAOUT = %00000100
GOSUB SENDCANDATA
HIGH CS
LOW sendled
pause 50
goto PROGRAMSTART
'===============================================================================
' SEND CAN DATA SECTION
'===============================================================================
SENDCANDATA:
SSPBUF = MCPREG ' ADDRESS TO LOAD THE DATA TO THE MCP2515
PIR1.3 = 0
WHILE PIR1.3=0 : WEND
SSPBUF = DATAOUT 'DATA BEING LOADED TO THE MCP2515 ON MCPREG
PIR1.3 = 0
WHILE PIR1.3=0 : WEND
RETURN
Bookmarks