Hi,
For transfering the actual data to be sent and setting up the packet lenght etc I'd probably try something like this:
Code:
CAN_DATA VAR BYTE[8]
CAN_LENGTH VAR BYTE
CAN_ID_H VAR BYTE
CAN_ID_L VAR BYTE
i VAR BYTE
' Prepare a message
ArrayWrite CAN_DATA[$11, $22, $33, $44, $55, $66, $77, $88] ' Actual data, 8 bytes
CAN_LENGTH = 8 ' 8 because that's how many bytes we want to transfer
CAN_ID_H = 0
CAN_ID_L = 0
GOSUB Transfer_CAN_Data
END
'----Subrotuine to set the packet length, Standard identifiers, load the data to be sent from array and tell MCP2515 to send it when it can (CAN).
Tranfer_CAN_Data:
LOW CS ' Select device
SSPBUF = MCPWRT : PAUSE 1 ' Send write command
SSPBUF = TXB0SIDL : PAUSE 1 ' Select TXB0SIDL register.
SSPBUF = CAN_ID_L : PAUSE 1 ' Send low byte of standard identifier
' Next register is te TXB0SIDH so we can continue spitting out bytes.
SSPBUF = CAN_ID_H : PAUSE 1 ' Send high byte of standard identifier
HIGH CS ' Deselect device to end write operation
PAUSE 10
LOW CS ' Select device
' Now set the Transmit bufferdata length register
SSPBUF = MCPWRT : PAUSE 1 ' Send write command
SSPBUF = TXB0DLC : PAUSE 1 ' Point at register
SSPBUF = CAN_LENGTH : PAUSE 1 ' Send length of packet
' The first databyte register in the TX buffer is located right after the message
' length register so we can use the sequential write feature and just keep going
' with the actual data.
FOR i = 0 to CAN_LENGHT - 1 ' Iterate thru the array and transfer
SSPBUF = CAN_LENGTH[i] ' one byte at the time
PAUSE 1 ' Wait for it
NEXT
HIGH CS ' Deselect device to end write operation
PAUSE 10
LOW CS ' Select device
' Now the the message lenth is set and the data to be sent is transfered.
SSPBUF = MCPWRT : PAUSE 1 ' Send write command
SSPBUF = TXB0CTRL : PAUSE 1 ' Transmitt buffer control register
SSPBUF = %00001011 : PAUSE 1 ' Request message to be sent with highest priority
' According to the datasheet this does NOT inititare the actual transfer. It politely
' tells the MCP2515 that the databuffer is ready and can be sent whent the bus is available.
RETURN
Now, I don't know about the Standard Identifier, if they need to be set on a message per message basis or if they are like a node adress or something. In the code above they gets set each time which might be unneccessary. I'm also using PAUSE to wait for the MSSP module, looking at the interrupt flag or buffer free flag as you've been doing is obviously better but it cluttered up the overall structure so I used PAUSE for clarity.
Not saying it'll work but that's what I'd try.
/Henrik.
Bookmarks