BMS I/Fプログラム

Dependencies:   mbed

Committer:
NT32
Date:
Sun May 17 02:21:27 2015 +0000
Revision:
1:5690684e5460
Parent:
0:2d6ffd5a4d2e
Child:
2:c7ea42f45ff5
test version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NT32 0:2d6ffd5a4d2e 1 #include "mbed.h"
NT32 0:2d6ffd5a4d2e 2 #include "LTC6803.h"
NT32 0:2d6ffd5a4d2e 3
NT32 1:5690684e5460 4 DigitalOut myled(LED1);
NT32 1:5690684e5460 5 SPI spi(p11, p12, p13); // mosi, miso, sclk
NT32 1:5690684e5460 6 DigitalOut cs(p15);
NT32 0:2d6ffd5a4d2e 7
NT32 1:5690684e5460 8 Serial pc(USBTX, USBRX);
NT32 0:2d6ffd5a4d2e 9
NT32 0:2d6ffd5a4d2e 10 unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat);
NT32 0:2d6ffd5a4d2e 11
NT32 0:2d6ffd5a4d2e 12 static unsigned char crc8_table[256]; // 8-bit table for PEC calc
NT32 0:2d6ffd5a4d2e 13 static int made_table = 0; // table made flag
NT32 0:2d6ffd5a4d2e 14 unsigned char packet[18]={0}; // used for PEC calc
NT32 0:2d6ffd5a4d2e 15 unsigned char PECbyte; // PEC of a byte
NT32 0:2d6ffd5a4d2e 16 unsigned char PECpacket; // PEC of packet
NT32 0:2d6ffd5a4d2e 17 unsigned char PECpacketREAD; // value that PECpacket should be as read from 6803
NT32 0:2d6ffd5a4d2e 18
NT32 0:2d6ffd5a4d2e 19 static void init_crc8();
NT32 0:2d6ffd5a4d2e 20 void setPECbyte(unsigned char m);
NT32 0:2d6ffd5a4d2e 21 void setPECpacket(unsigned char np);
NT32 0:2d6ffd5a4d2e 22
NT32 0:2d6ffd5a4d2e 23 static void init_crc8() {
NT32 0:2d6ffd5a4d2e 24 int z,j;
NT32 0:2d6ffd5a4d2e 25 unsigned char cr;
NT32 0:2d6ffd5a4d2e 26 if (!made_table) {
NT32 0:2d6ffd5a4d2e 27 for (z = 0; z < 256; z ++) {
NT32 0:2d6ffd5a4d2e 28 cr = z;
NT32 0:2d6ffd5a4d2e 29 for (j = 0; j < 8; j ++) {
NT32 0:2d6ffd5a4d2e 30 cr = (cr << 1) ^ ((cr & 0x80) ? 0x07 : 0);
NT32 0:2d6ffd5a4d2e 31 }
NT32 0:2d6ffd5a4d2e 32 crc8_table[z] = cr & 0xFF;
NT32 0:2d6ffd5a4d2e 33 }
NT32 0:2d6ffd5a4d2e 34 made_table = 1;
NT32 0:2d6ffd5a4d2e 35 }
NT32 0:2d6ffd5a4d2e 36 }
NT32 0:2d6ffd5a4d2e 37
NT32 0:2d6ffd5a4d2e 38 void setPECbyte(unsigned char m) {
NT32 0:2d6ffd5a4d2e 39 PECbyte = 0x41; // initialize PECbyte
NT32 0:2d6ffd5a4d2e 40 if (!made_table) {
NT32 0:2d6ffd5a4d2e 41 init_crc8();
NT32 0:2d6ffd5a4d2e 42 }
NT32 0:2d6ffd5a4d2e 43 PECbyte = crc8_table[(PECbyte) ^ m];
NT32 0:2d6ffd5a4d2e 44 }
NT32 0:2d6ffd5a4d2e 45
NT32 0:2d6ffd5a4d2e 46 void setPECpacket(unsigned char np) { // np is number of bytes currently in packet[]
NT32 0:2d6ffd5a4d2e 47 int z;
NT32 0:2d6ffd5a4d2e 48 PECpacket = 0x41; // initialize PECpacket
NT32 0:2d6ffd5a4d2e 49 if (!made_table) {
NT32 0:2d6ffd5a4d2e 50 init_crc8();
NT32 0:2d6ffd5a4d2e 51 }
NT32 0:2d6ffd5a4d2e 52 for (z = 0; z < np; z ++) {
NT32 0:2d6ffd5a4d2e 53 PECpacket = crc8_table[(PECpacket) ^ packet[z]];
NT32 0:2d6ffd5a4d2e 54 }
NT32 0:2d6ffd5a4d2e 55 }
NT32 0:2d6ffd5a4d2e 56 unsigned char CalcCRCLTC6803(unsigned char * dat, unsigned char numdat){
NT32 0:2d6ffd5a4d2e 57 unsigned char pec;
NT32 0:2d6ffd5a4d2e 58 char loop, outerloop;
NT32 0:2d6ffd5a4d2e 59 datainput in;
NT32 0:2d6ffd5a4d2e 60 in.byte = 0;
NT32 0:2d6ffd5a4d2e 61 pec = CRCDEFAULT;
NT32 0:2d6ffd5a4d2e 62 for(outerloop = 0; outerloop < numdat; outerloop++){
NT32 0:2d6ffd5a4d2e 63 for(loop = 8; loop > 0; loop--){
NT32 0:2d6ffd5a4d2e 64 in.in.b0 = (dat[outerloop] >> (loop - 1)) ^ ((pec >> 7));
NT32 0:2d6ffd5a4d2e 65 in.in.b1 = in.in.b0 ^ (pec);
NT32 0:2d6ffd5a4d2e 66 in.in.b2 = in.in.b0 ^ (pec >> 1);
NT32 0:2d6ffd5a4d2e 67 pec = pec << 1;
NT32 0:2d6ffd5a4d2e 68 pec = (pec & 0xF8) | (in.byte & 0x07);
NT32 0:2d6ffd5a4d2e 69 }
NT32 0:2d6ffd5a4d2e 70 }
NT32 0:2d6ffd5a4d2e 71 return pec;
NT32 0:2d6ffd5a4d2e 72 }
NT32 0:2d6ffd5a4d2e 73
NT32 0:2d6ffd5a4d2e 74
NT32 0:2d6ffd5a4d2e 75
NT32 0:2d6ffd5a4d2e 76 int main() {
NT32 0:2d6ffd5a4d2e 77 unsigned char cmd, tmp, datnum;
NT32 0:2d6ffd5a4d2e 78 unsigned char dat[16], getdat[16];
NT32 1:5690684e5460 79 // float cellvol[4];
NT32 1:5690684e5460 80 int cellvol[4];
NT32 0:2d6ffd5a4d2e 81 char str[32];
NT32 0:2d6ffd5a4d2e 82 cs = 1;
NT32 0:2d6ffd5a4d2e 83 spi.format(8,3);
NT32 1:5690684e5460 84 spi.frequency(8000000);
NT32 0:2d6ffd5a4d2e 85 pc.baud(460800);
NT32 1:5690684e5460 86
NT32 1:5690684e5460 87 cs = 0;
NT32 0:2d6ffd5a4d2e 88 cmd = WRCFG;
NT32 0:2d6ffd5a4d2e 89 spi.write(cmd);
NT32 0:2d6ffd5a4d2e 90 spi.write(CalcCRCLTC6803(&cmd, 1));
NT32 0:2d6ffd5a4d2e 91 dat[0] = 0x02;
NT32 1:5690684e5460 92 dat[1] = 0x0f;
NT32 1:5690684e5460 93 dat[2] = 0x00;
NT32 0:2d6ffd5a4d2e 94 dat[3] = 0xff;
NT32 1:5690684e5460 95 dat[4] = 42;
NT32 1:5690684e5460 96 dat[5] = 255;
NT32 0:2d6ffd5a4d2e 97 for(int loop = 0;loop < 6; loop++){
NT32 1:5690684e5460 98 spi.write(dat[loop]);
NT32 0:2d6ffd5a4d2e 99 }
NT32 0:2d6ffd5a4d2e 100 cmd = CalcCRCLTC6803(dat, 6);
NT32 0:2d6ffd5a4d2e 101 spi.write(cmd);
NT32 1:5690684e5460 102 cs = 1;
NT32 1:5690684e5460 103 wait(0.001);
NT32 0:2d6ffd5a4d2e 104 while(1) {
NT32 0:2d6ffd5a4d2e 105 cs = 0;
NT32 1:5690684e5460 106 cmd = RDCVA;
NT32 0:2d6ffd5a4d2e 107 spi.write(cmd);
NT32 1:5690684e5460 108 spi.write(CalcCRCLTC6803(&cmd, 1));
NT32 1:5690684e5460 109 for(int loop = 0;loop < 6; loop++){
NT32 1:5690684e5460 110 getdat[loop] = spi.write(0);
NT32 0:2d6ffd5a4d2e 111 }
NT32 0:2d6ffd5a4d2e 112 cs = 1;
NT32 1:5690684e5460 113 wait(0.001);
NT32 1:5690684e5460 114 cs = 0;
NT32 1:5690684e5460 115 pc.printf("\033[2J");
NT32 1:5690684e5460 116 pc.printf("\033[%d;%dH" , 0, 0);
NT32 1:5690684e5460 117 cellvol[0] = (((getdat[1] & 0x0f) << 8) | getdat[0]);
NT32 1:5690684e5460 118 cellvol[1] = ((getdat[2] << 4) | ((getdat[1] & 0xf0) >> 4));
NT32 1:5690684e5460 119 cellvol[2] = (((getdat[4] & 0x0f) << 8) | getdat[3]);
NT32 1:5690684e5460 120 cellvol[3] = ((getdat[5] << 4) | ((getdat[4] & 0xf0) >> 4));
NT32 1:5690684e5460 121
NT32 1:5690684e5460 122 for(int loop = 0;loop < 4; loop++){
NT32 1:5690684e5460 123 pc.printf("Cell%d = %6d\n", loop, cellvol[loop]);
NT32 0:2d6ffd5a4d2e 124 }
NT32 1:5690684e5460 125
NT32 1:5690684e5460 126 cmd = STCVADALL;
NT32 1:5690684e5460 127
NT32 1:5690684e5460 128 spi.write(cmd);
NT32 1:5690684e5460 129 spi.write(CalcCRCLTC6803(&cmd, 1));
NT32 1:5690684e5460 130 cs = 1;
NT32 0:2d6ffd5a4d2e 131 myled = !myled;
NT32 1:5690684e5460 132 wait(0.4);
NT32 0:2d6ffd5a4d2e 133 }
NT32 0:2d6ffd5a4d2e 134 }