BMS I/Fプログラム

Dependencies:   mbed

Revision:
0:2d6ffd5a4d2e
Child:
1:5690684e5460
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 12 02:51:41 2015 +0000
@@ -0,0 +1,126 @@
+#include "mbed.h"
+#include "LTC6803.h"
+
+DigitalOut myled(P2_17);
+SPI spi(P0_9, P0_8, P1_29); // mosi, miso, sclk
+DigitalOut cs(P0_2);
+
+Serial pc(P0_19, P0_18);
+
+unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat);
+
+static unsigned char crc8_table[256];      // 8-bit table for PEC calc
+static int made_table = 0;         // table made flag
+unsigned char packet[18]={0};               // used for PEC calc
+unsigned char PECbyte;                                                   // PEC of a byte
+unsigned char PECpacket;                // PEC of packet
+unsigned char PECpacketREAD;             // value that PECpacket should be as read from 6803
+
+static void init_crc8();
+void setPECbyte(unsigned char m);
+void setPECpacket(unsigned char np);
+
+static void init_crc8() {
+   int z,j;
+   unsigned char cr;
+   if (!made_table) {
+      for (z = 0; z < 256; z ++) {
+         cr = z;
+         for (j = 0; j < 8; j ++) {
+            cr = (cr << 1) ^ ((cr & 0x80) ? 0x07 : 0);
+         }
+         crc8_table[z] = cr & 0xFF;
+      }
+      made_table = 1;
+   }
+}
+
+void setPECbyte(unsigned char m) {
+   PECbyte = 0x41;                   // initialize PECbyte
+   if (!made_table) {
+      init_crc8();
+   }
+   PECbyte = crc8_table[(PECbyte) ^ m];
+}
+
+void setPECpacket(unsigned char np) {            // np is number of bytes currently in packet[]
+   int z;
+   PECpacket = 0x41;                  // initialize PECpacket
+   if (!made_table) {
+      init_crc8();
+   }
+   for (z = 0; z < np; z ++) {
+      PECpacket = crc8_table[(PECpacket) ^ packet[z]];
+   }
+}
+unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat){
+    unsigned char pec;
+    char loop, outerloop;
+    datainput in;
+    in.byte = 0;
+    pec = CRCDEFAULT;
+    for(outerloop = 0; outerloop < numdat; outerloop++){
+        for(loop = 8; loop > 0; loop--){
+            in.in.b0 = (dat[outerloop] >> (loop - 1)) ^ ((pec >> 7));
+            in.in.b1 = in.in.b0 ^ (pec);
+            in.in.b2 = in.in.b0 ^ (pec >> 1);
+            pec = pec << 1;
+            pec = (pec & 0xF8) | (in.byte & 0x07);
+        }
+    }
+    return pec;
+}
+
+
+
+int main() {
+    unsigned char cmd, tmp, datnum;
+    unsigned char dat[16], getdat[16];
+    char str[32];
+    cs = 1;
+    spi.format(8,3);
+    spi.frequency(50000);
+    pc.baud(460800);
+    cmd = WRCFG;
+    spi.write(cmd);
+    spi.write(CalcCRCLTC6803(&cmd, 1));
+    dat[0] = 0x02;
+    dat[1] = 0x00;
+    dat[2] = 0xf0;
+    dat[3] = 0xff;
+    dat[4] = 0x00;
+    dat[5] = 0x00;
+    for(int loop = 0;loop < 6; loop++){
+        spi.write(dat[loop])
+    }
+    cmd = CalcCRCLTC6803(dat, 6);
+    spi.write(cmd);
+    while(1) {
+        pc.printf("cmd in\n");
+        pc.scanf("%x", &cmd);
+        cs = 0;
+        pc.printf("dat num\n");
+        pc.scanf("%d", &datnum);
+        for(tmp = 0;tmp < datnum; tmp++){
+            pc.printf("dat num[%d]\n", (tmp));
+            pc.scanf("%s", str);
+            dat[tmp] = strtol(str, NULL, 16);
+        }
+        spi.write(cmd);
+//        pc.printf("%X\n", cmd);
+        cmd = CalcCRCLTC6803(&cmd, 1);
+        spi.write(cmd);
+//        pc.printf("%X\n", cmd);
+        for(tmp = 0; tmp < datnum; tmp++){
+            getdat[tmp] = spi.write(dat[tmp]);
+//            pc.printf("dat[%X] = %X\n", tmp, dat[tmp]);
+        }
+        cmd = CalcCRCLTC6803(dat, datnum);
+        spi.write(cmd);
+        cs = 1;
+        for(tmp = 0; tmp < datnum; tmp++){
+            pc.printf("get[%d] = %x\n", tmp, getdat[tmp]);
+        }
+        myled = !myled;
+    }
+}