\ Posted on 6/13/03 by blueeyedpop \ Just got CANBUS working on the IsoPod \ also works with IsoPod-mini and ServoPod. \ This is my first working stab at it. Upload \ the same code to the transmitter and receiver. \ Run TYPEM on one, and XRX or XRX2 on the other. \ Thanks to Randy at NMI for the flags, constants and speed setup. \ ------------------------------------ \ To follow this, you really need the DSP56F801-7UM/D manual. \ \ 10 D88 ! ( 4 16BIT FILTER \ \ This sets up for four 16 bit filters. \ With 16 bit filters, there are a couple of bits which are \ specific to certain types of comms, the IDE bit and the RTR bit. \ \ The IDE bit set to 0 means we are using 11bit identifiers as \ opposed to 29 bit identifiers. \ \ The RTR is remote transmission request. Look for this bit, \ if you want to operate in a polled mode. I am not sure of the details, \ but if you set this bit in a package you send, then you do not send \ any data with it. \ \ MASK REGISTERS 1=DON'T CARE \ BOTTOM 3 BITS MUST BE SET ON 16 BIT MASK \ ACCEPTANCE REG, RX'D VALUE = REGISTER \ \ FILTER 0 \ 0F D94 ! ( CANIDMR0 Mask register 0 \ E7 D95 ! ( CANIDMR1 Mask register 1 \ 80 D90 ! ( CANIDAR0 Acceptance register 0 \ 00 D91 ! ( CANIDAR1 Acceptance register 1 \ \ so for the first filter, filter 0, we do 0F D94 ! \ which puts 0000,1111 into the top 16 bits of the mask register, \ which correspond to ID10 to ID containing 0's which means we want \ to look at them, and ID6 to ID3 to 1, which means we do not care \ what their value is. \ \ E7 D95 ! sets ID2 to ID0 to 1, and sets RTR to 0 and IDE to 0, \ with the remaining bits set to one. \ \ if you break it up by bytes, you have 0FE7 brake that into binary, \ and you have 0000 1111 1110 0111 \ which correspond to [ID10-ID7] [ID6-ID3] [ID2-ID0,RTR] and finally \ [IDE,DEFAULT 111] see fig8-26 in the manual. \ \ So this code sets us up to only look at ID10-ID7, if you look at the \ settings for the four filters, you will see the mask registers all \ have the same values. \ \ Next, the filter registers look somethinf like this: \ 8000 for Filter 0 \ 4000 for Filter 1 \ 2000 for Filter 2 \ 1000 for Filter 3 \ \ I have set just one bit for each filter, but they bit I set falls \ within the opening of the mask I set. \ \ In any case, this is how you would transmit a message. \ DD0 to DD3 set the bits for the identifier for the message, \ and DDC is the data length. \ \ ( ---------------- Program Start -------------------------- SCRUB ( CLEARS THE MEMORY HEX ( CAN REG D80 DFF D80 CONSTANT CANCTL0 EEWORD D81 CONSTANT CANCTL1 EEWORD D84 CONSTANT CANRFLG EEWORD D86 CONSTANT CANTFLG EEWORD FVARIABLE FPTEMP EEWORD : RXF? CANRFLG @ 1 AND ; EEWORD : RXCLR 1 CANRFLG ! ; EEWORD : TXE? CANTFLG @ 7 AND ; EEWORD : TX0E? CANTFLG @ 1 AND ; EEWORD : TX1E? CANTFLG @ 2 AND ; EEWORD : TX2E? CANTFLG @ 4 AND ; EEWORD : TX0 1 CANTFLG ! ; EEWORD : TX1 2 CANTFLG ! ; EEWORD : TX2 4 CANTFLG ! ; EEWORD : TX0-FP TX0E? IF FPTEMP F@ F. FPTEMP 2@ ( DUP D. DUP >< FF AND DD7 ! FF AND DD6 ! DUP >< FF AND DD5 ! FF AND DD4 ! 4 DDC ! TX0 THEN ; EEWORD : RX-FP RXF? IF DCC @ 4 = IF DC4 @ DC5 @ >< OR DC6 @ DC7 @ >< OR FPTEMP 2! FPTEMP F@ F. THEN RXCLR THEN ; EEWORD : RX RXF? IF DC4 DCC @ DUMP ." " DCC @ . ." BYTES " RXCLR THEN ; EEWORD : RX2 RXF? IF DC4 DCC @ TYPE RXCLR THEN ; EEWORD : LOOPBACK ( USE AFT INIT 1 D80 ! ( SOFT RESET D81 @ 4 OR D81 ! ( SET LOOPBACK 0 D80 ! ( END SOFT RESET ; EEWORD : INIT 1 D80 ! ( SOFT RESET 80 D81 ! ( MSCAN ON, EXTAL CLK ( 81 D81 ! ( MSCAN ON, IP CLK 01 D82 ! ( 0 SYNC, 2 PRESCALE 23 D83 ! ( 500K CLK ( 00 D88 ! ( 2 32BIT FILTER 10 D88 ! ( 4 16BIT FILTER ( 20 D88 ! ( 8 8BIT FILTER ( 30 D88 ! ( FILTER CLOSED ( The two zeros at byte 2, bit 4-5, are RTR and IDE ( If you set IDE it means you want 29 bit ID's ( If you transmit a 1 for RTR, it means it is a data requast message ( and carries no real data. This is a real gotcha! ( ( Filter 0 1000 XXXX XXX0 0XXX ( Filter 1 0100 XXXX XXX0 0XXX ( Filter 2 0010 XXXX XXX0 0XXX ( Filter 3 0001 XXXX XXX0 0XXX ( MASK REGISTERS 1=DON'T CARE ( BOTTOM 3 BITS MUST BE SET ON 16 BIT MASK ( ACCEPTANCE REG, RX'D VALUE = REGISTER ( FILTER 0 0F D94 ! ( CANIDMR0 E7 D95 ! ( CANIDMR1 80 D90 ! ( CANIDAR0 00 D91 ! ( CANIDAR1 ( FILTER 1 0F D96 ! ( CANIDMR2 E7 D97 ! ( CANIDMR3 40 D92 ! ( CANIDAR2 00 D93 ! ( CANIDAR3 ( FILTER 2 0F D9C ! ( CANIDMR4 E7 D9D ! ( CANIDMR5 20 D98 ! ( CANIDAR4 00 D99 ! ( CANIDAR5 ( FILTER 3 0F D9E ! ( CANIDMR6 E7 D9F ! ( CANIDMR7 10 D9A ! ( CANIDAR6 00 D9B ! ( CANIDAR7 0 D80 ! ( RELEASE RESET ; EEWORD : L D80 80 DUMP ; EEWORD ( DUMP ALL CAN REGISTERS : XRX BEGIN RX ?TERMINAL UNTIL ; EEWORD : XRX2 BEGIN RX2 ?TERMINAL UNTIL ; EEWORD ( FILTER-X-HIT SEND A PRE-SET MESSAGE TO A PARTICULAR FILTER : FILTER-0-HIT 08 DD0 ! 00 DD1 ! 00 DD2 ! 00 DD3 ! 46 DD4 ! ( MESSAGE F 49 DD5 ! ( MESSAGE I 4C DD6 ! ( MESSAGE L 54 DD7 ! ( MESSAGE T 45 DD8 ! ( MESSAGE E 52 DD9 ! ( MESSAGE R 20 DDA ! ( MESSAGE 30 DDB ! ( MESSAGE 0 8 DDC ! TX0 ; EEWORD : FILTER-1-HIT 40 DD0 ! 00 DD1 ! 00 DD2 ! 00 DD3 ! 46 DD4 ! ( MESSAGE F 49 DD5 ! ( MESSAGE I 4C DD6 ! ( MESSAGE L 54 DD7 ! ( MESSAGE T 45 DD8 ! ( MESSAGE E 52 DD9 ! ( MESSAGE R 20 DDA ! ( MESSAGE 31 DDB ! ( MESSAGE 1 8 DDC ! TX0 ; EEWORD : FILTER-2-HIT 20 DD0 ! 00 DD1 ! 00 DD2 ! 00 DD3 ! 46 DD4 ! ( MESSAGE F 49 DD5 ! ( MESSAGE I 4C DD6 ! ( MESSAGE L 54 DD7 ! ( MESSAGE T 45 DD8 ! ( MESSAGE E 52 DD9 ! ( MESSAGE R 20 DDA ! ( MESSAGE 32 DDB ! ( MESSAGE 2 8 DDC ! TX0 ; EEWORD : FILTER-3-HIT 10 DD0 ! 00 DD1 ! 00 DD2 ! 00 DD3 ! 46 DD4 ! ( MESSAGE F 49 DD5 ! ( MESSAGE I 4C DD6 ! ( MESSAGE L 54 DD7 ! ( MESSAGE T 45 DD8 ! ( MESSAGE E 52 DD9 ! ( MESSAGE R 20 DDA ! ( MESSAGE 33 DDB ! ( MESSAGE 3 8 DDC ! TX0 ; EEWORD VARIABLE EMM 8 ALLOT EEWORD VARIABLE LEN EEWORD VARIABLE XIT EEWORD VARIABLE ID 4 ALLOT EEWORD ( FILTER-X PRE SET THE FILTER TO USE WITH TYPEM ( USE XRX OR XRX2 TO RECIEVE THE MESSAGE : FILTER-0 80 ID ! 00 ID 1 + ! 00 ID 2 + ! 00 ID 3 + ! ; EEWORD : FILTER-1 40 ID ! 00 ID 1 + ! 00 ID 2 + ! 00 ID 3 + ! ; EEWORD : FILTER-2 20 ID ! 00 ID 1 + ! 00 ID 2 + ! 00 ID 3 + ! ; EEWORD : FILTER-3 10 ID ! 00 ID 1 + ! 00 ID 2 + ! 00 ID 3 + ! ; EEWORD : M ID DD0 4 CMOVE> ( 0 DD0 ! 0 DD1 ! 1F DD2 ! FE DD3 ! ( ALL BITS IN ID, DATA FORMAT EMM DD4 LEN @ CMOVE> LEN @ DDC ! TX0 ; EEWORD : TYPEM CR ." Manually enter eight characters on the keyboard " CR ." To Exit, hit Esc key " 0 XIT ! BEGIN 8 0 DO I 1+ LEN ! KEY DUP 1B = IF 1 XIT ! LEAVE ELSE I EMM + ! THEN LOOP M XIT @ UNTIL DROP ; EEWORD INIT ( Connect CANH to CANH and CANL to CANL GND to GND between systems ( Put 120 ohm terminating resistors across last CANH/CANL on each end ( For the TiniPod or Plug-a-Pod, besure to turn off PE2 ( to enable the transceiver ( PE2 OFF ( XRX ( to receive ( or ( PE2 OFF ( FILTER-0-HIT or FILTER-1-HIT or FILTER-2-HIT or FILTER-3-HIT ( to transmit, or ( FILTER-X ( to set id ( and then ( TYPEM