naoto tanaka
/
LTC6803_Eval
BMS I/Fプログラム
Diff: main.cpp
- Revision:
- 0:2d6ffd5a4d2e
- Child:
- 1:5690684e5460
diff -r 000000000000 -r 2d6ffd5a4d2e main.cpp --- /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; + } +}