2 # GoodFET SPI Flash Client
4 # (C) 2012 Travis Goodspeed <travis at radiantmachines.com>
6 # This code is being rewritten and refactored. You've been warned!
12 from GoodFETMCPCAN import GoodFETMCPCAN;
13 from intelhex import IntelHex;
16 print "Usage: %s verb [objects]\n" % sys.argv[0];
17 print "%s info" % sys.argv[0];
18 print "%s test" % sys.argv[0];
19 print "%s peek 0x$start [0x$stop]" % sys.argv[0];
20 #print "%s poke 0x$adr 0x$val" % sys.argv[0];
22 print "\n%s sniff [kHz]" % sys.argv[0];
23 print "\n%s isniff [kHz]" % sys.argv[0];
24 print "\n%s spit [kHz]" % sys.argv[0];
26 print "\nSupported rates: 83.3, 100, 125, 250, 500, 1000 kHz.";
29 #Initialize FET and set baud rate
30 client=GoodFETMCPCAN();
37 #Might read as all ones if chip has a startup delay.
39 if(sys.argv[1]=="info"):
40 print "MCP2515 Info:\n\n";
42 print "Mode: %s" % client.MCPcanstatstr();
43 print "Read Status: %02x" % client.MCPreadstatus();
44 print "Rx Status: %02x" % client.MCPrxstatus();
45 print "Tx Errors: %3d" % client.peek8(0x1c);
46 print "Rx Errors: %3d\n" % client.peek8(0x1d);
49 print "CNF1: %02x" %client.peek8(0x2a);
50 print "CNF2: %02x" %client.peek8(0x29);
51 print "CNF3: %02x\n" %client.peek8(0x28);
52 print "RXB0 CTRL: %02x" %client.peek8(0x60);
53 print "RXB1 CTRL: %02x" %client.peek8(0x70);
55 packet0=client.readrxbuffer(0);
56 packet1=client.readrxbuffer(1);
57 for foo in [packet0, packet1]:
58 print client.packet2str(foo);
60 if(sys.argv[1]=="sniff"):
62 rate=float(sys.argv[2]);
63 print "Calling MCPsetrate for %i." %rate;
64 client.MCPsetrate(rate);
65 client.MCPreqstatListenOnly();
67 print "Mode: %s" % client.MCPcanstatstr();
69 print "CNF1: %02x" %client.peek8(0x2a);
70 print "CNF2: %02x" %client.peek8(0x29);
71 print "CNF3: %02x\n" %client.peek8(0x28);
74 packet=client.rxpacket();
76 print client.packet2str(packet);
78 if (client.peek8(0x2C) & 0x80):
79 client.MCPbitmodify(0x2C,0x80,0x00);
80 print"...malformed packet recieved";
82 if(sys.argv[1]=="snifftest"):
84 freqrange=[10.4, 41.6, 83.3, 100, 125, 250, 500, 1000];
86 for rate in freqrange:
88 print "CAN Freq Test: %3d kHz" %rate;
89 client.MCPsetrate(rate);
90 #print "CNF1/2/3: %02x %02x %02x" %(client.peek8(0x2a), client.peek8(0x29),client.peek8(0x28));
91 client.MCPreqstatListenOnly();
92 print "Mode: %s" % client.MCPcanstatstr();
96 for n in range(0,400):
97 packet=client.rxpacket();
99 print client.packet2str(packet);
102 if (client.peek8(0x2C) & 0x80):
104 client.MCPbitmodify(0x2C,0x80,0x00);
107 print "No packets sniffed for %3d kHz" %rate;
109 percenterror = float(errors/x);
111 print "Results for %3.1 kHz: recieved %3d packets, registered %3d RX errors, for a %3.3f percent error rate." %(rate, x, errors, percenterrors);
115 if(sys.argv[1]=="isniff"):
116 """ An intelligent sniffer, decodes message format """
117 """ More features to be added soon """
119 rate=float(sys.argv[2]);
120 client.MCPsetrate(rate);
121 client.MCPreqstatListenOnly();
123 packet=client.rxpacket();
132 print "\nArbID: " + client.packet2str(arbid);
133 print "EID: " + client.packet2str(eid);
134 print "DLC: " + client.packet2str(dlc);
135 print "Data: " + client.packet2str(data);
137 if(sys.argv[1]=="test"):
138 print "\nMCP2515 Self Test:";
140 #Switch to config mode and try to rewrite TEC.
141 client.MCPreqstatConfiguration();
142 client.poke8(0x00,0xde);
143 if client.peek8(0x00)!=0xde:
144 print "ERROR: Poke to TEC failed.";
146 print "SUCCESS: Register read/write.";
148 #Switch to Loopback mode and try to catch our own packet.
149 client.MCPreqstatLoopback();
152 0x08, # LOWER nibble must be 8 or greater to set EXTENDED ID
154 0x08, # UPPER nibble must be 0 to set RTR bit for DATA FRAME
155 # LOWER nibble is DLC
156 0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF]
157 client.txpacket(packet1);
158 client.txpacket(packet1);
159 print "Waiting on loopback packets.";
162 packet=client.rxpacket();
164 print "Message recieved: %s" % client.packet2str(packet);
168 if(sys.argv[1]=="peek"):
171 start=int(sys.argv[2],16);
174 stop=int(sys.argv[3],16);
175 print "Peeking from %04x to %04x." % (start,stop);
177 print "%04x: %02x" % (start,client.peek8(start));
180 if(sys.argv[1]=="spit"):
183 rate=float(sys.argv[2]);
184 print "Calling MCPsetrate for %i." %rate;
185 client.MCPsetrate(rate);
187 client.MCPreqstatNormal();
190 0x08, # LOWER nibble must be 8 or greater to set EXTENDED ID
192 0x08, # UPPER nibble must be 0 to set RTR bit for DATA FRAME
193 # LOWER nibble is DLC
194 0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFF]
196 client.txpacket(packet);
197 data = client.peek8(0x30);
198 while (data&0x08)==0:
200 data=client.peek8(0x30);
201 print "message successfully sent!";
203 if(sys.argv[1]=="setbitrate"):
205 rate=float(sys.argv[2]);
206 print "Calling MCPsetrate for %i." %rate;
207 client.MCPsetrate(rate);