Thanks for swordfish developer team.
High performance compiler.
Me Swordfish License user.
ECAN Module receiver function problem.Please HELP?
ECAN Programmable TX/RX and Auto-RTR Buffers or normal CAN needed example code
Besides CAN normal operation worked code sample.
Code: Select all
Device = 18F4680
Clock = 20
Config
OSC = HS,IESO = OFF,PWRT = ON,WDT = OFF,WDTPS = 128,LVP = OFF,DEBUG = OFF,
MCLRE = ON
Dim CAN_TX_BUFFER0(8) As Byte
Dim CAN_RX_BUFFER0(8) As Byte
Dim CAN_RX_ID0 As Word
Dim CAN_RX_ID0_0 As CAN_RX_ID0.Byte0
Dim CAN_RX_ID0_1 As CAN_RX_ID0.Byte1
Dim CAN_TX_ID0 As Word
Dim CAN_TX_ID0_0 As CAN_TX_ID0.Byte0
Dim CAN_TX_ID0_1 As CAN_TX_ID0.Byte1
Dim CAN_TX_BYTE0 As Byte
Dim CAN_TX_BYTE1 As Byte
Dim CAN_TX_BYTE2 As Byte
Dim IDX As Byte
Sub CAN_INIT()
TRISB.2 = 0
TRISB.3 = 1
CAN_TX_ID0 = 12341
CAN_RX_ID0 = 12344
CAN_TX_BYTE0 = 0
CAN_TX_BYTE1 = 0
CAN_TX_BYTE2 = 0
For IDX = 0 To 7
CAN_TX_BUFFER0(IDX) = 0
CAN_RX_BUFFER0(IDX) = 0
Next
CANCON = %10000000
WT:
If CANSTAT.7 = 0 Then GoTo WT EndIf
ECANCON = %01000000
BRGCON1 = %00000011
BRGCON2 = %11101100
BRGCON3 = %00000111
CIOCON.5 = 0
BSEL0 = %00011100
'B0CON = %00000001
'B1CON = %00000001
'B2CON = %00000001
B3CON = %00000000
B4CON = %00000001
B5CON = %00000010
B0DLC = CAN_TX_BYTE0
B1DLC = CAN_TX_BYTE1
B2DLC = CAN_TX_BYTE2
B0D0 = 0
B0D1 = 0
B0D2 = 0
B0D3 = 0
B0D4 = 0
B0D5 = 0
B0D6 = 0
B0D7 = 0
B1D0 = 0
B1D1 = 0
B1D2 = 0
B1D3 = 0
B1D4 = 0
B1D5 = 0
B1D6 = 0
B1D7 = 0
B2D0 = 0
B2D1 = 0
B2D2 = 0
B2D3 = 0
B2D4 = 0
B2D5 = 0
B2D6 = 0
B2D7 = 0
B3D0 = 0
B3D1 = 0
B3D2 = 0
B3D3 = 0
B3D4 = 0
B3D5 = 0
B3D6 = 0
B3D7 = 0
B4D0 = 0
B4D1 = 0
B4D2 = 0
B4D3 = 0
B4D4 = 0
B4D5 = 0
B4D6 = 0
B4D7 = 0
B5D0 = 0
B5D1 = 0
B5D2 = 0
B5D3 = 0
B5D4 = 0
B5D5 = 0
B5D6 = 0
B5D7 = 0
B0EIDH = CAN_TX_ID0_1
B0EIDL = CAN_TX_ID0_0
B3EIDH = CAN_RX_ID0_1
B3EIDL = CAN_RX_ID0_0
B0SIDL = %00000000
B1SIDL = %00000000
B2SIDL = %00000000
B0SIDH = %00000000
B1SIDH = %00000000
B2SIDH = %00000000
B0SIDL.3 = 1
B1SIDL.3 = 1
B2SIDL.3 = 1
RXF0SIDL = %00000000
RXF0SIDH = %00000000
RXF1SIDL = %00000000
RXF1SIDL = %00000000
RXF2SIDL = %00000000
RXF3SIDL = %00000000
RXF0SIDL.3 = 1
RXF1SIDL.3 = 1
RXF2SIDL.3 = 1
RXF0EIDH = CAN_RX_ID0_1
RXF0EIDL = CAN_RX_ID0_0
RXM0SIDH = %00000000
RXM0SIDL = %00000000
RXM1SIDH = %00000000
RXM1SIDL = %00000000
RXM0SIDL.3 = 1
RXM1SIDL.3 = 1
RXM0EIDL = %11111111
RXM0EIDH = %11111111
RXM1EIDL = %11111111
RXM1EIDH = %11111111
RXFCON0 = %00000111
RXFCON1 = %00000111
SDFLC = %00000000
RXFBCON0 = %00110010
RXFBCON1 = %00000100
MSEL0 = %11000100
CANCON = %00000000
DelayMS(100)
WT1:
If CANSTAT.7 = 0 And CANSTAT.6 = 0 And CANSTAT.5 = 0 Then GoTo WT2 EndIf
GoTo WT1
WT2:
PORTD.0 = 1
DelayMS(500)
PORTD.0 = 0
DelayMS(500)
End Sub
Sub CAN_SEND_0()
B0D0 = CAN_TX_BUFFER0(0)
B0D1 = CAN_TX_BUFFER0(1)
B0D2 = CAN_TX_BUFFER0(2)
B0D3 = CAN_TX_BUFFER0(3)
B0D4 = CAN_TX_BUFFER0(4)
B0D5 = CAN_TX_BUFFER0(5)
B0D6 = CAN_TX_BUFFER0(6)
B0D7 = CAN_TX_BUFFER0(7)
B0CON = %00001000
WAIT_TX0_OK:
If B0CON.3 = 1 Then GoTo WAIT_TX0_OK EndIf
End Sub
MAIN:
TRISD.0 = 0
CAN_INIT()
While TRUE
CAN_TX_ID0 = 12341
CAN_TX_BUFFER0(0) = 255
CAN_TX_BYTE0 = 8
CAN_SEND_0()
PORTD.0 = 1
DelayMS(500)
PORTD.0 = 0
DelayMS(500)
CAN_TX_ID0 = 12341
CAN_TX_BUFFER0(0) = 0
CAN_TX_BYTE0 = 8
CAN_SEND_0()
PORTD.0 = 1
DelayMS(500)
PORTD.0 = 0
DelayMS(500)
Wend
End
Thanks,Mtl
Best regards