; Orange5 programmer module v4.6 ; (c) 2009-2015 CnCLab ; CHIP=Orange 5 CAN bus example ; Minimum software version 1.31 !!! SOCKET=0 ALLPINS=0 ;INFO="CAN Example" POWER=0 @ARX=8 ; приемный массив. @ATX={1,2,3,4,5,6,7,8} ; массив для передачи. BUSO=UTXF,252 BUSO=UTXC,253 BUSO=UTX,254 BUSI=URX,254 BUSO=CAN_MR,0x60 BUSO=CAN_BAUD,0x61 ; CAN_BAUD BUSO=CAN_TCR,0x62 ; CAN Transfer Command (не используется) BUSO=CAN_ACR,0x63 ; CAN Abort Command BUSO=CAN_MBOX,0x64 ; select mailbox 0..7 BUSO=CAN_MMR,0x65 ; CAN Message Mode BUSO=CAN_MAM,0x66 ; CAN Acceptance Mask BUSO=CAN_MID,0x67 ; CAN Message ID BUSO=CAN_DATL,0x6A ; CAN Message L BUSO=CAN_DATH,0x6B ; CAN Message H BUSO=CAN_MCR,0x6C ; CAN Message Control BUSI=CAN_STAT,0x60 ;BUSI=CAN_TIM,0x61 BUSI=CAN_TIMS,0x62 ; Timestamp BUSI=CAN_ECR,0x63 ; CAN Error Counter Rx BUSI=CAN_ECT,0x63 ; CAN Error Counter Tx BUSI=CAN_MMR,0x65 ; CAN Message Mode BUSI=CAN_MAM,0x66 ; CAN Acceptance Mask BUSI=CAN_MID,0x67 ; CAN Message ID BUSI=CAN_MSR,0x69 ; CAN Message Stat BUSI=CAN_DL,0x6A ; CAN Message Low BUSI=CAN_DH,0x6B ; CAN Message High CDELAY=0 ; one set delay R10=Baud,d R12=Listen,C1 R13=ID,H4 R14=Data,E8 PINO=HSPEED,11 [#SETUP] VCC=1 R10=125000 ;default baudrate R12=1 ;Listen R13=0x001 ;default ID R15=8 ;size [INIT] VCC=1 CAN_MR=0x00 ;disable CAN_BAUD=R10 ;25000 ; BRP=5, PHASE2=1 baud=25000 ;CAN_BAUD=50000 CAN_MR=0x81 ;enable, DRPT-no repeat ;CAN_MR=0x81 ;enable, DRPT-no repeat ;CAN_MBOX=0 ;CAN_MMR=0x03000000 ;MOT=011-transmit HSPEED=1 ; For high-speed operation! P=10000 ; Edit and tx message from array [TxMSG] CAN_MR=0x0 CAN_MBOX=4 CAN_MMR=0 UTX=@ATX ;синхронизация массива! R15?>8{R15=8} R14=R15,R14=+1,R14=*256,R14=+1 ; array number and view size+1 ;REGINFO(R14,) GET=("Send Message",R13,R14) ;MID, MSG RA?0{EXIT} ;в R14 возвращается длина сообщения. R15=R14 @ATX=URX ;синхронизация массива! ;CAN_MR=0x81 ;enable, DRPT-no repeat ;must disable the mailbox before writing to CAN_MIDx registers! ;CAN_MR=0x81 ;enable, DRPT-no repeat ;CAN_MMR=0x03000000 ;MOT=011-transmit Mailbox ;P=20000 CAN_MR=0x81 ;enable, DRPT-no repeat CAN_MMR=0x03000000 ;MOT=011-transmit Mailbox R0=R13 R13?<0x20000000{ ; короткие ID R0=<<18,R0=&0x1FFC0000 ;сдвиг в MIDa } CAN_MID=R0 ;CAN_MR=0x81 ;enable, DRPT-no repeat ; данные передаются из массива ATX CAN_DATL=@ATX(R15) ;R15 - длина сообщения. ;@ATX[0]=R5 ;R5=+1 ;@ATX[1]=R5 ;CAN_MCR=0x00880000 ;send 8 bytes msg ;CAN_TCR=0x10 ;tx mailbox1 - нужно не обязательно? P=10 R0=CAN_STAT R1=CAN_ECR PRINT=S("Send: STAT=%08X, ECR=%08X",R0,R1) ; ждем успешной передачи сообщения. LOOP(500){ R0=CAN_MSR R0=&0x800000 ; MRDY R0?!0{ ;1 Mailbox data have been transmitted. After setting the MOT field in the CAN_MMR, MRDY is reset to 1. CAN_MMR=0x00000000 ; disable transmit Mailbox CAN_MCR=0x00400000 ;MRDY, MABT are cleared by writing MTCR or MACR in the CAN_MCRx register PRINT=L("message transmitted\n") ;transmit finished ok } P=100 } P=250000 CAN_MMR=0x00000000 ; disable transmit Mailbox CAN_MCR=0x00400000 ;MACR=1 Cancels transfer request if the message has not been transmitted to the CAN transceiver. CAN_ACR=0xFF ; Cancels transfer request if the message has not been transmitted to the CAN transceiver. [_SHOWRX] R1=>>18,R1=&0x7FF ;11 bit ID R2=>>16,R2=&0xF ; msg length R18=@ARX[0] R2?1{PRINT=L("ID%03X S%u. %02X\n",R1,R2,R18),RETURN} R19=@ARX[1] R2?2{PRINT=L("ID%03X S%u. %02X %02X\n",R1,R2,R18,R19),RETURN} R1A=@ARX[2] R2?3{PRINT=L("ID%03X S%u. %02X %02X %02X\n",R1,R2,R18,R19,R1A),RETURN} R1B=@ARX[3] R2?4{PRINT=L("ID%03X S%u. %02X %02X %02X %02X\n",R1,R2,R18,R19,R1A,R1B),RETURN} R1C=@ARX[4] R2?5{PRINT=L("ID%03X S%u. %02X %02X %02X %02X %02X\n",R1,R2,R18,R19,R1A,R1B,R1C),RETURN} R1D=@ARX[5] R2?6{PRINT=L("ID%03X S%u. %02X %02X %02X %02X %02X %02X\n",R1,R2,R18,R19,R1A,R1B,R1C,R1D),RETURN} R1E=@ARX[6] R2?7{PRINT=L("ID%03X S%u. %02X %02X %02X %02X %02X %02X %02X\n",R1,R2,R18,R19,R1A,R1B,R1C,R1D,R1E),RETURN} R1F=@ARX[7] PRINT=L("ID%03X S%u. %02X %02X %02X %02X %02X %02X %02X %02X\n",R1,R2,R18,R19,R1A,R1B,R1C,R1D,R1E,R1F) [RxMSG] CAN_MR=0 CAN_MBOX=0 CAN_MMR=0x01000000 ;MOT=001-Reception Mailbox ;CAN_MMR=0x02000000 ;MOT=010 -Reception Mailbox with overwrite CAN_MAM=0 ; //0xFFFFFFFF ;Message Acceptance Mask Register - receive ALL CAN_MCR= 0x00800000 ;MTCR=1 Allows the reception of the next message ;CAN_DATL=0xFFFFFFFF ;CAN_DATH=0xFFFFFFFF CAN_MID=0x0 ;0xFFFFFFFF ;??? CAN_MBOX=1 CAN_MMR=0x01000000 ;MOT=010 -Reception Mailbox with overwrite CAN_MAM=0x0 ;Message Acceptance Mask Register - receive ALL CAN_MID=0x00000000 CAN_MCR=0x00800000 ;MTCR=1 Allows the reception of the next message R12?1{CAN_MR=0x15} ; 0x05 ;enable, ABM=Autobaud, TEOF=1 R12?0{CAN_MR=0x11} ; No Autobaud CAN_MBOX=0 P=1000 R9=0 LOOP(0xFFFFFFFF){ ; данные передаются начиная с младшего байта DATAL R11=CAN_STAT ;R5=R0 R9=+1,R3=R9,R3=&0xFFF,R3?0{R1=CAN_ECR,PRINT=S("ST=%08X EC=%04X",R11,R1)} ;R0=&0xFF ;mask mailboxes in CAN_STAT R11[0]?1{ ;Mailbox0 CAN_MBOX=0 R1=CAN_MID ;R3=CAN_DL ;R4=CAN_DH ;data @ARX=CAN_DL R2=CAN_MSR CAN_MCR=0x00800000 ;MTCR=1 Allows the reception of the next message MRDY, MABT are cleared by writing MTCR or MACR in the CAN_MCRx register _SHOWRX } R11[1]?1{ ;Mailbox1 CAN_MBOX=1 R1=CAN_MID ;R3=CAN_DL ;R4=CAN_DH ;data @ARX=CAN_DL R2=CAN_MSR CAN_MCR=0x00800000 ;MTCR=1 Allows the reception of the next message MRDY, MABT are cleared by writing MTCR or MACR in the CAN_MCRx register _SHOWRX } P=1 } [#Setup] GET=("Set Baud",R10,R12) [END] CAN_ACR=0xFF ; Cancels transfer request if the message has not been transmitted to the CAN transceiver. CAN_MR=0 ;disable CAN